Instalação condicional de arquivos e diretórios em pacotes '.deb'

3

É possível criar um pacote binário .deb com a instalação de arquivos e diretórios condicionais (por exemplo, instalação de um script init em /etc/init.d/ após ser confirmado pelo usuário)?

    
por KaBa 30.06.2015 / 21:10

1 resposta

3

Para fazer perguntas interativamente durante a instalação do pacote, você deve usar debconf . Para criar dinamicamente e gerenciar arquivos de configuração (e arquivos em /etc/init.d/ são considerados arquivos de configuração) ucf pode ser usado.

Um tutorial sobre como usar o debconf pode ser encontrado aqui: link

Exemplo mínimo

debconf template

Coloque isso no arquivo debian/templates . Ele contém o texto que é mostrado ao usuário durante a instalação. Apenas certifique-se de substituir demo-pkg pelo nome do pacote!

Template: demo-pkg/install-init.d
Type: boolean
Default: false
Description: Would you like to install a service for this package?
 Services are really cool! They allow stuff to be started in the
 background without you having to start them manually!!!

Script de configuração de pacotes

É aqui que você pergunta ao usuário (de forma interativa) sobre as coisas que você precisa saber. Esse script é especial, pois, ao instalar mais de um pacote, todos esses arquivos de todos os pacotes são executados antes de dpkg iniciar o processo de instalação real. Isso significa que, se mais de um pacote quiser perguntar algo ao usuário, todas as perguntas serão feitas no início da instalação para todos os pacotes, em vez de posteriormente para cada pacote individualmente.

Basta colocar o seguinte material em um arquivo chamado debian/config e marcá-lo como executável (lembre-se de substituir demo-pkg pelo nome correto do pacote):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

# Should an init job be installed?
db_input high demo-pkg/install-init.d || true
db_go

# You can also act upon the user's answers using 'db_get'
#db_get demo-pkg/install-init.d
#[ "${RET}" = "false"] && echo "I don't think that was a wise decision..."

Scripts do mantenedor ( postinst , prerm e postrm )

Aqui fazemos a mágica real e adicionamos e removemos dinamicamente o arquivo de configuração / script de inicialização. Para que isso funcione, você precisa instalar o script de inicialização como arquivo regular junto com o pacote (assumi /usr/share/demo-pkg/init-service neste exemplo).

O arquivo debian/postinst (chamado depois que todos os arquivos foram extraídos por dpkg ):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

if [ "$1" = "configure" ];
then
    # Check if the user decided the enable the service using 'db_get'
    db_get demo-pkg/install-init.d
    if [ "${RET}" != "false" ];
    then
        # Install init script using 'ucf'
        ucf /usr/share/demo-pkg/init-service /etc/init.d/demo-service

        # Register init script as service
        update-rc.d demo-service defaults

        # Start service
        invoke-rc.d demo-service start
    fi
fi

O arquivo debian/prerm (chamado antes de os arquivos serem removidos por dpkg ou o pacote é atualizado para uma versão mais recente):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

# Load debconf library
. /usr/share/debconf/confmodule

# Check if the user decided the enable the service using 'db_get'
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
    # Stop the service before upgrade or removal
    invoke-rc.d demo-service stop

    if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ];
    then
        # Unregister service prior to removal
        update-rc.d -f demo-service remove
    fi
fi

O arquivo debian/postrm (chamado depois que todos os arquivos foram removidos por dpkg ):

#!/bin/sh

# Make sure this script fails if any unexpected errors happen
set -e

if [ "$1" = "purge" ];
then
    # Remove service file using 'ucf' (checking whether 'ucf' is still available first)
    if type ucf >/dev/null 2>&1;
    then
        ucf --purge "/etc/init.d/demo-service"
    fi

    # Remove service file by hand (in case the above failed somehow)
    rm -f "/etc/init.d/demo-service"
fi

Etapas finais

  1. Adicione uma Pre-Depends: dependency on debconf no arquivo debian/control
  2. Adicione uma% normalDepends: de dependência em ucf no arquivo debian/control
  3. Certifique-se de que o arquivo /usr/share/demo-pkg/init-service (ou o nome que você chama) seja instalado corretamente
por ntninja 30.06.2015 / 22:46