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
- Adicione uma
Pre-Depends:
dependency ondebconf
no arquivodebian/control
- Adicione uma% normal
Depends:
de dependência emucf
no arquivodebian/control
- Certifique-se de que o arquivo
/usr/share/demo-pkg/init-service
(ou o nome que você chama) seja instalado corretamente