<?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; Bash</title>
	<atom:link href="http://blog.gnusquad.org/category/developpement/langages/bash/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>
	</channel>
</rss>
