<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GNU Squad &#187; Debian GNU/Linux</title>
	<atom:link href="http://blog.gnusquad.org/category/debian-gnu-linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gnusquad.org</link>
	<description>Freedom computers</description>
	<lastBuildDate>Tue, 15 Jun 2010 06:04:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sondage de la communauté Debian</title>
		<link>http://blog.gnusquad.org/2010/06/15/sondage-de-la-communaute-debian/</link>
		<comments>http://blog.gnusquad.org/2010/06/15/sondage-de-la-communaute-debian/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 06:03:55 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=353</guid>
		<description><![CDATA[Suite à la préparation de la « mini debconf » qui s&#8217;est déroulée les 10 et 11 juin 2010 à Berlin, il a été décidé de proposer aux utilisateurs Debian, un petit sondage comportant différentes questions sur l&#8217;usage que vous faites de cet OS, de ses dérivés, sur votre avis concernant les cycles de publication, [...]]]></description>
			<content:encoded><![CDATA[<p>Suite à la préparation de la « <em>mini debconf</em> » qui s&#8217;est déroulée les 10 et 11 juin 2010 à Berlin, il a été décidé de proposer aux utilisateurs Debian, un petit sondage comportant différentes questions sur l&#8217;usage que vous faites de cet OS, de ses dérivés, sur votre avis concernant les cycles de publication, etc. Ça ne prend que deux minutes à remplir, je vous invite donc à remplir ce questionnaire et à le diffuser à la communauté. <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Lien : </p>
<ul>
<li><a href="https://spreadsheets.google.com/embeddedform?formkey=dDBMcWwtUmZBMXo1RFFHdG5jUEREb0E6MA">Sondage de la communauté Debian</a></li>
</ul>
<p><span id="more-353"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2010/06/15/sondage-de-la-communaute-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer une image ISO Debian avec les firmwares non libres</title>
		<link>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/</link>
		<comments>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 19:53:01 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=331</guid>
		<description><![CDATA[Les images ISO officielles de Debian, conformément aux DFSG, ne contiennent pas de firmwares non libres ce qui peut poser problème lorsque l&#8217;on a, par exemple, des serveurs équipés de carte réseaux Broadcom NetXtreme II utilisant le module « bnx2 » qui nécessite un firmware évidemment non libre. Dans ce genre de cas, l&#8217;installateur Debian [...]]]></description>
			<content:encoded><![CDATA[<p>Les images ISO officielles de Debian, conformément aux <abbr title="Debian Free Software Guidelines">DFSG</abbr>, ne contiennent pas de firmwares non libres ce qui peut poser problème lorsque l&#8217;on a, par exemple, des serveurs équipés de carte réseaux <em>Broadcom NetXtreme II</em> utilisant le module « <em>bnx2</em> » qui nécessite un firmware évidemment non libre. Dans ce genre de cas, l&#8217;installateur Debian demande de fournir ce dernier via une clé USB, c&#8217;est bien mais je souhaitais sauter cette étape, c&#8217;est pourquoi j&#8217;ai développé un petit script s&#8217;occupant d&#8217;intégrer directement dans l&#8217;image ISO les firmwares non libres disponibles dans la section « <em>non-free</em> ». Voici le script pour les intéressés :</p>
<pre>#!/bin/bash

#//////////////////////////////////////#
# Affiche l'aide du script             #
#                                      #
# @stdout Aide d'utilisation du script #
#//////////////////////////////////////#
usage(){
 echo "Usage : $0 &lt;architecture&gt; (i386, amd64)"
}

#/////////////////////////////////////////////////////////////#
# Teste si l'utilisateur est loggué en root ou non            #
#                                                             #
# @return Renvoie 0 si l'utilisateur est root sinon renvoie 1 #
#/////////////////////////////////////////////////////////////#
is_root(){
 if [[ $(id -u) -eq 0 ]]; then
 return 0 ;
 else
 return 1 ;
 fi
}

#///////////////////////////////////////////////////////////#
# Vérifie la présence des programmes utilisés par le script #
#                                                           #
# @return Renvoie 0 si tous les programmes sont présents    #
#///////////////////////////////////////////////////////////#
check_installed_software(){
    if [[ -z $(which ar) || -z $(which genisoimage) || -z $(which wget) || -z $(which tar) || -z $(which zcat) || -z $(which cpio) ]]; then
        return 1 ;
    else
        return 0 ;
    fi
}

#////////////////////////////////////////////////////////////////////////#
# Télécharge l'image ISO en version netinstall de l'architecture désirée #
#                                                                        #
# @param in $1 Architecture de l'ISO à télécharger                       #
# @stdout Nom du fichier de l'image ISO téléchargée                      #
#////////////////////////////////////////////////////////////////////////#
download_iso_netinstall(){
 local ISO=$(wget -q -O- http://cdimage.debian.org/debian-cd/current/$1/iso-cd/|sed -nr 's/.*(debian.+?netinst.iso).*/\1/p')
 [[ -z $ISO ]] &amp;&amp; {
 exit 1
 }
 wget "http://cdimage.debian.org/debian-cd/current/$1/iso-cd/$ISO" -O $ISO
 echo $ISO
}

#////////////////////////////////////////////////////////////////////#
# Extrait les fichiers d'une image ISO dans un répertoire temporaire #
#                                                                    #
# @param in $1 chemin de l'image ISO                                 #
# @stdout Chemin où se trouvent les fichiers extraits                #
#////////////////////////////////////////////////////////////////////#
function extract_files_from_iso(){
 local MOUNT_DIR=$(mktemp -d)
 local ISO_DIR=$(mktemp -du)
 mount -o loop $1 $MOUNT_DIR
 cp -a $MOUNT_DIR $ISO_DIR
 umount $MOUNT_DIR
 rmdir $MOUNT_DIR
 echo $ISO_DIR
}

#/////////////////////////////////////////////////////////////////////////////////////////////#
# Affiche le nom des paquets contenant les derniers firmwares non libres présents dans Debian #
#                                                                                             #
# @stdout Liste des paquets contenant les derniers firmwares non libres                       #
#/////////////////////////////////////////////////////////////////////////////////////////////#
list_firmware(){
 local FIRMWARE_DEB=$(wget -q -O- 'http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/?C=N;O=D;V=1;F=0' | sed -nr "s/^&lt;li&gt;&lt;a href=\"(.+?\.deb)\".*/\1/p")
 local FIRMWARE_NAME=$(echo "$FIRMWARE_DEB" | cut -f1 -d_ | uniq)
 local NAME
 for NAME in ${FIRMWARE_NAME[@]}; do
 echo "$FIRMWARE_DEB" | grep -m1 "$NAME"_
 done
}

#///////////////////////////////////////////////////////#
# Télécharge et extrait les paquets passés en paramètre #
#                                                       #
# @stdout Répertoire contenant les fichiers extraits    #
#///////////////////////////////////////////////////////#
download_and_extract_firmware(){
 local FIRMWARE_DIR=$(mktemp -d)
 cd $FIRMWARE_DIR

 while [[ $# -gt 0 ]]; do
 wget -q -O $1 "http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/$1"
 ar x $1 data.tar.gz
 tar xvf data.tar.gz './lib/firmware' &amp;&gt; /dev/null
 rm $1 data.tar.gz
 shift
 done

 cd $OLDPWD
 echo $FIRMWARE_DIR
}

#///////////////////////////////////////////////////#
# Intègre les firmwares dans les initrd trouvés     #
#                                                   #
# @param $1 Répertoire où se trouvent le(s) initrd  #
# @param $2 Répertoire où se trouvent les firmwares #
#///////////////////////////////////////////////////#
merge_firmware_initrd(){
 local INITRD
 for INITRD in $(find $1 -name initrd.gz); do
 local TMP_DIR=$(mktemp -d)
 cd $TMP_DIR
 zcat $INITRD | cpio -i &amp;&gt; /dev/null
 cp -a $2/lib/firmware .
 find . -print0 | cpio -0 -H newc -o 2&gt; /dev/null | gzip -c &gt; $INITRD
 cd $OLDPWD
 rm -rf $TMP_DIR
 done
}

#////////////////////////////////////////////////////////////////////////////#
# Mise à jour des sommes MD5                                                 #
#                                                                            #
# @param $1 Répertoire où se trouve le fichier de sommes MD5 à mettre à jour #
#////////////////////////////////////////////////////////////////////////////#
update_md5sum(){
 cd $1
 find . -type f ! -name md5sum.txt -exec md5sum {} \; &gt; md5sum.txt
 cd $OLDPWD
}

#/////////////////////////////////////////////////////////////////////////#
# Génère une image ISO à partir d'un répertoire                           #
#                                                                         #
# @param $1 Répertoire contenant les fichiers à intégrer dans l'image ISO #
# @param $2 Chemin vers le fichier à générer                              #
#/////////////////////////////////////////////////////////////////////////#
build_iso_image(){
 genisoimage -no-emul-boot -r -J -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat -o $2 $1 &amp;&gt; /dev/null
}

#///////////////////////#
# Vérifications de base #
#///////////////////////#
check_installed_software
[[ $? -eq 1 ]] &amp;&amp; {
    echo "Certains programmes nécessaires au fonctionnement du script n'ont pas été trouvés." &gt;&amp;2
    exit 1
}

[[ $# &lt; 1 ]] &amp;&amp; usage &amp;&amp; exit 1
ARCH=$1

! is_root &amp;&amp; {
 echo 'Ce script a besoin des droits root !' &gt;&amp;2
 exit 1
}

#///////////////////////////////#
# Téléchargement de l'image ISO #
#///////////////////////////////#
echo "Téléchargement de l'image ISO"
ISO=$(download_iso_netinstall $ARCH)
[[ $? -eq 1 ]] &amp;&amp; {
 echo "Erreur : l'image ISO netinstall de l'architecture « $ARCH » n'a pas été trouvée." &gt;&amp;2
 exit 1
}

#/////////////////////#
# On crée l'image ISO #
#/////////////////////#
echo "Extraction des fichiers de l'image ISO"
ISO_DIR=$(extract_files_from_iso $ISO)
echo "Téléchargement des firmwares"
FIRMWARE_DIR=$(download_and_extract_firmware $(list_firmware))
echo "Intégration des firmwares"
merge_firmware_initrd $ISO_DIR $FIRMWARE_DIR
echo "Création de l'image ISO finale"
update_md5sum $ISO_DIR
NEW_ISO=${ISO/./.homemade.}
build_iso_image $ISO_DIR $NEW_ISO
echo "Image ISO originale : $ISO"
echo " Nouvelle image ISO : $NEW_ISO"

#////////////////////////////////////////#
# On nettoie les répertoires temporaires #
#////////////////////////////////////////#
rm -rf $FIRMWARE_DIR $ISO_DIR</pre>
<p>Liens :</p>
<ul>
<li><a href='http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.sh'>Script à télécharger</a></li>
<li><a href="http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.ogv">Vidéo de l&#8217;exécution du script</a></li>
</ul>
<p><span id="more-331"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.ogv" length="6576519" type="video/ogg" />
		</item>
		<item>
		<title>Variables variables en Bash</title>
		<link>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/</link>
		<comments>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 19:29:00 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=308</guid>
		<description><![CDATA[Il peut parfois être pratique d&#8217;avoir des noms de variables qui soient variables. C&#8217;est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. En bash, il suffit de d&#8217;utiliser la construction « ${!variable} » pour déréférencer la variable ayant son nom contenu dans $variable. Voici un exemple d&#8217;utilisation concret :

#!/bin/bash

BACKUP_DAY=10
BACKUP_WEEK=4

LIST=( DAY WEEK )
for i [...]]]></description>
			<content:encoded><![CDATA[<p>Il peut parfois être pratique d&#8217;avoir des noms de variables qui soient variables. C&#8217;est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. En <em>bash</em>, il suffit de d&#8217;utiliser la construction « <em>${!variable}</em> » pour déréférencer la variable ayant son nom contenu dans <em>$variable</em>. Voici un exemple d&#8217;utilisation concret :</p>
<pre>
#!/bin/bash

BACKUP_DAY=10
BACKUP_WEEK=4

LIST=( DAY WEEK )
for i in ${LIST[@]}; do
    i="BACKUP_$i"
    echo "$i : ${!i}"
done
</pre>
<p>Affichera :</p>
<pre>
BACKUP_DAY : 10
BACKUP_WEEK : 4
</pre>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/bash/section-1/fr/">Man bash</a></li>
</ul>
<p><span id="more-308"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Équivalents de dirname &amp; basename en Bash</title>
		<link>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/</link>
		<comments>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 16:16:28 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=293</guid>
		<description><![CDATA[Les programmes dirname et basename sont très pratiques lors de l&#8217;écriture de scripts bash mais impliquent une exécution externe ce que les puristes aiment bien éviter. Voici, pour les intéressés, leurs équivalents en bash accompagnés d&#8217;une batterie de tests pour valider leur fonctionnement par rapport aux programmes de base :

#!/bin/bash

function basename(){
    echo [...]]]></description>
			<content:encoded><![CDATA[<p>Les programmes <em>dirname</em> et <em>basename</em> sont très pratiques lors de l&#8217;écriture de scripts <em>bash</em> mais impliquent une exécution externe ce que les puristes aiment bien éviter. Voici, pour les intéressés, leurs équivalents en <em>bash</em> accompagnés d&#8217;une batterie de tests pour valider leur fonctionnement par rapport aux programmes de base :</p>
<pre>
#!/bin/bash

function basename(){
    echo ${1##*/}
}

function dirname(){
    local file=$1
    case $file in
        /*) ;;
        ./*) ;;
        *) file=./$file ;;
    esac
    file=${file%/*}
    echo ${file:-/}
}

PROGS=( dirname basename )
LIST_FILES=( /test.txt /tmp/test.txt /tmp/plop/test.txt ./test.txt ./tmp/test.txt ./tmp/plop/test.txt test.txt )

for prog in ${PROGS[@]}; do
    echo "--&gt; $prog &lt;--"
    for file in ${LIST_FILES[@]}; do
        SYSTEM=$(bash -c "$prog $file")
        MINE=$($prog $file)
        [[ $SYSTEM != $MINE ]] &#038;&#038; echo -e "$file\nSystème : $SYSTEM\nLe mien : $MINE"
    done
done
</pre>
<p>Une petite comparaison rapide entre les deux solutions montre des performances supérieures de 75% en faveur de la solution <em>bash</em>. En pratique, la différence sera bien évidemment insignifiante sauf si vous vous amusez à itérer un grand nombre de fois sur ces fonctions. <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Note : les options <em>&#8211;help</em>, <em>&#8211;version</em> ainsi que le paramètre permettant d&#8217;indiquer un suffixe pour <em>basename</em> ne sont pas pris en compte.</p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/dirname/section-1/fr/">Man dirname</a></li>
<li><a href="http://man.gnusquad.org/basename/section-1/fr/">Man basename</a></li>
<li><a href="http://man.gnusquad.org/bash/section-1/fr/">Man bash</a></li>
</ul>
<p><span id="more-293"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visualisez la hiérarchie de vos inclusions PHP avec « Inclued »</title>
		<link>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/</link>
		<comments>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 19:58:14 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=152</guid>
		<description><![CDATA[L&#8217;extension PECL « Inclued » permet de tracer et d&#8217;enregistrer sous forme hiérarchique, l&#8217;ensemble des inclusions de fichiers durant l&#8217;exécution d&#8217;un script PHP.
Prenons pour exemple le monstrueux WordPress, voici ce que l&#8217;on peut obtenir :

Mis à part le fait que ce genre de graphe est toujours sympa à voir, il permet de se faire une [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;extension <abbr title="PHP Extension Community Library">PECL</abbr> « <em>Inclued</em> » permet de tracer et d&#8217;enregistrer sous forme hiérarchique, l&#8217;ensemble des inclusions de fichiers durant l&#8217;exécution d&#8217;un script PHP.</p>
<p>Prenons pour exemple le monstrueux WordPress, voici ce que l&#8217;on peut obtenir :</p>
<p><a href="http://img527.imageshack.us/img527/4869/inclued185541.png"><img src="http://blog.gnusquad.org/wp-content/uploads/2009/03/wordpress-inclued-tiny1.png" alt="WordPress Inclued" title="WordPress Inclued" width="218" height="160" class="alignnone size-full wp-image-177" /></a></p>
<p>Mis à part le fait que ce genre de graphe est toujours sympa à voir, il permet de se faire une idée sur la qualité d&#8217;un code :</p>
<ul>
<li>Pourquoi ce fichier est inclut alors qu&#8217;il n&#8217;est pas utilisé ?</li>
<li>Pourquoi ce fichier est inclut ici plutôt que là ?</li>
<li>Pourquoi ce fichier n&#8217;est pas inclus en utilisant les primitives *_once ?</li>
<li>Pourquoi les inclusions proviennent uniquement de ce fichier ?</li>
<li>etc.</li>
</ul>
<p>Passons au vif du sujet ! Pour commencer nous allons installer les paquets nécessaires pour la suite des opérations :</p>
<ul>
<li><em>php5-dev</em> et <em>make</em> pour la compilation de l&#8217;extension</li>
<li><em>php5-cli</em> et <em>graphviz</em> pour la génération des images</li>
</ul>
<pre>
<strong>root@gnusquad</strong>:~# aptitude install php5-dev php5-cli make graphviz
</pre>
<p>Une fois ces paquets installés, téléchargeons l&#8217;extension « <em>Inclued</em> » et décompressons la d&#8217;un trait :</p>
<pre>
<strong>root@gnusquad</strong>:~# wget -q -O - http://pecl.php.net/get/inclued | tar zx
</pre>
<p>Compilons cette dernière :</p>
<pre>
<strong>root@gnusquad</strong>:~# cd inclued-0.1.0
<strong>root@gnusquad</strong>:~/inclued-0.1.0# phpize
<strong>root@gnusquad</strong>:~/inclued-0.1.0# ./configure
<strong>root@gnusquad</strong>:~/inclued-0.1.0# make
</pre>
<p>L&#8217;étape qui suit consiste à indiquer à PHP de charger cette nouvelle extension :</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cp modules/inclued.so /usr/lib/php5/20060613+lfs
<strong>root@gnusquad</strong>:~/inclued-0.1.0# vi /etc/php5/conf.d/inclued.ini

extension=inclued.so
inclued.enabled=on
inclued.dumpdir=/tmp
</pre>
<p>On peut dès lors redémarrer le serveur web, <em>Apache</em> en l&#8217;occurence, sachant que désormais, chaque accès à un fichier PHP (via le web ou en CLI) générera un fichier dans le répertoire <em>/tmp</em> donc méfiance !</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# /etc/init.d/apache2 restart
</pre>
<p>Sachez qu&#8217;il est également possible d&#8217;activer l&#8217;extension au niveau du serveur web en utilisant les directives <em>php_admin_flag</em> et <em>php_admin_value</em> ce qui permet de limiter l&#8217;extension à un vhost par exemple. Malheureusement, et contrairement à ce qui est indiqué sur le site PHP, il n&#8217;est pas possible d&#8217;utiliser ces directives dans un fichier <em>.htaccess</em>.</p>
<p>Les fichiers générés n&#8217;étant pas directement des images, il faut les convertir à l&#8217;aide d&#8217;un script fourni avec l&#8217;extension que nous enroberons de notre propre script afin de nous faciliter la vie :</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cp gengraph.php /usr/local/bin
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cd $_
<strong>root@gnusquad</strong>:/usr/local/bin# vi gengraph

#!/bin/bash
echo "Generating file $1.png"
exec >/dev/null
php -d "inclued.enabled=Off" $(dirname $0)/gengraph.php -i $1 -o $1.dot
dot -Tpng -o $1.png $1.dot
rm $1
rm $1.dot

<strong>root@gnusquad</strong>:/usr/local/bin# chmod +x $_
</pre>
<p>Voilà, le plus dur est fait, il ne vous reste plus qu&#8217;à aller sur une page web PHP et à générer l&#8217;image :</p>
<pre>
<strong>root@gnusquad</strong>:/usr/local/bin# cd /tmp
<strong>root@gnusquad</strong>:/tmp# ls
inclued.00688.1
<strong>root@gnusquad</strong>:/tmp# gengraph inclued.00688.1
<strong>root@gnusquad</strong>:/tmp# ls
inclued.00688.1.png
</pre>
<p>À lire :</p>
<ul>
<li><a href="http://fr.php.net/manual/en/book.inclued.php">Documentation PHP sur Inclued</a></li>
<li><a href="http://pecl.php.net/package/inclued">Package Inclued sur la PECL</a></li>
</ul>
<p>Mise à jour du 05 mai 2009 : pour effectuer la compilation encore plus simplement, il suffit de taper « <em>pecl install channel://pecl.php.net/inclued-0.1.0</em> » et le tour est joué ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-152"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problème d&#8217;accès à l&#8217;IP publique d&#8217;une Freebox à travers le NAT</title>
		<link>http://blog.gnusquad.org/2009/02/23/probleme-d-acces-a-l-ip-publique-dune-freebox-a-travers-le-nat/</link>
		<comments>http://blog.gnusquad.org/2009/02/23/probleme-d-acces-a-l-ip-publique-dune-freebox-a-travers-le-nat/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 06:20:24 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=97</guid>
		<description><![CDATA[Voici un état des lieux : je dispose d&#8217;une Freebox v4, j&#8217;ai activé le NAT et le DHCP (adresses IP fixées par adresse MAC) pour mes PC. Il y en a un qui est entièrement accessible depuis internet grâce à l&#8217;option « IP DMZ » présente dans la console d&#8217;administration de la Freebox qui redirige [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un état des lieux : je dispose d&#8217;une Freebox v4, j&#8217;ai activé le NAT et le DHCP (adresses IP fixées par adresse MAC) pour mes PC. Il y en a un qui est entièrement accessible depuis internet grâce à l&#8217;option « IP DMZ » présente dans la console d&#8217;administration de la Freebox qui redirige toutes les connexions entrantes non encore établies en provenance d&#8217;internet vers l&#8217;adresse IP désignée, dans mon cas 192.168.0.1. Mon adresse IP publique est associée au domaine <em>gnusquad.org</em> donc tout le traffic à destination de ce domaine part sur le PC ayant l&#8217;IP 192.168.0.1.</p>
<p>Voici un schéma afin d&#8217;être plus clair :<br />
<img src="http://blog.gnusquad.org/wp-content/uploads/2009/02/graph1.png" alt="Graphique Freebox" title="Graphique Freebox" width="469" height="296" class="alignnone size-full wp-image-130" /></p>
<p>Le problème est qu&#8217;il est impossible depuis le PC ayant l&#8217;IP 192.168.0.2 d&#8217;accéder, par exemple, à mon blog (<a href="blog.gnusquad.org">http://blog.gnusquad.org</a>), la résolution DNS renvoyant mon adresse IP publique et la Freebox ne redirigeant le traffic « IP DMZ » que depuis le WAN et non le LAN !</p>
<p>Ma solution initiale était d&#8217;ajouter sur le PC ayant l&#8217;IP 192.168.0.2, une entrée dans le fichier « <em>/etc/hosts</em> » qui pour rappel, permet de fixer une adresse IP pour une liste de domaines et de sous-domaines :</p>
<pre><strong>root@gnusquad</strong>:~# vi /etc/hosts

192.168.0.1 gnusquad.org www.gnusquad.org blog.gnusquad.org man.gnusquad.org
...</pre>
<p>Cette solution a le mérite d&#8217;être simple et rapide à mettre en œuvre mais a comme désavantage le fait de devoir tenir à jour cette entrée par rapport à la liste grandissante des sous-domaines hébergés sur la même machine.</p>
<p>Il était donc temps de trouver une solution plus confortable, c&#8217;est pourquoi j&#8217;ai décidé d&#8217;installer un proxy DNS, en l&#8217;occurence <em>pdnsd</em> qui me permettrait de modifier les enregistrements DNS à ma guise.</p>
<pre><strong>root@gnusquad</strong>:~# aptitude install pdnsd</pre>
<p>L&#8217;installation vous demandera si vous préférez utiliser les DNS fournis par le programme <em>resolvconf</em>, les DNS des serveurs racines ou bien encore si vous préférez les indiquer manuellement.<br />
Utilisant <em>resolvconf</em>, ce que je vous conseille au passage, j&#8217;ai choisi cette option ce qui aura pour conséquence, au lancement de <em>pdnsd</em> de mettre l&#8217;IP 127.0.0.1 dans le fichier <em>/etc/resolv.conf</em> à la place des DNS de votre FAI, ces derniers étant utilisés par le proxy pour la résolution de noms.</p>
<p>Il faut ensuite, désactiver la génération automatique du fichier de configuration du proxy en commentant la ligne <em>AUTO_MODE</em> du fichier <em>/etc/default/pdnsd.conf</em> . Vous pouvez également spécifiez des options de démarrage via la variable <em>START_OPTIONS</em> ce qui peut être utile pour activer le mode debug (option<em> &#8211;debug</em>). Voici ce que ça donne une fois le fichier modifié :</p>
<pre><strong>root@gnusquad</strong>:~# cat /etc/default/pdnsd.conf

# do we start pdnsd ?
START_DAEMON=yes
# auto-mode, overrides /etc/pdsnd.conf if set [see /usr/share/pdnsd/]
#AUTO_MODE=resolvconf
# optional CLI options to pass to pdnsd(8)
START_OPTIONS="--debug"</pre>
<p>Maintenant il ne reste plus qu&#8217;à configurer le proxy DNS pour renvoyer l&#8217;IP 192.168.0.2 pour toutes demandes de résolution de noms portant sur le domaine <em>gnusquad.org</em> ce qui se fait aisément une fois après avoir lu la man page du fichier <em>pdnsd.conf</em> :</p>
<pre><strong>root@gnusquad</strong>:~# vi /etc/pdnsd.conf

...
rr {
    name=gnusquad.org;
    ns=localhost;
    reverse=on;
    a=192.168.0.1;
}
rr {
    name=*.gnusquad.org;
    a=192.168.0.1;
}
...</pre>
<p>Il ne reste plus qu&#8217;à redémarrer le proxy DNS pour que les changements soient pris en compte :</p>
<pre><strong>root@gnusquad</strong>:~# /etc/init.d/pdnsd restart
Stopping pdnsd.
Starting pdnsd.
</pre>
<p>Pour terminer, sachez que <em>pdnsd</em> fait également office de cache DNS pour accélérer les résolutions de noms, ce cache se trouve dans le fichier <em>/var/cache/pdnsd/pdnsd.cache</em> que vous pouvez supprimer sans souci si vous rencontrez quelques problèmes durant vos tests. Quant aux logs, ceux-ci se trouvent dans le fichier <em>/var/cache/pdnsd/pdnsd.debug</em>.</p>
<p>À lire :</p>
<ul>
<li><a href="http://fr.wikipedia.org/wiki/R%C3%A9solution_de_noms">Résolution de noms</a></li>
<li><a href="http://man.gnusquad.org/pdnsd/section-8/en/">Man pdnsd</a></li>
<li><a href="http://man.gnusquad.org/pdnsd.conf/section-5/en/">Man pdnsd.conf</a></li>
<li><a href="http://man.gnusquad.org/resolvconf/section-8/en/">Man resolvconf</a></li>
</ul>
<p><span id="more-97"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/02/23/probleme-d-acces-a-l-ip-publique-dune-freebox-a-travers-le-nat/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mettre en surbrillance un élément dans un Shell</title>
		<link>http://blog.gnusquad.org/2009/02/06/mettre-en-surbrillance-un-element-dans-un-shell/</link>
		<comments>http://blog.gnusquad.org/2009/02/06/mettre-en-surbrillance-un-element-dans-un-shell/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 22:41:59 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=70</guid>
		<description><![CDATA[Ne vous est-il jamais arrivé d&#8217;avoir eu besoin de mettre en surbrillance un élément dans un shell suite à un « cat », un « tail », etc tout en conservant le contexte ?
Si la réponse est « oui », voici deux solutions du même acabit permettant de parvenir à vos fins :
1ère solution utilisant [...]]]></description>
			<content:encoded><![CDATA[<p>Ne vous est-il jamais arrivé d&#8217;avoir eu besoin de mettre en surbrillance un élément dans un shell suite à un « <em>cat</em> », un « <em>tail</em> », etc tout en conservant le contexte ?</p>
<p>Si la réponse est « oui », voici deux solutions du même acabit permettant de parvenir à vos fins :</p>
<h3>1ère solution utilisant Perl</h3>
<p>Nous allons définir une fonction <em>bash</em> nommée « <em>hl</em> » (pour highlight) prenant en paramètre une expression rationnelle compatible <em>Perl</em> (une « <em>PCRE</em> ») capturant l&#8217;élément à mettre en surbrillance :</p>
<pre>
<em>user@gnusquad</em>:~$ function hl(){ perl -pe "s/($1)/\e[1;42m\$1\e[0m/g" ; }
</pre>
<p>Voici quelques exemples d'utilisation :</p>
<pre>
<em>user@gnusquad</em>:~$ echo "GNU Squad" | hl GNU
<em>GNU</em> Squad

<em>user@gnusquad</em>:~$ echo "GNU Squad" | hl S.+d
GNU <em>Squad</em>

<strong>root@gnusquad</strong>:~# tail -f /var/log/apache2/access.log | hl 192.168.[0-9]+.[0-9]+
<em>192.168.0.3</em> - - [06/Feb/2009:22:51:18 +0100] "GET / HTTP/1.1" 304 - "http://blog.gnusquad.org/" ""
</pre>
<p>Je vous invite à lire le billet « <a href="http://blog.gnusquad.org/2008/11/22/mettez-de-la-couleur-dans-votre-prompt/">Mettez de la couleur dans votre prompt</a> » si vous souhaitez changer la couleur de surbrillance.</p>
<h3>2ème solution utilisant grep</h3>
<p>Même principe que précédemment : nous allons définir une fonction <em>bash</em> nommée « <em>hl</em> » prenant en paramètre une expression rationnelle compatible <em>POSIX</em> capturant l&#8217;élément à mettre en surbrillance :</p>
<pre>
<em>user@gnusquad</em>:~$ function hl(){ grep --color -C1000000 -E $1 ; }
</pre>
<p>Le résultat étant le même que la solution précédente, pas besoin de nouveaux exemples.</p>
<p>Notez cependant que cette solution est moins propre que la première à cause de l&#8217;option <em>-C</em> qui utilise un nombre magique (en fait celui-ci correspond au nombre de lignes à afficher avant et après le motif trouvé) mais est en contrepartie plus facile à lire&hellip;</p>
<p>Il ne vous reste plus qu&#8217;à mettre cette fonction dans votre fichier <em>~/.bashrc</em> et le tour est joué ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/perl/section-1/en/">Man page de Perl</a></li>
<li><a href="http://man.gnusquad.org/grep/section-1/fr/">Man page de grep</a></li>
</ul>
<p><span id="more-70"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/02/06/mettre-en-surbrillance-un-element-dans-un-shell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Faites taire votre PC Speaker !</title>
		<link>http://blog.gnusquad.org/2009/02/05/faites-taire-votre-pc-speaker/</link>
		<comments>http://blog.gnusquad.org/2009/02/05/faites-taire-votre-pc-speaker/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 13:20:57 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[X Window System]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=42</guid>
		<description><![CDATA[Quoi de plus énervant que de se faire agresser par le PC Speaker lors d&#8217;une erreur, d&#8217;une completion automatique dans bash ou que sais-je encore ? Je vais vous présenter plusieurs solutions pour le faire taire à jamais :

Empêcher le module noyau dédié au PC Speaker de se charger :


root@gnusquad:~# echo "install pcspkr /bin/true" > [...]]]></description>
			<content:encoded><![CDATA[<p>Quoi de plus énervant que de se faire agresser par le PC Speaker lors d&#8217;une erreur, d&#8217;une completion automatique dans bash ou que sais-je encore ? Je vais vous présenter plusieurs solutions pour le faire taire à jamais :</p>
<ul>
<li>Empêcher le module noyau dédié au PC Speaker de se charger :</li>
</ul>
<pre>
<strong>root@gnusquad</strong>:~# echo "install pcspkr /bin/true" > /etc/modprobe.d/pcspkr
</pre>
<p>Il est également possible d&#8217;ignorer le chargement du module mais la première méthode est la méthode conseillée en cas de module récalcitrant : </p>
<pre>
<strong>root@gnusquad</strong>:~# echo "blacklist pcspkr" > /etc/modprobe.d/pcspkr
</pre>
<p>Il se peut que le module à désactiver ne soit pas « <em>pcspkr</em> » mais « <em>snd_pcsp</em> », à vous de tester avec « <em>rmmod xxx</em> » qui déchargera le module en live. </p>
<ul>
<li>Désactiver les beeps sous X11 :</li>
</ul>
<pre>
<em>user@gnusquad</em>:~$ xset b off
</pre>
<p>Vous pouvez également ajouter cette commande dans votre fichier « <em>~/.xinitrc</em> » pour qu&#8217;elle soit lancée automatiquement au démarrage de X11. </p>
<ul>
<li>Désactiver les beeps sous une console tty</li>
</ul>
<pre>
<em>user@gnusquad</em>:~$ setterm -blength 0
</pre>
<p>Vous pouvez également ajouter cette commande dans votre fichier « <em>~/.bashrc</em> » pour qu&#8217;elle soit lancée automatiquement lorsque vous vous authentifiez. </p>
<ul>
<li>Désactiver les beeps pour les programmes utilisant la bibliothèque « <em>readline</em> » :</li>
</ul>
<pre>
<em>user@gnusquad</em>:~$ echo "set bell-style none" >> ~/.inputrc
</pre>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/modprobe.conf/section-5/en/">Man page de modprobe.conf</a></li>
<li><a href="http://man.gnusquad.org/xset/section-1/en/">Man page de xset</a></li>
<li><a href="http://man.gnusquad.org/setterm/section-1/fr/">Man page de setterm</a></li>
<li><a href="http://man.gnusquad.org/readline/section-3/en/">Man page de readline</a></li>
</ul>
<p><span id="more-42"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/02/05/faites-taire-votre-pc-speaker/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Forcer la vérification des partitions au démarrage</title>
		<link>http://blog.gnusquad.org/2008/12/19/forcer-la-verification-des-partitions-au-demarrage/</link>
		<comments>http://blog.gnusquad.org/2008/12/19/forcer-la-verification-des-partitions-au-demarrage/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 11:27:59 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=39</guid>
		<description><![CDATA[Si vous souhaitez forcer la vérification des partitions (le fameux « fsck »)  au prochain démarrage de votre Debian, rien de plus simple, il suffit de créer le fichier « forcefsck » à la racine :
root@gnusquad:~# &#62; /forcefsck
Celui-ci sera automatiquement supprimé une fois la vérification effectuée.
L&#8217;inverse est également possible en créant le fichier « [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous souhaitez forcer la vérification des partitions (le fameux « <em>fsck</em> »)  au prochain démarrage de votre Debian, rien de plus simple, il suffit de créer le fichier « <em>forcefsck</em> » à la racine :</p>
<pre><strong>root@gnusquad</strong>:~# &gt; /forcefsck</pre>
<p>Celui-ci sera automatiquement supprimé une fois la vérification effectuée.</p>
<p>L&#8217;inverse est également possible en créant le fichier « <em>fastboot</em> » à la racine :</p>
<pre><strong>root@gnusquad</strong>:~# &gt; /fastboot</pre>
<p>Notez au passage, que la commande « <em>shutdown</em> » peut également faire ce travail en lui passant les paramètres « <em>-F</em> » pour forcer la vérification au démarrage et « <em>-f</em> » pour avoir un démarrage rapide, sans « <em>fsck</em> ».</p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/shutdown/section-8/en/">Man page de shutdown</a></li>
<li><a href="http://man.gnusquad.org/?q=fsck">Man pages des *fsck</a></li>
</ul>
<p><span id="more-39"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/12/19/forcer-la-verification-des-partitions-au-demarrage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limiter le temps d&#8217;exécution d&#8217;une requête MySQL</title>
		<link>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/</link>
		<comments>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 12:03:54 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Base de données]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Gestionnaires de versions]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=38</guid>
		<description><![CDATA[Vous est-il déjà arrivé de voir un de vos serveurs de base de données MySQL mis à genoux par la faute de développeurs incompétents qui effectuent des requêtes sur des tables sans index composées de dizaines de millions de tuples ?
Si la réponse est oui, voici ma solution « one line » pour les calmer [...]]]></description>
			<content:encoded><![CDATA[<p>Vous est-il déjà arrivé de voir un de vos serveurs de base de données MySQL mis à genoux par la faute de développeurs incompétents qui effectuent des requêtes sur des tables sans index composées de dizaines de millions de tuples ?<br />
Si la réponse est oui, voici ma solution « <em>one line</em> » pour les calmer un peu ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Logiciels utilisés :</p>
<ul>
<li>GNU Awk 3.1.5</li>
<li>MySQL Client 5.0.51a</li>
</ul>
<pre>
<strong>root@gnusquad</strong>:~# mysql -e 'SHOW PROCESSLIST' | awk 'BEGIN { MAX_TIME = 60 ; USERS = "boulet1|boulet2" } $6 &gt; MAX_TIME &amp;&amp; $5 == "Query" &amp;&amp; $2 ~ USERS {print "KILL " $1 ";"}' | mysql
</pre>
<p>Petites explications sur le code « awk » :</p>
<ul>
<li>$1 contient l&#8217;ID de la requête SQL</li>
<li>$2 contient le nom de l&#8217;utilisateur</li>
<li>$5 contient le type de commande (Query, Sleep, …)</li>
<li>$6 contient le temps d&#8217;exécution de la requête SQL en secondes</li>
<li>MAX_TIME contient le temps en secondes à partir duquel une requête doit être tuée</li>
<li>USERS contient une expression rationnelle indiquant les utilisateurs concernés par cette sanction</li>
</ul>
<p>Il ne vous reste plus qu&#8217;à mettre ce script dans le « <em>crontab</em> » en pensant à vous connecter avec un utilisateur MySQL ayant le droit « <em>SUPER</em> » pour pouvoir tuer les connexions si besoin est. <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/gawk/section-1/en/">Man page de gawk</a></li>
</ul>
<p><span id="more-38"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

