Création de fichiers de configuration dans /etc dans les paquets Debian

Je travaille actuellement sur une version actualisée de picockpit-client, qui devrait ajouter des fichiers de configuration supplémentaires dans /etc/picockpit-client pour les modules individuels (PiDoctor & PiControl).

picockpit-client est un paquet Raspbian pour picockpit.com, reliant la plateforme Web à votre Raspberry Pi individuel.

Comme Raspbian est basé sur Debian, les informations suivantes sont valables pour l'emballage général de Debian et de ses dérivés (par exemple Ubuntu).

dh-virtualenv

Je recommande vivement mon autre article sur l'emballage Debian comme introduction et matériel supplémentaire, au cas où vous seriez intéressé par l'empaquetage d'applications Python.

Dans cet article, j'aborderai les concepts généraux liés à l'empaquetage, et plus particulièrement l'installation des fichiers dans /etc/

Une remarque préalable : Le "point d'entrée" pour construire un paquet est le makefile debian/rules.

Et vous pouvez construire des paquets en utilisant la commande suivante :

dpkg-buildpackage -uc -us -b

Cette commande est exécutée à partir du répertoire supérieur de votre paquet, et non du répertoire debian/.

Aperçu général

image

Vous pouvez voir une structure de dossier nécessaire pour un paquet Debian (contenu dans le dossier picockpit-client-package).

Plus important encore, il contient un dossier debianqui contient plusieurs fichiers de configuration utilisés pour construire le paquet.

Cette disposition de fichier est utilisée pour construire le paquet en utilisant Débrouillez-vousque la plupart des paquets utilisent car il automatise de nombreuses tâches.

journal des modifications

Ce fichier contient les informations du journal des modifications (pour le paquet debian). Il est utilisé pour définir la version du paquet.

Exemple de contenu :

image

Notez que l'indentation par des espaces est nécessaire (deux espaces avant le symbole *, un espace avant le symbole -).

Dans mon exemple, la version la plus récente du paquet (entrée en haut) est 0.18.5.

compat

Ce fichier contient un numéro suivi d'un saut de ligne :

image

Il s'agit de la version de Débrouillez-vous avec lequel votre application est compatible. (A partir de la version 12, ceci peut être spécifié dans debian/control également, mais sera toujours supporté dans debian/compat pour une compatibilité ascendante - voir ceci page d'accueil)

contrôle

image

Ce fichier est utilisé pour fournir les dépendances, le nom du paquet et d'autres métadonnées pertinentes du paquet.

copyright

image

Ce fichier fournit des informations sur le copyright de votre paquet.

.install

image

Dans mon cas, le fichier s'appelle picockpit-client.install puisque mon paquet est le paquet picockpit-client.

Ce dossier est évalué par dh_install (qui fait partie de debhelper). Il copie un fichier ou plusieurs fichiers dans un répertoire du paquet (qui sera installé ultérieurement à cet emplacement absolu du système).

Dans ce cas, je veux que le fichier etc/dinosaur/dinosaur.cfg à installer dans /etc/dinosaur, comme /etc/dinosaur/dinosaur.cfg

Un problème que j'ai rencontré lors de mes recherches sur ce sujet est de comprendre, où placer etc/dinosaur/dinosaur.cfg, par rapport à picockpit-client.install.

Il est important de savoir dans lesquels les lieux de recherche dh_install recherche ces fichiers.

Voici la réponse :

Par défaut, il cherche dans "." et "debian/tmp".

"." est le répertoire dans lequel se trouve le dossier debian.

Il faut donc respecter la structure des dossiers :

image

Donc, comme vous le voyez, "etc" est au même niveau de dossier que "debian". Veuillez noter que j'aurais pu donner un nom arbitraire à ce dossier, puisque je spécifie l'emplacement dans picockpit-client.install :

etc/dinosaur/dinosaur.cfg etc/dinosaur

Je pourrais modifier cela pour que ce soit simplement dinosaur.cfg, mais alors dinosaur.cfg doit être dans le même répertoire parent que le dossier debian.

Veuillez voir plus loin pour plus d'informations sur le rôle spécial des fichiers qui vont dans /etc, et une importante astuce de débogage de dh_install.

.liens

Cela permettra de créer des liens symboliques, par exemple pour ajouter votre application au chemin du système dans lequel les binaires sont recherchés :

image

.postinst

Un script qui est exécuté après l'installation. set -e est important dans ce script, il doit également retourner 0 pour indiquer le succès (afin que l'installation du paquet puisse être finalisée).

J'ai le défaut d'un modèle :

image

.service

Il s'agit d'une entrée de service systemd à ajouter pour votre application. J'ai, par exemple

image

.triggers

Je ne sais pas exactement à quoi cela sert ; pour moi, cela ressemble à ceci (et cela fonctionne) :

image

règles

rules est un makefile utilisé pour construire le paquet. Il varie selon le type de paquet que vous construisez. Je reproduis ici mon fichier rules pour votre confort.

Comme vous pouvez le voir, il utilise dh_virtualenvqui est une solution pour créer des environnements virtuels pour le code Python (permettant aux paquets incompatibles de coexister sur le même système, et vous permettant de contrôler l'environnement dans lequel vous déployez).

Si vous êtes intéressés par dh_virtualenv, lisez mon article sur comment empaqueter des paquets Python pour Raspbian avec dh_virtualenv.

#!/usr/bin/make -f
#
# Construire le paquet Debian en utilisant https://github.com/spotify/dh-virtualenv
#
# Les cibles ci-dessous créent une copie propre du répertoire de travail par l'intermédiaire de
# en utilisant "sdist", sinon "pip" se détraque lors de l'installation à partir de
# sourcedir ".", car cela inclut l'étape de construction de debian,
# et une explosion récursive s'ensuit lorsque des liens symboliques sont suivis.
#
# Il garantit également que votre MANIFEST est complet et couvre au moins
# tous les fichiers nécessaires à la construction d'une version.

# Augmente la journalisation des traces, voir debhelper(7) (décommenter pour activer)
#DH_VERBOSE=1

export DH_VIRTUALENV_INSTALL_ROOT=/usr/share
SNAKE=/usr/bin/python3
EXTRA_REQUIREMENTS=-preinstall "setuptools>=17.1,=7" -preinstall "wheel" -preinstall "no-manylinux1"
DH_VENV_ARGS=-with python-virtualenv -setuptools -python $(SNAKE) $(EXTRA_REQUIREMENTS) #-v
PACKAGE=$(shell dh_listpackages)
VERSION=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSION)

propre :
     test ! -d dist || rm -rf dist
     test ! -d $(SDIST_DIR) || rm -rf $(SDIST_DIR)
     dh $@ $(DH_VENV_ARGS)

construire-arch :
     $(SNAKE) setup.py sdist -formats tar
     mkdir -p $(SDIST_DIR)
     tar -x -C $(SDIST_DIR) -strip-components=1 -exclude '*.egg-info' -f dist/*.tar
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

%:
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

Veuillez noter que WordPress a tendance à perturber la syntaxe du code. N'utilisez donc ce document qu'à titre indicatif, et non pour copier et coller !

Plus d'informations sur /etc, et dh_install

Note importante / correction de bogue

J'ai passé beaucoup de temps à déboguer le problème suivant :

dh_install : Cannot find (any matches for) "etc/dinosaur/dinosaur.cfg" (essayé dans debian/picockpit-client-0.18.5, debian/tmp)

dh_install : picockpit-client fichiers manquants : etc/dinosaur/dinosaur.cfg
dh_install : fichiers manquants, abandon de l'installation

Ce problème est lié à une entrée "erronée" dans le fichier debian/rules

image

comme vous pouvez le voir ici, dans cette syntaxe (pour les débutants) plutôt écrasante et cryptique, un paramètre appelé -sourcedir est défini pour la commande dh sur les entrées build-arch et % :

image

Dans le documentation dh_installnous pouvons lire que ce paramètre configure dans quel répertoire source les fichiers doivent être recherchés pour l'installation.

image

Comme cela avait été prévu dans mon debian/rules dh_install a cherché dans debian/picockpit-client-0.18.5 et debian/tmp - mais pas dans le répertoire de premier niveau.

La solution est simple :

image

dh $@ $(DH_VENV_ARGS) -sourcedir .

Je passe simplement "." comme nom de répertoire à -sourcedir

Veuillez noter que le passage de deux entrées sourcedir ne fonctionnera pas comme prévu :

image

dans ce cas, la première entrée va être écrasée :

image

Donc seul "." va être vérifié, et le répertoire passé dans $(SDIST_DIR) non.

etc. est spécial

dh_install traite les fichiers à installer dans etc comme des soi-disant conffiles.

Ceci est déterminé automatiquement, vous n'avez pas besoin d'ajouter une configuration supplémentaire pour cela (ajoutez simplement le fichier de configuration comme une ligne dans votre fichier .install).

Je le répète : si vous utilisez debhelper pour votre empaquetage, vous faites pas doivent créer le conffiles dans le répertoire debian manuellement. debhelper le fera pour vous.

dpkg gère ces fichiers de configuration, et s'assure que la configuration de l'utilisateur est sauvegardée entre les mises à jour de paquets, et lors de la suppression simple de paquets.

Lisez cet excellent aperçu sur ce que les conffiles signifient pour les utilisateurs par Raphael Hertzog.

Disons que j'ai installé mon paquet (avec un fictif /etc/dinosaur/dinosaur.cfg ).

J'ai ensuite ajouté une entrée supplémentaire "New Dino adventures" dans /etc/dinosaur/dinosaur.cfg

image

Si je retire simplement le paquet :

apt-get remove picockpit-client

Le paquet sera alors supprimé, mais le fichier de configuration restera en place :

image

Pour se débarrasser également du fichier de configuration modifié, nous devons purger le paquet :

apt-get purge picockpit-client

image

Il vous informera de ce qu'il fait : "Purge des fichiers de configuration de picockpit-client (0.18.5) ..."

Remarque : il n'est pas nécessaire de modifier le fichier de configuration pour qu'il reste en place si vous supprimez le paquet. Un fichier non modifié sera également conservé.

Imaginons maintenant que vous avez modifié le fichier et que vous êtes sur le point de mettre à niveau ou de réinstaller le paquet :

image

Dans ce cas, votre version modifiée sera conservée (ou vous serez invité à le faire) :

image

Les versions des fichiers de configuration, et la version sur laquelle vos modifications sont basées, proviennent des sommes MD5.

Vous pouvez inspecter ces md5sums par :

dpkg -status picockpit-client

image

Comme vous pouvez le voir, dans la section Conffiles, le fichier /etc/dinosaur/dinosaur.cfg est affiché avec sa somme MD5 originale.

dpkg peut comparer la somme MD5 entre les mises à jour du paquet, et voir si la version du responsable change.

Si vous ne modifiez pas le fichier de configuration original (en tant qu'utilisateur du système), la nouvelle version du mainteneur sera installée.

Si les deux ont modifié leurs fichiers, vous serez invité à faire un choix.

Références

Pour dh_virtualenv :