Empleando run-parts en paquetes de la empresa

26 Abr

Llevo ya unos doce paquetes Debian escritos expresamente para funcionar en los servidores y los puestos de trabajo de la empresa; he llegado a crear un pequeño árbol de dependencias entre ellos persiguiendo siempre la finalidad de automatizar todo lo posible la configuración de los puestos de trabajo.

Uno de los problemas más urgentes con los que me encontrado es que prácticamente todos los paquetes terminan creando o incluyen directorios y archivos que deben ser accesibles, entre otras características, al grupo de usuarios de la empresa.

Este grupo de usuarios está definido en un directorio LDAP central y ya ha sufrido al menos un cambio de nombre.  Con esto quiero decir que no se puede simplemente indicar el nombre durante la construcción del paquete; primero porque en la máquina de desarrollo no tiene por qué existir y segundo porque puede cambiar en el futuro y lo peor que puede pasarme es tener que reconstruir todos los paquetes de nuevo cada vez que ocurra.

Para resolverlo se me ocurrió crear un paquete muy básico llamado empresa-common del que dependiesen los demás y que proporcionase unas funciones bash simples que se llamasen en la parte de configuración del mismo.

Algo como lo que muestro en el siguiente ejemplo del archivo debian/postinst:

# Cargamos funciones 
. /etc/empresa/lib/patches.sh

case "$1" in
    configure)
        # Ejecutamos sistema de parches 
        $EMPRESA_PATCHES
    ;;
... 
  

El script define el contenido de la variable $EMPRESA_PATCHES como lo siguiente:

PATCHES=/usr/share/empresa/patches 

EMPRESA_PATCHES="run-parts --report --lsbsysinit ${PATCHES}"

de manera que ejecutamos run-parts sobre un directorio al que todos los paquetes pueden añadir algo, y que realiza estas tareas justo cuando todo el contenido del paquete está ya disponible en el sistema de archivos.

El primer parche se limita a buscar el directorio de configuración base de todos mis paquetes en /etc/empresa aquellos archivos que no tienen el grupo propietario correcto y lo cambia sin más al grupo adecuado. Éste, incluso, puede ser descargado en tiempo de instalación de otra fuente para no tener que reconstruir ningún otro paquete.

¿ Qué ocurre si un paquete en concreto precisa que exista un archivo dentro de /etc/empresa con una propiedad totalmente distinta ? Bueno, aunque es un caso extraño se puede dar, y para eso puede incluir un parche concreto con un número como nombre más alto (el noventa y nueve es una buena elección) que se asegure de efectuar los cambios que necesite. Incluso si posteriormente se instala otro paquete y se vuelven a aplicar los parches el resultado debería ser el mismo ya que mientras el paquete que precisa los cambios específicos esté instalado lo estará también su parche.

Enlaces y referencias