Creación de archivos de configuración en /etc en paquetes Debian

Actualmente estoy trabajando en una versión actualizada de picockpit-client, que debería añadir archivos de configuración adicionales en /etc/picockpit-client para los módulos individuales (PiDoctor & PiControl).

picockpit-client es un paquete Raspbian para picockpit.com, que vincula la plataforma web con su Raspberry Pi individual.

Como Raspbian está basado en Debian, la siguiente información es válida para el empaquetado general de Debian y sus derivados (por ejemplo, Ubuntu).

dh-virtualenv

Recomiendo encarecidamente mi otro artículo sobre el empaquetado de Debian como introducción y material adicional, en caso de que estés interesado en empaquetar aplicaciones de Python.

En este artículo hablaré de conceptos generales relacionados con el empaquetado, y específicamente con la instalación de archivos en /etc/

Una nota por adelantado: El "punto de entrada" para construir un paquete es el makefile debian/reglas.

Y puedes construir paquetes usando el siguiente comando:

dpkg-buildpackage -uc -us -b

Este comando se ejecuta desde el directorio superior de su paquete, no el directorio debian/.

Resumen básico

imagen

Puede ver la estructura de carpetas necesaria para un paquete Debian (contenida en la carpeta picockpit-client-package).

Lo más importante es que contiene una carpeta debianque contiene varios archivos de configuración utilizados para construir el paquete.

Este diseño de archivo se utiliza para construir el paquete utilizando debhelper, que la mayoría de los paquetes utilizan porque automatiza muchas tareas.

registro de cambios

Este archivo contiene información del registro de cambios (para el paquete debian). Se utiliza para establecer la versión del paquete.

Ejemplo de contenidos:

imagen

Tenga en cuenta que la sangría por espacios es necesaria (dos espacios antes del símbolo *, un espacio antes del símbolo -)

En mi ejemplo, la versión más reciente del paquete (entrada en la parte superior) es 0.18.5

compat

Este archivo contiene un número seguido de una nueva línea:

imagen

Esta es la versión de debhelper con el que su aplicación es compatible. (A partir de la versión 12 esto puede especificarse también en debian/control, pero seguirá siendo soportado en debian/compat por compatibilidad con versiones anteriores - ver esto página de manual)

controlar

imagen

Este archivo se utiliza para proporcionar las dependencias, el nombre del paquete y otros metadatos relevantes del paquete.

derechos de autor

imagen

Este archivo proporciona información sobre los derechos de autor de su paquete.

.instalar

imagen

En mi caso, el archivo se llama picockpit-client.install ya que mi paquete es el paquete picockpit-client.

Este archivo es evaluado por dh_install (que forma parte de debhelper). Copia un archivo o varios archivos en un directorio del paquete (que se instalará en esta ubicación absoluta del sistema más adelante).

En este caso, quiero que el archivo etc/dinosaurio/dinosaurio.cfg para ser instalado en /etc/dinosaurio, como /etc/dinosaurio/dinosaur.cfg

Un problema que me encontré al investigar este tema es entender, donde colocar etc/dinosaurio/dinosaurio.cfg, en relación con picockpit-client.install.

Es importante saber en la que se buscan lugares dh_install busca estos archivos.

Aquí está la respuesta:

Por defecto busca en "." y "debian/tmp".

"." es el directorio en el que se encuentra la carpeta debian.

Por lo tanto, observe la estructura de las carpetas:

imagen

Así que, como ves, "etc" está en el mismo nivel de carpeta que "debian". Tenga en cuenta que podría haber nombrado esto arbitrariamente, ya que especifico la ubicación en picockpit-client.install:

etc/dinosaurio/dinosaurio.cfg etc/dinosaurio

Podría modificar esto para ser simplemente dinosaur.cfg, entonces dinosaur.cfg tiene que estar en el mismo directorio padre que la carpeta debian.

Por favor, vea más abajo para más información sobre el papel especial de los archivos que van en /etc, y un importante consejo de depuración de dh_install.

.enlaces

De este modo, se establecerán enlaces simbólicos, por ejemplo, para añadir su aplicación a la ruta del sistema en la que se buscan los binarios:

imagen

.postinst

Un script que se ejecuta después de la instalación. set -e es importante en este script, también debe devolver 0 para indicar el éxito (para que la instalación del paquete pueda ser finalizada).

Yo tengo el predeterminado de una plantilla:

imagen

.servicio

Se trata de una entrada de servicio systemd que debe añadirse para su aplicación. Tengo, por ejemplo:

imagen

.triggers

No estoy del todo seguro de para qué sirve esto; a mí me parece que es así (y funciona):

imagen

reglas

rules es un makefile utilizado para construir el paquete. Esto variará, dependiendo del tipo de paquete que construyas. Estoy reproduciendo mi archivo de reglas aquí para su conveniencia.

Como puede ver, utiliza dh_virtualenvque es una solución para crear entornos virtuales para el código Python (permitiendo que paquetes incompatibles coexistan en el mismo sistema, y que usted pueda controlar el entorno en el que se despliega).

Si está interesado en dh_virtualenv, lea mi artículo sobre cómo empaquetar paquetes Python para Raspbian con dh_virtualenv.

#! /usr/bin/make -f
#
# Construye el paquete Debian usando https://github.com/spotify/dh-virtualenv
#
# Los siguientes objetivos crean una copia limpia del directorio de trabajo mediante
# usando "sdist", si no "pip" se descontrola al instalar desde
# sourcedir ".", porque eso incluye la etapa de construcción debian,
# y se produce una explosión recursiva cuando se siguen los enlaces simbólicos.
#
# También asegura que su MANIFIESTO es completo y que al menos cubre
# todos los archivos necesarios para una compilación de liberación.

# Aumentar el registro de trazas, ver debhelper(7) (descomentar para activar)
#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=-con python-virtualenv -setuptools -python $(SNAKE) $(EXTRA_REQUIREMENTS) #-v
PACKAGE=$(shell dh_listpackages)
VERSION=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSION)

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

construir-arco:
     $(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 .

Tenga en cuenta que WordPress tiende a estropear la sintaxis del código, así que utilice esto sólo como una guía aproximada, no para copiar y pegar.

Más información sobre /etc, y dh_install

Nota lateral importante / corrección de errores

He pasado mucho tiempo depurando el siguiente problema:

dh_install: No se puede encontrar (ninguna coincidencia para) "etc/dinosaur/dinosaur.cfg" (probado en debian/picockpit-client-0.18.5, debian/tmp)

dh_install: picockpit-client archivos perdidos: etc/dinosaur/dinosaur.cfg
dh_install: faltan archivos, abortando

Este problema está relacionado con una entrada "errónea" en debian/reglas

imagen

como puede ver aquí, en esta sintaxis (para los principiantes) bastante abrumadora y críptica, se está estableciendo un parámetro llamado -sourcedir para el comando dh en las entradas build-arch y %:

imagen

En el Documentación de dh_install, podemos leer que este parámetro configura en qué directorio de origen se deben buscar los archivos para la instalación.

imagen

Ya que esto se había fijado en mi debian/reglas dh_install estaba buscando en debian/picockpit-client-0.18.5 y en debian/tmp - pero no en el directorio de nivel superior.

La solución es sencilla:

imagen

dh $@ $(DH_VENV_ARGS) -sourcedir .

Simplemente paso "." como nombre de directorio a -sourcedir

Tenga en cuenta que el paso de dos entradas sourcedir no funcionará como se espera:

imagen

en este caso, se sobrescribirá la primera entrada:

imagen

Así que sólo se va a comprobar ".", y el directorio pasado en $(SDIST_DIR) no.

etc. es especial

dh_install trata los archivos que se instalan en etc como los llamados conffiles.

Esto se determina automáticamente, no necesita añadir ninguna configuración adicional para esto (simplemente añada el archivo de configuración como una línea en su archivo .install).

Para decirlo de nuevo: si usas debhelper para tu empaquetado, haces no necesita crear el conffiles en el directorio debian manualmente. debhelper lo hará por usted.

dpkg gestiona estos archivos de configuración, y asegura que la configuración del usuario se guarde entre las actualizaciones de los paquetes, y en la simple eliminación de los mismos.

Lea este maravilloso resumen sobre qué significan los conffiles para los usuarios por Raphael Hertzog.

Digamos que he instalado mi paquete (con un /etc/dinosaurio/dinosaurio.cfg ficticio).

A continuación, he añadido una entrada adicional "Nuevas aventuras Dino" en /etc/dinosaurio/dinosaurio.cfg

imagen

Si simplemente quito el paquete:

apt-get remove picockpit-client

Entonces el paquete será eliminado, pero el archivo de configuración se quedará:

imagen

Para deshacernos también del archivo de configuración modificado, tenemos que purgar el paquete:

apt-get purge picockpit-client

imagen

Te informará de lo que está haciendo: "Purga de archivos de configuración para picockpit-client (0.18.5) ..."

Nota: no es necesario modificar el archivo de configuración para que permanezca si se elimina el paquete. Un archivo no modificado también permanecerá.

Bien, ahora digamos que has modificado el archivo y estás a punto de actualizar o reinstalar el paquete:

imagen

En este caso, su versión modificada se mantendrá (o se le pedirá):

imagen

Las versiones de los archivos de configuración y la versión en la que se basan sus modificaciones surgen de las sumas MD5.

Usted puede inspeccionar estos md5sums por:

dpkg -status picockpit-client

imagen

Como se puede ver, en la sección Conffiles el archivo /etc/dinosaur/dinosaur.cfg se muestra con su suma MD5 original.

dpkg puede comparar la suma MD5 entre actualizaciones del paquete, y ver si la versión del mantenedor cambia.

En caso de no modificar el archivo de configuración original (como usuario del sistema), se instalará la nueva versión del mantenedor.

Si ambos han modificado sus archivos, se le pedirá que haga una elección.

Referencias

Para dh_virtualenv: