Qu'est ce que lintian ?
L'outil utilisé par Debian pour vérifier la conformité des paquets avec le manuel de politique Debian est lintian. Il analyse le contenu de l'archive .deb
, recherche des incohérences et les erreurs courantes.
Ce paquet est utile pour toutes les personnes qui souhaitent vérifier la conformité de leurs paquets avec la politique Debian.
Pour l'installer :
apt-get update
apt-get install lintian
Comment vérifier un paquet .deb
?
Vérifier un paquet :
lintian ~/awesome_project_0.0.1_all.deb
Si la commande ne produit aucune sortie, c'est que le paquet est conforme et ne contient pas d'erreurs ou d'incohérences. A l'inverse, pour chaque problème dans le paquet, une ligne est écrite dans le terminal :
E: awesome_project: file-in-etc-not-marked-as-conffile etc/awesome_project/conf.ini
E: awesome_project: php-script-but-no-php-cli-dep usr/lib/awesome_project/bin/tool #!php
W: awesome_project: executable-not-elf-or-script usr/lib/awesome_project/lib.php
W: awesome_project: executable-not-elf-or-script ... use --no-tag-display-limit to see all (or pipe to a file/program)
Sauf pour la dernière ligne, on peut y repérer les champs suivants :
- Type de message
- Nom du projet
- Code d'erreur
- Fichier du paquet concerné
La ligne commence par E:
(error) en cas d'erreur et W:
pour une alerte de type warning. Cela définit la gravité du problème. Il pourrait également s'agir d'une ligne de commentaire (N:
note).
La dernière ligne qui contient ...
indique que des erreurs similaires ont été ignorées. Pour afficher toutes les erreurs/alertes, il faut utiliser l'option --no-tag-display-limit
:
lintian awesome_project_0.0.1_all.deb --no-tag-display-limit
Pour obtenir des détails complémentaires sur chaque erreur, on utilise l'option -i
lintian -i awesome_project_0.0.1_all.deb
E: awesome_project: file-in-etc-not-marked-as-conffile etc/awesome_project/conf.ini
N:
N: Files in /etc must be marked conffiles if they are included in a
N: package. Otherwise they should be created by maintainer scripts.
N:
N: Refer to Debian Policy Manual section 10.7 (Configuration files) for
N: details.
N:
N: Severity: serious, Certainty: certain
N:
N: Check: conffiles, Type: binary
N:
Quelques erreurs courantes
[ERROR] no-copyright-file
Each binary package has to include a plain file /usr/share/doc/pkg/copyright
Dans un paquet binaire, le fichier
copyright
est obligatoire, et doit être situé dans le dossier/usr/share/doc/{nom_du_paquet}
.[ERROR] extended-description-is-empty
The extended description (the lines after the first line of the "Description:" field) is empty.
Le fichier
control
doit contenir le champsDescription
mais une aussi une description avancée : une ligne minimum sur la ligne suivante après exactement un espace. Utiliser le.
pour ajouter une ligne vide :Description: Awesome project. Extended description for Awesome project. . Other line
[ERROR] file-in-etc-not-marked-as-conffile [file]
Files in /etc must be marked conffiles if they are included in a package. Otherwise they should be created by maintainer scripts.
La gestion des fichiers de configuration est un point délicat : c'est barbant de perdre sa configuration lors d'une mise à jour, et les messages interactifs lorsqu'une nouvelle version d'un fichier est disponible devraient être évités au maximum.
Tous les fichiers dans
/etc/
doivent être marqués commeconffiles
:dpkg
va ensuite détecter les changements effectués et alerter avant de remplacer un fichier modifié. Pour éviter cela, le manuel propose au reponsable du paquet de créer et gérer les fichiers de configuration dans des scripts.En tant que développeur, je privilégie de laisser la possibilité à l'utilisateur de modifier la configuration dans un fichier
.local
oulocal.ini
, de la même façon qu'un programme commefail2ban
gère ses fichiers de configuration. Cela permet, dans la plupart des cas, des remplacer les fichiers de configuration du paquet sans interaction.[ERROR] php-script-but-no-php-cli-dep [file] [interperter]
Packages with PHP scripts must depend on the php-cli package. Note that a dependency on a php-cgi package (such as php-cgi or php7.0-cgi) is needlessly strict and forces the user to install a package that isn't needed.
In some cases a weaker relationship, such as Suggests or Recommends, will be more appropriate.
Cette erreur indique qu'un fichier exécutable php est présent dans l'archive, mais que la dépendence
php-cli
n'est pas mentionnée dans le fichiercontrol
(en tant que dépendence si c'est un fichier essentiel, sinon en tant que suggestion ou recommendation).[WARNING] executable-not-elf-or-script [file]
This executable file is not an ELF format binary, and does not start with the #! sequence that marks interpreted scripts. It might be a sh script that fails to name /bin/sh as its shell, or it may be incorrectly marked as executable. Sometimes upstream files developed on Windows are marked unnecessarily as executable on other systems. If you are using debhelper to build your package, running dh_fixperms will often correct this problem for you.
Les fichiers marqués comme exécutables, devraient se limiter aux scripts dotés d'un shebang
#!
.[WARNING] maintainer-script-ignores-errors [file]
The maintainer script doesn't seem to set the -e flag which ensures that the script's execution is aborted when any executed command fails.
Les scripts du responsable du paquet (
preinst
,postinst
,prerm
andpostrm
) doivent, en cas d'erreur, retourner un code d'erreur différent de 0. Pour des scripts shell, lintian attend de trouverset -e
.[WARNING] binary-without-manpage [file]
Each binary in /usr/bin, /usr/sbin, /bin, /sbin or /usr/games should have a manual page [...]
Le message est asez clair.
Ecrire une page de manuel au format roff est fastidieux. Pour générer des pages de manuel, on peut utiliser un outil comme
pandoc
qui permet de convertir des pages de manuel à partir d'un format lisible, comme par exemple le markdown.