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
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:
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:
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
Este archivo se utiliza para proporcionar las dependencias, el nombre del paquete y otros metadatos relevantes del paquete.
derechos de autor
Este archivo proporciona información sobre los derechos de autor de su paquete.
.instalar
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:
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:
.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:
.servicio
Se trata de una entrada de servicio systemd que debe añadirse para su aplicación. Tengo, por ejemplo:
.triggers
No estoy del todo seguro de para qué sirve esto; a mí me parece que es así (y funciona):
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=1export 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
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 %:
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.
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:
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:
en este caso, se sobrescribirá la primera entrada:
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
Si simplemente quito el paquete:
apt-get remove picockpit-client
Entonces el paquete será eliminado, pero el archivo de configuración se quedará:
Para deshacernos también del archivo de configuración modificado, tenemos que purgar el paquete:
apt-get purge picockpit-client
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:
En este caso, su versión modificada se mantendrá (o se le pedirá):
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
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
- debhelper página de manual (incluye una lista de comandos de debhelper dh_xx)
- Información de Raphael Hertzog sobre los conffiles
- https://www.debian.org/doc/manuals/maint-guide/dother.en.html
- https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf
- https://vincent.bernat.ch/en/blog/2019-pragmatic-debian-packaging
- https://manpages.debian.org/buster/debhelper/dh_installdeb.1.en.html
Para dh_virtualenv:
- https://pi3g.com/2019/04/19/packaging-python-projects-for-debian-raspbian-with-dh-virtualenv/
- https://dh-virtualenv.readthedocs.io/en/1.1/
- https://github.com/1and1/debianized-jupyterhub (un ejemplo que también contiene un archivo .install)