Vérifier un paquet Debian avec Lintian

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 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 champs Description 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 comme conffiles : 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 ou local.ini, de la même façon qu'un programme comme fail2ban 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 fichier control (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 and postrm) doivent, en cas d'erreur, retourner un code d'erreur différent de 0. Pour des scripts shell, lintian attend de trouver set -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.


Partager