
# Howto Debian packages

## Gestion des packages

Voir les évolutions de version proposées :

~~~
# aptitude upgrade -sV
~~~

### Packages held


~~~
# aptitude search ~ahold
~~~

## Unattended upgrades / Auto upgrades

Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement.

Pour cela il faut installer le paquet unattended-upgrades et faire « dpkg-reconfigure -plow unattended-upgrades ».

La configuration se trouve dans /etc/apt/apt.conf.d/50unattended-upgrades.
On peut choisir où envoyer le mail de rapport ou encore si on doit redémarrer la machine automatiquement si nécessaire, etc.


## Créer un paquet Debian

* Debian Policy : <http://www.debian.org/doc/debian-policy/>
* Debian Dev refs : <http://debian.org/doc/developers-reference/>
* Debian New Maint guide : <http://debian.org/doc/maint-guide/>
* Howto sur le wiki Debian : <http://wiki.debian.org/HowToPackageForDebian>
* Howto de L. Nussbaum : <http://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf>

### Génération de l'arborescence _debian/_

Cette étape consiste à créer une arborescence qui constituera le paquet Debian. On peut l'automatiser simplement avec la commande _dh_make_ :

~~~
cd futur-paquet-0.1
dh_make
~~~

_NOTE : le nom du répertoire doit obligatoirement être de la forme _nom_-_version_ (_nom_ peut contenir des minuscules, chiffres et tirets)._

En utilisant dh_make sans options, il essayera de deviner les informations dont il a besoin. On peut forcer celles ci en les spécifiant sur la ligne de commande. Pour les plus utiles :

* `-c` : la licence du programme ;
* `-e` : l'adresse email du responsable du paquet (vous) ;
* `-p` : nom du paquet, si le nom du répertoire courant n'est pas sous la forme standard ;
* `-f` : chemin vers l'archive contenant les sources. Si elle n'existe pas, utilisez l'option --createorig.

Le type de paquet vous sera demandé lors de l'exécution.

### Édition de certains fichiers importants

_dh_make_ a créé de nombreux fichiers dans le répertoire _debian/_. Certains sont indispensables, d'autres moins.
Par exemple (si vous ne vous en servez pas) vous pouvez supprimer tous les *.ex, des templates servant d'exemple.

~~~
rm *.ex
rm *.EX
~~~

Voici une rapide explication à propos des fichiers importants :

* le fichier _control_ : il décrit de manière générale le paquet. Plusieurs champs sont à compléter, notamment :
* _Section_ : voir la liste [ici](http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections) ;
* _Homepage_ : le site du programme ;
* _Architecture_ : _any_ par défaut, ce qui va générer un paquet par architecture. Dans le cas d'un script shell par exemple, on préférera _all_ (un seul paquet est généré car compatible avec toutes les architectures) ;
* _Depends_ : indiquez ici le nom et la version des paquets dont dépends éventuellement le programme (en général des bibliothèques) ;
* _Description_ : le champ doit contenir une description courte, suivi d'une description longue (sur la ligne suivante, indentée d'un espace).
* le fichier _changelog_ : il décrit les changements qui ont été fait sur le programme. À priori, il est déjà complété avec un « Initial release ». Supprimez juste le « (Closes: #nnnn) » puisque c'est la première version.
* le fichier _copyright_ : il contient la licence sous laquelle est distribué le programme. `dh_make` l'a partiellement remplit, il vous reste à indiquer le(s) développeur(s) du programme ainsi que le texte de la licence.
* le fichier _rules_ : c'est en fait un fichier Makefile, qui décrit les règles de construction et d'installation du paquet. Dans le cas d'un script unique, et qui ne nécessite pas de configuration/compilation :

C'est le célèbre _./debian/rules_ qui gère donc la compilation et la copie des fichiers dans la future arborescence.
Si l'on simplement copier un script, on peut par exemple rajouter ceci à la fin de la cible _install_ :

~~~
    install -d -m 0755 -o root -g root $(CURDIR)/debian/futur-paquet
    install    -m 0755 -o root -g root nom-du-script $(CURDIR)/debian/futur-paquet
~~~

### Construction du paquet

Maintenant nous pouvons construire le paquet à l'aide de la commande :

~~~
$ debuild -us -uc
~~~

Si aucune erreur n'est apparue, votre paquet est prêt à être installé et/ou poussé sur un dépôt non officiel.


## Créer un paquet pour un module PHP Pear ou Pecl

La commande `dh-make-pecl` (ou `dh-make-pear`) permet de télécharger l'archive depuis les dépôts PHP puis de créer l'arborescence du paquet Debian en pré remplissant certains fichiers (notamment le _debian/rules_) :

~~~
dh-make-pecl --maintainer "John Doe <jdoe@example.com>" --only 5 pecl-package
~~~

### Construire un paquet pour un module PHP Pecl avec PHP7.X 

Depuis Debian Stretch avec php7.0, la commande `dh-make-pecl` n'est pas adapté a php7.0, il faut donc adapté le fichier debian/rules et inclure le fichier /usr/share/dh-php/pkg-pecl.mk pour construire le paquet correctement :

~~~
#!/usr/bin/make -f
include /usr/share/dh-php/pkg-pecl.mk
~~~

## Manipulation d'un paquet (binaire)

Pour certaines (mauvaises) raisons, on peut être amené à vouloir modifier un paquet binaire... notamment un maintainer script par exemple.

~~~
$ ar x foo.deb
$ ls
control.tar.gz data.tar.gz debian-binary
$ tar xf control.tar.gz
$ vim preinst
<hack...hack...hack>
$ tar cvf control.tar.gz md5sums postrm control prerm preinst postinst
$ ar r foo.deb control.tar.gz
~~~

Et voilà, on a modifié le _preinst_ du paquet _foo.deb_.

## FAQ

### Erreur lintian : mkdir -p failed at /usr/share/perl5/Lintian/Unpacker.pm line 224

~~~
mkdir -p /tmp/temp-lintian-lab-6xngeaELBD/pool/d/devscripts/devscripts_2.13.8_amd64_binary failed at  /usr/share/perl5/Lintian/Unpacker.pm line 224.
~~~

C'est probablement que votre système n'a pas assez de mémoire.
Avec un _strace lintian_ vous obtiendrez peut-être :

~~~
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09117029d0) = -1 ENOMEM (Cannot allocate memory)
~~~

## Savoir si un package est installé

~~~
# apt-cache search php | grep apc
php-apc - APC User Cache for PHP 5 (transitional package)
php5-apcu - APC User Cache for PHP 5
# dpkg -l php-apc | grep ^ii
~~~

## Savoir la hiérarchie des fichiers créés suite installation d'un package

~~~
# dpkg -L php-apc
/.
/usr
/usr/lib
/usr/lib/php5
/usr/lib/php5/20090626
...
~~~

## hold / unhold

~~~
# apt-mark hold youtube-dl
youtube-dl passé en figé (« hold »).

# apt-mark unhold youtube-dl
Annulation de l'état figé pour youtube-dl.
~~~