Faire un dépot signé ou non
Présentation
Ce petit document indique comment faire un dépot signé ou non
- Prérequis
- Configuration
- Fabrication des fichiers Packages
- Fabrication du fichier Release
- Signature du dépot
Ce document est fondé sur la gestion de mes dépots non signés et signés suivant
deb http://boisson.homeip.net/debian/ wheezy divers
deb http://boisson.homeip.net/depot/ wheezy divers
Il est possible de voir concrètement les fichiers en allant sur le site correspondant.
Prérequis
Il existe des logiciels permettant de fabriquer et de gérer des dépots, par exemple reprepro. Ce qui suit ne fait qu'utiliser les logiciels d'apt-utils. Il suffit d'avoir donc apt-utils d'installé ainsi que gpg si vous comptez signer le dépot.
Un dépot est vu dans le sources.list par une ligne du type
deb http://boisson.homeip.net/depot wheezy divers
On y distingue l'adresse (http://boisson.homeip.net/depot), la version (wheezy ici, parmi toutes les versions du dépot) et la composante (divers ici, parmi toutes les composantes du dépot, souvent c'est main mais vous avez le droit d'être précis).
apt-cache policy montre
500 http://boisson.homeip.net/depot/ wheezy/divers amd64 Packages release o=Depot F. Boisson,a=wheezy,l=boisson.homeip.net,c=divers origin boisson.homeip.net
On y retrouve l'adresse, les couples composantes/version et l'architecture concernée.
Le dépot aura une arborescence de ce type (. est /var/www/depot par exemple):
. -> dists -> divers --> binary-amd64 | | |-> binary-i386 | |-> nvidia --> binary-amd64 | | |-> binary-i386 | |-> pouet (etc) |-> pool --> divers --> amd64 (paquets de divers/amd64) | |-> i386 (paquets de divers/i386) |-> nvidia --> amd64 (paquets de nvidia/amd64) | |-> i386 (paquets de nvidia/i386) |-> pouet --> amd64 (etc)
(ici il y a 3 composantes au moins: divers, nvidia, pouet)
Les paquets sont sous pool dans les répertoires composante/architecture. La description de chaque composante est dans un fichier Packages sous composante/binary-<architecture>
Configuration
Celle ci consiste à mettre pour chaque version un fichier version.conf (par exemple wheezy.conf) dans le répertoire racine du dépot. Par exemple:
APT::FTPArchive::Release { Origin "Depot F. Boisson"; Label "boisson.homeip.net"; Suite "wheezy"; Architectures "i386 amd64"; Components "divers"; }
On y voit l'origine (description du dépot) qui apparait dans le champ «o=» lors du apt-cache policy, le label («l=»), lsuite ou version («a=») les architectures et les composantes concernées.
Il est tout à fait possible de faire cohabiter des dépots ubuntu et debian tant que les noms des versions diffèrent.
Fabrication des fichiers Packages
Pour chaque version, et pour chaque composante, il y a un fichier Packages et ses versions compressées correspondantes. Ce fichier s'obtient par dpkg-scanpackages ou, de façon plus pratique, par apt-ftparchive packages
apt-ftparchive packages pool/divers/wheezy/i386/ > dists/wheezy/divers/binary-i386/Packages
apt-ftparchive packages pool/divers/wheezy/amd64/ > dists/wheezy/divers/binary-amd64/Packages
puis leur versions compressées
cat dists/wheezy/divers/binary-i386/Packages | gzip > dists/wheezy/divers/binary-i386/Packages.gz
cat dists/wheezy/divers/binary-i386/Packages | bzip2 > dists/wheezy/divers/binary-i386/Packages.bz2
cat dists/wheezy/divers/binary-amd64/Packages | gzip > dists/wheezy/divers/binary-amd64/Packages.gz
cat dists/wheezy/divers/binary-amd64/Packages | bzip2 > dists/wheezy/divers/binary-amd64/Packages.bz2
Ce fichier Packages contient la liste des paquets avec leur description et les md5sum et autres sha. Par exemple
Package: jpegtoavi Priority: optional Section: unknown Installed-Size: 64 Maintainer: Fran�ois Boisson <xxx@yyy.zz.tt> Architecture: amd64 Version: 1.5-1 Depends: libc6 (>= 2.2.5) Filename: pool/wheezy/amd64/jpegtoavi_1.5-1_amd64.deb Size: 9072 MD5sum: efb15d19f16ab29513f89d2650dc6258 SHA1: 6d798d93f780fae827152725bc3c53baccea5743 SHA256: d2598b36e0b633968ff260372ea0870c2d7c31177ffa6a5c0679c32291e3e3ef Description: Conversion jpeg -> avi Farbication de fichiers AVI � partir de JPEG
La fabrication de ce fichier prend du temps si le dépot contient beaucoup de fichiers .deb. Cela peut prendre facilement plusieurs minutes.
Fabrication du fichier Release
Cela doit être fait une fois tous les fichiers Packages crées. Le fichier Release contient, outre la description du dépot (un fichier Release pour chaque version). Il contient un md5sum (et sha) de chaque fichier sous dists/version donc entre autres des fichiers Packages. La sureté de ce fichier permet de certifier les fichiers Packages donc les paquets.
Ce fichier se crée par
apt-ftparchive -c wheezy.conf release dists/wheezy/ > /tmp/Release
mv /tmp/Release dists/wheezy/Release
(procédez en deux étapes pour que ce fichier n'apparaisse pas dans son contenu, je pense que apt-get s'en moque mais je n'ai pas vérifié). La première commande fabrique le fichier dans /tmp/Release, le fichier de configuration dans cet exemple est wheezy.conf. Il est important de bien renseigner les différentes composantes du dépot.
Typiquement son contenu est
Architectures: i386 amd64 Components: divers nvidia owncloud Date: sam., 27 oct. 2012 13:04:59 UTC Label: boisson.homeip.net Origin: Depot F. Boisson Suite: wheezy MD5Sum: 453b37a21882aae6eb4e5c2f87fb9336 2100 Release c067f73427faf97f5dfea9c7599e9ef3 25244 divers/binary-amd64/Packages 626a8959586c23d90dad380058e20d7b 8269 divers/binary-amd64/Packages.bz2 2466296dd049595904d266b663c9c616 8380 divers/binary-amd64/Packages.gz db0d79b76433fa614892146d60f5a8e2 22963 divers/binary-i386/Packages 4041ce2e5f46ec25c61785bb5bbdea3c 6874 divers/binary-i386/Packages.bz2 8e9c3fa27d07499febd42aff23588e13 6861 divers/binary-i386/Packages.gz f28c024f1491e206205098582f8e9a2b 34519 nvidia/binary-amd64/Packages 360c602b0a4a865dd37e2b2cc1738260 7466 nvidia/binary-amd64/Packages.bz2 d03982d9d41e82311c09a306e8d37883 7717 nvidia/binary-amd64/Packages.gz 73f1b1fd3ec0d7b20a185bca293af92d 30768 nvidia/binary-i386/Packages 70877482f19b88b882039374ff2c6e2b 7080 nvidia/binary-i386/Packages.bz2 ....
Signature du dépot
Il suffit désormais de signer le dépot donc de signer le fichier Release ce qui garantira les fichiers Packages et donc les paquets eux mêmes. Cela se fait tout simplement par
gpg --sign -ba -o Release.gpg Release
À noter qu'il faut mettre la signature sur un serveur de clefs, typiquement si vous signez avec la clef
pub 1024D/CEA8D8FF 2012-10-27
il vous suffit de faire
gpg --keyserver pgpkeys.mit.edu --send-key CEA8D8FF
en notant qu'il faudra peut être ouvrir un port sur l'extérieur (usuellement la réponse est très rapide)
L'utilisateur, si il n'a pas votre clef, verra
Il pourra récupérer la clef par les classiques
gpg --keyserver pgpkeys.mit.edu --recv-key D78A5C23CEA8D8FF
qui récupère la clef sur le serveur et
gpg -a --export D78A5C23CEA8D8FF > /tmp/clef.txt
et sous root
apt-key add /tmp/clef.txt
Un script
Ce script updatedepot permet de faire la suite des opérations automatiquement dès que les fichiers versions.conf ont été crées:
#!/bin/sh
VERSION=$1
DISTRIBUTION=depot
if [ ! -z $2 ] ; then
DISTRIBUTION=$2
fi
LISTE=$(grep Component $VERSION.conf | sed 's/^.*"\(.*\)".*$/\1/')
echo $LISTE
cd /var/www/$DISTRIBUTION
# consultation de divers
for nom in $LISTE ; do
echo Fabrication de $nom
mkdir -p dists/$VERSION/$nom/binary-i386/
mkdir -p dists/$VERSION/$nom/binary-amd64/
apt-ftparchive packages pool/$VERSION/$nom/i386/ | gzip > dists/$VERSION/$nom/binary-i386/Packages.gz
zcat dists/$VERSION/$nom/binary-i386/Packages.gz | bzip2 > dists/$VERSION/$nom/binary-i386/Packages.bz2
zcat dists/$VERSION/$nom/binary-i386/Packages.gz >dists/$VERSION/$nom/binary-i386/Packages
apt-ftparchive packages pool/$VERSION/$nom/amd64/ | gzip > dists/$VERSION/$nom/binary-amd64/Packages.gz
zcat dists/$VERSION/$nom/binary-amd64/Packages.gz | bzip2 >dists/$VERSION/$nom/binary-amd64/Packages.bz2
zcat dists/$VERSION/$nom/binary-amd64/Packages.gz >dists/$VERSION/$nom/binary-amd64/Packages
done
apt-ftparchive -c $VERSION.conf release dists/$VERSION/ > /tmp/Release.tmp
mv /tmp/Release.tmp dists/$VERSION/Release
cd dists/$VERSION/
rm Release.gpg
gpg --sign -ba -o Release.gpg Release
Il s'utilise par
$ updatedepot wheezy depot
si wheezy est la version choisie et /var/www/depot l'emplacement du dépot.
Ce fichier lit le fichier version.conf, en dégage les composantes voulues et fait toute la suite des opérations. Ça s'avère pratique en cas de modifications fréquentes du dépot.