Como executar um script apenas durante a primeira instalação de um pacote e durante as atualizações?

14

Recentemente, comecei a empacotar um pouco do meu software e publicá-lo no Launchpad. A instalação e a remoção funcionam bem, mas a atualização do pacote de uma versão para a próxima versão é problemática.

O problema é que existem alguns scripts que só precisam ser executados durante a primeira instalação do pacote. Esses scripts preenchem o banco de dados, criam um usuário etc. Eles são chamados atualmente na seção package.postinst configure) . No entanto, isso faz com que eles sejam chamados durante uma atualização, assim como mostrado no diagrama .

Existe uma maneira de incluir um script de mantenedor em um pacote .deb que só é executado durante a primeira instalação do pacote e não durante uma atualização? Ou qual seria uma maneira elegante de incluir alguns scripts de configuração inicial em um pacote .deb?

    
por Jeroen 06.02.2012 / 20:27

5 respostas

14

Com um arquivo debian/preinst , você pode executar ações na instalação, mas não na atualização.

#!/bin/sh
set -e

case "" in
    install)
        # do some magic
        ;;

    upgrade|abort-upgrade)
        ;;

    *)
        echo "postinst called with unknown argument \''" >&2
        exit 0
        ;;
esac

#DEBHELPER#

exit 0

Embora, como o nome indica, isso é executado antes que o pacote seja instalado. Então você pode não ser capaz de fazer o que precisa aqui. A maioria dos pacotes simplesmente testa no estágio de configuração do postinst se o usuário já tiver sido criado. Aqui está colord

$ cat  /var/lib/dpkg/info/colord.postinst
#!/bin/sh

set -e

case "" in
    configure)

# create colord group if it isn't already there
    if ! getent group colord >/dev/null; then
            addgroup --quiet --system colord
    fi

# create the scanner group if it isn't already there
    if ! getent group scanner >/dev/null; then
        addgroup --quiet --system scanner
    fi

# create colord user if it isn't already there
    if ! getent passwd colord >/dev/null; then
            adduser --system --ingroup colord --home /var/lib/colord colord \
        --gecos "colord colour management daemon"
        # Add colord user to scanner group
        adduser --quiet colord scanner
    fi

# ensure /var/lib/colord has appropriate permissions
    chown -R colord:colord /var/lib/colord

    ;;
esac    



exit 0
    
por andrewsomething 07.02.2012 / 03:46
25

Confira este diagrama no wiki Debian sobre como os scripts do mantenedor são chamados:

Se você seguir o lado esquerdo (o caminho "tudo corre bem"), verá que o script postinst é chamado com a versão configurada mais recentemente. Isso lhe dá a chance de distinguir entre uma atualização e uma nova instalação - no caso de upgrade, seu postinst será chamado como

postinst configure 1.23-0ubuntu1

onde 1.23-0ubuntu1 é a versão do seu pacote instalada anteriormente, enquanto que para uma nova instalação ele será chamado como

postinst configure

Isso também permite que você cuide do caso quando precisar executar uma ação ao atualizar de uma versão específica. Você pode verificar o postinst dessa versão.

Isso facilita verificar se o script está sendo feito em uma 'instalação' ou 'upgrade'. Se $ 2 é nulo, então é uma instalação. então:

if [ -z "" ]; then
  do install stuff
else
  do upgrade stuff
fi
    
por RAOF 07.02.2012 / 07:54
2

Você pode usar um script debian / preinst em combinação com o postinst.

No script preinst, procure por um arquivo que o seu pacote definitivamente instale. Se estiver presente, não faça nada (porque seu pacote foi instalado anteriormente), senão, execute as etapas de configuração.

Se as etapas de configuração exigirem a instalação do pacote (nesse caso, o procedimento acima não funcionará porque o preinst é executado antes da instalação), o script preinst poderá gravar um arquivo, por exemplo: / tmp / setupmypkg. Seu script postinst poderia simplesmente testar se esse arquivo está presente e, em caso afirmativo, fazer duas coisas:

  • suas etapas iniciais de configuração
  • exclua o arquivo / tmp / setupmypkg
por kyleN 06.02.2012 / 22:43
0

Acho que não, mas você pode modificar facilmente os scripts preinst / postinst para verificar se o pacote está sendo instalado pela primeira vez e tomar medidas padrão.

Pode ser algo assim,

em preinst.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

no postinst,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

Editar

Hmm, pode ser que você possa checar tudo isso diretamente no postinst porque eu acho que o dpkg não configuraria o status do pacote como instalado antes de executar o postinst, mas não tenho certeza. Então, o que foi dito acima pode vir,

no postinst,

if not is_package_istalled():
    Do First Install Setup 

Onde, is_package_installed pode ser sua função para detectar o status da instalação. Pode ser algo como 'dpkg --status packagename'

OR

Por que não basta verificar se as alterações que você deseja fazer já estão lá e continuar apenas se não estiverem.

    
por Owais Lone 06.02.2012 / 22:15
0

Descobri que o teste de $ 2 em seu script "postinst configure" não funciona corretamente se você já instalou o pacote uma vez antes, desinstalou-o (mas sem limpar) e tentou reinstalá-lo novamente. Nesse caso, o script postinst ainda recebe um argumento de versão para a etapa "postinst configure".

No entanto, se você tiver instalado o pacote antes, remova-o e purgá-lo. Em seguida, reinstale-o, o script "postinst configure" NÃO obterá um argumento de versão em $ 2

    
por robvdl 15.05.2014 / 14:25