Table des matières
Il est parfois intéressant de disposer d'une version d'un programme non encore intégré dans une distribution Debian. Et d'ailleurs si j'ai créé cette doc c'était justement pour profiter de la dernière version de lighttp qui comblait des failles de sécurité des versions précédentes ... et un peu pour le fun ;)
lighttpd 1.4.20 - Otherwise the terrorists win ( 1.4.19_fix_ssl_dos.patch, 1.4.x_rewrite_redirect_decode_url.patch, 1.4.x_userdir_lowercase.patch, 1.4.x_request_header_memleak.patch)
Debian nous facilite grandement les choses pour effectuer cette tache, pour cela nous devons installer quelques packages :
apt-get install build-essential autotools-dev lintian dh-make
Première étape, télécharger les sources du programme à packager :
mkdir tmp cd tmp wget http://www.lighttpd.net/download/lighttpd-1.4.20.tar.gz tar xvzf lighttpd-1.4.20.tar.gz cd lighttpd-1.4.20
dh_make va se charger de générer les fichiers nécessaires à la Debianisation du programme :
dh_make -e dab@free.fr -f ../lighttpd-1.4.20.tar.gz Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] s Maintainer name : unknown Email-Address : dab@free.fr Date : Thu, 23 Oct 2008 14:44:37 +0000 Package Name : lighttpd Version : 1.4.20 License : blank Type of Package : Single Hit <enter> to confirm: Done. Please edit the files in the debian/ subdirectory now. lighttpd uses a configure script, so you probably don't have to edit the Makefiles.
Le répertoire '
debian
' a été créé, il contient
les modèles de fichiers qui seront utilisés lors de la création du
package. Notez que les fichiers avec une extension 'ex' sont des
exemples.
find debian/ debian/ debian/dirs debian/control debian/manpage.sgml.ex debian/prerm.ex debian/compat debian/cron.d.ex debian/menu.ex debian/rules debian/changelog debian/init.d.ex debian/emacsen-remove.ex debian/postrm.ex debian/manpage.1.ex debian/preinst.ex debian/lighttpd.doc-base.EX debian/emacsen-startup.ex debian/watch.ex debian/docs debian/copyright debian/emacsen-install.ex debian/lighttpd-default.ex debian/postinst.ex debian/manpage.xml.ex debian/README.Debian
Détaillons les plus importants de ceux-ci.
debian/control
: Ce fichier contient les
métadonnées relatives au paquet que nous allons construire. On remarque
que
dh_make
a déjà renseigné les champs qu'il a pu
déduire.
Source: lighttpd
Section: unknown
Priority: extra
Maintainer: unknown <dab@free.fr>
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.7.2
Package: lighttpd
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
Section : Debian est divisé en trois catégories : main / contrib / non-free , chaque catégorie est elle même divisée en section base / devel / doc / web ... Dans le cas de notre serveur http se sera donc main/web or main est implicite, ce sera donc ' web '.
Priority : La Charte Debian décrit ce champ, pour notre paquet personnalisé nous utiliserons 'optionnal' et dans ce cas il est considéré comme n'entrant en conflit avec aucun autre paquet. Dans le cas contraire il existe les priorités suivantes : required, important, standard, extra http://www.debian.org/doc/debian-policy/ch-archive.html#s-sections
Build-Depends : Il s'agit des dépendances nécessaire à la construction du paquet. Pour rechercher ces dépendances nous pouvons utiliser le script suivant :
strace -f -o /tmp/log ./configure # ou make à la place de ./configure, si votre paquet n'utilise pas autoconf for x in `dpkg -S $(grep open /tmp/log|\ perl -pe 's!.* open\(\"([^\"]*).*!$1!' |\ grep "^/"| sort | uniq|\ grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|\ cut -f1 -d":"| sort | uniq`; \ do \ echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; \ done
qui nous retourne :
binutils (>= 2.17-3 ), coreutils (>= 5.97-5.3 ), gcc-4.1 (>= 4.1.1-21 ), libacl1 (>= 2.2.41-1 ), libattr1 (>= 2.4.32-1 ), libbz2-dev (>= 1.0.3-6 ), libc6 (>= 2.3.6.ds1-13etch7 ), libc6-dev (>= 2.3.6.ds1-13etch7 ), libc6-i686 (>= 2.3.6.ds1-13etch7 ), libfcgi-dev (>= 2.4.0-6 ), libncurses5 (>= 5.5-5 ), libpcre3-dev (>= 6.7+7.4-4 ), libselinux1 (>= 1.32-3 ), libsepol1 (>= 1.14-2 ), libstdc++6-4.1-dev (>= 4.1.1-21 ), linux-kernel-headers (>= 2.6.18-7 ), locales (>= 2.3.6.ds1-13etch7 ), uuid-dev (>= 1.2-1.39+1.40-WIP-2006.11.14+dfsg-2etch1 ), zlib1g-dev (>= 1
Et puisque qu'il s'agit des dépendances de construction nous utiliserons uniquement les paquets *-dev c'est à dire: libbz2-dev, libc6-dev, libfcgi-dev, libpcre3-dev, libstdc++6-4.1-dev, uuid-dev, zlib1g-dev
On passe ensuite à la Description du paquet, la première ligne est une description courte du paquet, la seconde et les suivantes sont une description détaillée.
Description: A fast webserver with minimal memory footprint lighttpd is a small webserver and fast webserver developed with security in mind and a lot of features. It has support for * CGI, FastCGI and SSI * virtual hosts * URL rewriting * authentication (plain files, htpasswd, ldap) * transparent content compression * conditional configuration and configuration is straight-forward and easy. . Homepage: http://www.lighttpd.net
debian/rules
: Il s'agit d'un Makefile utilisé
lors de la création du paquet (.configure, build, install). Nous pouvons
personnaliser les options de compilation après avoir pris connaissance de
ces dernières en exécutant un simple ./configure --help. Dans le cas de
lighttpd le 'configure' devient:
./configure --prefix=/usr --with-openssl --with-pcre --with-bz2
debian/README.Debian
: Spécifier ce qui est
éventuellement relatif à Debian, sinon le supprimer.
debian/changelog
: Je conserve les valeurs par
défaut
debian/copyright
: comme son nom
l'indique.
debian/docs
: la liste des fichiers de
documentation. Ils seront installés dans /usr/share/doc/lighttpd.
debian/manpage.1.ex
=> Il s'agit d'un
exemple de manpage. Copier un éventuel manpage en
debian/manpage
.
debian/dirs
: Liste des répertoires qui doivent
être présent sur le système. (sans le premier '/')
debian/init.d.ex
: Dans le cas d'un daemon à
recopier en
debian/init.d
et l'adapter mais le plus
simple est d'utiliser le
debian/init.d
des sources du
package 'lighttpd' comme modèle.
Et enfin je supprime tout le reste : rm debian/*.ex debian/*.EX
Premier test de compilation:
dpkg-buildpackage -rfakeroot
Le configure et make sont exécutés, les binaires sont installés dans
debian/lighttpd
et enfin une série de script
dh_*
assure la création du package.
On peut vérifier la présence du binaire lighttpd dans debian/lighttpd/usr/sbin/, malheureusement aucun fichier de configuration n'est présent dans l'archive :(
On peut aussi noté que la commande dpkg-buildpackage nous alerte sur le fait que le paquet ne sera pas signé car le script dpkg-deb n'a pas trouvé de clé de cryptage relative au Maintener:
dpkg-deb : 1 avertissements sur les fichiers « control » ignorés signfile lighttpd_1.4.20-1.dsc gpg: skipped "dab <dab@free.fr>": secret key not available gpg: [stdin]: clearsign failed: secret key not available
Le paquet est tout de même présent dans le répertoire parent.
ls ../lighttpd_1.4.20* ../lighttpd_1.4.20-1.diff.gz ../lighttpd_1.4.20-1_i386.deb ../lighttpd_1.4.20-1.dsc ../lighttpd_1.4.20.orig.tar.gz ../lighttpd_1.4.20-1_i386.changes
Revenons un instant sur l'abscence des fichiers de configuration,
qui devraient en toute logique être installés dans
/etc/lighttpd
. dpkg-buildpackage n'a pas pu deviner
par lui-même quels sont les fichiers de configuration d'un package, il
facilite la création de paquet mais faut pas non plus exagéré il n'est pas
devin. Le plus simple est d'utiliser les scripts déjà construits des
sources du paquet stable de lighttpd. Pour cela il suffit d'éxécuter
:
mkdir source_stable && cd $! apt-get source lighttpd
On copie ensuite tous les fichiers
présent dans
lighttpd-1.4.19/debian
qui ne le sont
pas dans notre répertoire
debian
, éventuellement de
les adapter et de relancer le
dpkg-buildpackage
. Ou
encore plus simple d'utiliser les sources d'un paquet de la distribution
'testing' ou 'unstable', d'adapter les dépendances ( Build-Depends,Depends
Maintener ... ) et de reconstruire le paquet. Et voilà un paquet backporté
:)
Et voilà le résultat : http://www.catapulse.org/static/files/articles/debian/backports/lighttpd_1.4.20-1_i386.deb
Bon voilà pour les grandes lignes ... Il nous est maintenant possible de créer un package spécifique de lighttpd qui par exemple pourrait être lancé chrooté, intégrant pourquoi pas une configuration très spécifique ou encore des fichiers php ou perl d'un blog ou ...
Pour approfondir nos connaissances sur la création de package Debian voir les indispensables ' Guide du nouveau responsable Debian ' et ' Référence du développeur Debian '.


