<?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; Système</title>
	<atom:link href="http://blog.gnusquad.org/category/debian-gnu-linux/systeme/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>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>
		<item>
		<title>Mettez de la couleur dans votre « prompt » !</title>
		<link>http://blog.gnusquad.org/2008/11/22/mettez-de-la-couleur-dans-votre-prompt/</link>
		<comments>http://blog.gnusquad.org/2008/11/22/mettez-de-la-couleur-dans-votre-prompt/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 16:26:01 +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=37</guid>
		<description><![CDATA[Le « prompt », que l&#8217;on désigne par « invite de commande » en français est une chaîne de caractères indiquant que l&#8217;ordinateur est prêt à recevoir une saisie au clavier.
Les informations qui suivent concernent le shell livré par défaut avec la plupart des distributions, le bien nommé « Bash ».
Le « prompt » est [...]]]></description>
			<content:encoded><![CDATA[<p>Le « prompt », que l&#8217;on désigne par « invite de commande » en français est une chaîne de caractères indiquant que l&#8217;ordinateur est prêt à recevoir une saisie au clavier.</p>
<p>Les informations qui suivent concernent le shell livré par défaut avec la plupart des distributions, le bien nommé « Bash ».</p>
<p>Le « prompt » est défini dans une variable d&#8217;environnement nommée « PS1 », celle-ci peut contenir des données statiques mais également des « séquences d&#8217;échappement » spéciales permettant d&#8217;afficher des données dynamiques comme le nom d&#8217;utilisateur courant, le répertoire courant, etc. Il est également possible de mettre de la couleur afin d&#8217;égayer un peu votre terminal et surtout de vous retrouvez dans vos différents comptes utilisateurs ou dans vos différentes machines.</p>
<p>Voici la liste des séquences d&#8217;échappement intéressantes :</p>
<pre>\h : le nom de la machine (hostname) jusqu'au premier point
\H : le nom de la machine complet
\j : le nombre de processus fils lancés en arrière plan
\e : caractère d'échappement (utile pour les couleurs)
\n : nouvelle ligne
\r : retour chariot
\u : le nom d'utilisateur courant
\w : le chemin complet du répertoire de travail courant
\W : le répertoire de travail courant
\$ : affiche un # si l'utilisateur est root sinon affiche un $
\[ : début d'une séquence de caractères non imprimables
\] : fin d'une séquence de caractères non imprimables
\D{format} : la date selon le format passé en paramètre (cf. la syntaxe de « strftime »)</pre>
<p>Les couleurs quant à elles sont des « séquences d&#8217;échappement ANSI » entourées d&#8217;un début et d&#8217;une fin de séquence de caractères non imprimables. Ces séquences ont un format bien déterminé : celui-ci commence par « <em>ESC[</em> » et se termine par « <em>m</em> ». Entre ces deux parties, il faut indiquer un code de mise en forme (gras, souligné, clignotement, etc) ainsi qu'un code pour la couleur désirée, les deux champs étant séparés par un point-virgule.</p>
<p>Voici la liste des mises en forme les plus courantes :</p>
<pre> 0 : normal
 1 : gras
 4 : souligné
 5 : clignotement
 7 : négatif
22 : désactivation du gras
24 : désactivation du souligné
25 : désactivation du clignotement</pre>
<p>Et la liste des couleurs :</p>
<pre>0 : noir
1 : rouge
2 : vert
3 : jaune
4 : bleu
5 : magenta
6 : cyan
7 : blanc</pre>
<p>À ces dernières doit être additionné un nombre afin de définir si l'on veut modifier la couleur du fond ou du texte tout en réglant l'intensité :</p>
<pre> 30 : couleur du texte, intensité normale
 40 : couleur du fond, intensité normale
 90 : couleur du texte, intensité élevée
100 : couleur du fond, intensité élevée</pre>
<p>Pour voir votre PS1 actuel, tapez simplement dans un shell :</p>
<pre><em>user@gnusquad</em>:~$ echo $PS1
\[\e[1;42m\]\u@\H\[\e[0;40m\]:\w\$</pre>
<p>Décortiquons cette ligne :</p>
<pre>\[   : début d'une séquence de caractères non imprimables (pour la couleur)
\e[  : début d'une séquence ANSI
1;42 : mise en forme grasse avec une couleur de fond verte intensité normale
m    : fin d'une séquence ANSI
\]   : fin d’une séquence de caractères non imprimables
\u   : nom d'utilisateur courant
@    : signe @
\H   : nom de la machine complète
\[   : début d'une séquence de caractères non imprimables
\e[  : début d'une séquence ANSI
0;40 : mise en forme normale avec une couleur de fond noir intensité normale
m    : fin d'une séquence ANSI
\]   : fin d’une séquence de caractères non imprimables
:    : signe :
\w   : chemin complet du répertoire de travail courant
\$   : caractère # si l'utilisateur est root sinon caractère $</pre>
<p>Pour tester vos créations (ici un fond rouge qui peut être pratique pour l'utilisateur « root »), il vous suffira de taper dans un shell :</p>
<pre><em>user@gnusquad</em>:~$ PS1='\[\e[1;41m\]\u@\H\[\e[0;40m\]:\w\$'
<strong>user@gnusquad</strong>:~$</pre>
<p>Une fois satisfait de votre « PS1 », vous n'aurez plus qu'à le mettre dans le fichier « <em>/etc/bash.bashrc</em> » (pour tous les utilisateurs) ou dans votre fichier «<em> ~/.bashrc</em> » (pour vous uniquement).</p>
<p>Notez au passage qu'il existe aussi trois autres variables d'environnement « PS2 », « PS3 » et « PS4 » que je vous laisse découvrir dans le man de bash ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>N'hésitez pas à proposer vos « prompt » en commentaires ! <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/bash/section-1/en/">Man page de Bash</a></li>
<li><a href="http://en.wikipedia.org/wiki/Escape_sequence">Séquence d'échappement</a></li>
<li><a href="http://man.gnusquad.org/strftime/section-3/en/">Man page de la fonction strftime</a></li>
<li><a href="http://en.wikipedia.org/wiki/ANSI_escape_code">Séquences d'échappement ANSI</a></li>
</ul>
<p><span id="more-37"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/11/22/mettez-de-la-couleur-dans-votre-prompt/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
