Crear un paquete Debian con scripts de inicio

Debian-develArco

Esta receta muestra como empaquetar scripts de inicio en un sistema debian.

Ingredientes

  • debhelper
  • Leer la receta de dh_make Smiling para generar el directorio base

Archivos necesarios en el directorio debian

  • preinst, postinst, prerm y postrm
    • Estos bash scripts se ejecutan (como su nombre indica) antes y después de la instalación del paquete y antes y después de su eliminación. Con ellos podemos, por ejemplo, generar archivos de configuración, recuperar información de usuario en tiempo de instalación, actualizar el update-rc.d (tanto para añadir como para eliminar el script), etc. En resumen, manejan la gestión del paquete desde su instalación hasta su eliminación, por lo que hay que tener especial cuidado en la desinstalación y dejar el sistema tal y como estaba originalmente.

      Por supuesto deben ser ejecutables (chmod +x y #!/bin/bash).

  • [nombreScript].init
    • Este es el script de inicio que se almacenará sin la extensión ".init". Mas adelante se detalla su estructura.

Archivos opcionales en el directorio debian

  • [nombreScript].dirs
    • En este archivo se especifican los directorios que se deben crear durante la instalación del paquete (uno por línea).
  • Interactuar con el usuario
    • A veces puede ser interesante interacturar con los usuarios por medio de una interfaz en shell en la que solicitar algún parámetro. Para ello se utiliza debconf. Para utilizar debconf se necesitan especificar las preguntas (archivo templates), cuando se mostrará cada una (archivo config) y por último se deben recuperar en el archivo de post instalación (archivo postinst). Para profundizar sobre debconf (mas tipos de entradas, db_input, etc) leer el Tutorial Debconf.
    • templates
      • Gracias a este archivo podemos especificar los campos que solicitamos al usuario durante la instalación del paquete. Cada entrada tiene un aspecto de este tipo:
        Template: script/IdPregunta
        Type: string
        Default: respuesta por defecto
        Description: Is this the ask?:
        Description-es.UTF-8: Esta es la pregunta?
        
    • config
      • Este bash script (ejecutable) permite que el script de post instalación (postinst) pueda recuperar la información que el usuario introduce. El archivo config carga el confmodule, inicializa la db del paquete y lanza las entradas por medio de db_input. Algo así:
        #!/bin/bash
         
        set -e
        # if we do not have debconf, we just skip this
        . /usr/share/debconf/confmodule || exit 0
         
        db_version 0.1
        db_capb
        db_title glacier2node
         
        db_input high scriptName/question0 || true
        .........
        db_go || true
    • Recuperación de la información
      • El script postinst puede recuperar la información proporcionada por el usuario, tras cargar debconf, por medio de db_get.

        #!/bin/bash
         
        set -e
        . /usr/share/debconf/confmodule || exit 0
         
        db_get scriptName/question0
        q0="$RET"

    El script de inicio

      El script de inicio consta de tres partes.
    • Descripción LSB(Linux Standard Base) del script
      • Tiene este aspecto:
        ### BEGIN INIT INFO
        # Provides:          nombre del paquete
        # Required-Start:    $syslog
        # Required-Stop:     $syslog
        # Should-Start:      $local_fs
        # Should-Stop:       $local_fs
        # Default-Start:     2 3 4 5
        # Default-Stop:      0 1 6
        # Short-Description: script de prueba
        # Description:       pues eso
        ### END INIT INFO
        
    • Métodos para el manejo del script
      • Para llevar a cabo esta tarea se debe utilizar el comando start-stop-daemon ya que garantiza un control completo y efectivo del proceso. Es recomendable que el script de soporte a las opciones start, stop, restart y force-reload por si posteriormente se quiere "debianizar".
    • Switch entre operaciones
      • Finalmente solo es necesario hacer el switch entre las operaciones que soporte el script. Algo así:
        case "$1" in
            start)
        		start_script
        		;;
            stop)
        		stop_script
        		;;
            restart)
        		stop_script
        		start_script
        		;;
        	force-reload)
        		reload_script
        		;;
            *)
        		echo "Usage: /etc/init.d/$NAME {start|stop|restart}" >&2
        		exit 2
        		;;
        esac
         
        exit 0

    Construcción del paquete

      Finalmente el directorio /debian debemos tener al menos estos archivos,
      changelog  copyright  files myScript.init  postrm  rules compat control docs preinst postinst prerm
      

      y si utilizamos debconf también deben estar los archivos config y templates. Ahora solo queda:

      dpkg-buildpackage -us -uc -rfakeroot

      y listo.

    Referencias