Executa um script quando um pacote é atualizado?

3

Estou usando o runit para gerenciar meus serviços e, quando uma nova versão do nginx estiver instalada, gostaria de reiniciar o nginx usando sv restart nginx .

Existe uma maneira de monitorar um pacote ou conjunto de pacotes para atualizações e disparar um script quando eles são atualizados?

    
por Naftuli Kay 30.07.2014 / 01:28

2 respostas

1

Como você está usando o Debian, uma maneira possível de fazer isso é usando maquinário embutido em aptos. O Apt pode ser configurado para executar um script em atualizações.

Veja, por exemplo, o pacote apt-listchanges , que "é uma ferramenta para mostrar o que foi alterado em uma nova versão de um pacote Debian, em comparação com a versão atualmente instalada no sistema", especificamente, mostrando novos entradas de log de alterações. Este pacote inclui o script /etc/apt/apt.conf.d/20listchanges , que o apt executa em atualizações. O conteúdo deste script, na sua totalidade, é.

DPkg::Pre-Install-Pkgs { "/usr/bin/apt-listchanges --apt || test $? -ne 10"; };
DPkg::Tools::Options::/usr/bin/apt-listchanges::Version "2";

Esses scripts normalmente usam as ligações Perl ou Python do apt. /usr/bin/apt-listchanges é um script Python e usa as ligações do Python.

Veja, por exemplo, a documentação um tanto incompleta no Debian Wiki, AptConf .

    
por 30.07.2014 / 02:06
1

Você pode fazer dpkg executar um comando antes ou depois das operações de gerenciamento de pacotes. Passe a opção --pre-invoke=COMMAND ou --post-invoke=COMMAND ; o comando é executado com a variável de ambiente DPKG_HOOK_ACTION definida para a natureza da ação. Isso não é muito conveniente porque esses ganchos são executados uma vez por dpkg de invocação, não uma vez por pacote, e eles não fornecem uma maneira de dizer o que o processo dpkg fará ou fez. Uma maneira indireta de descobrir o que aconteceu é registrar o estado do (s) pacote (s) em que você está interessado antes e depois da ação e invocar sua ação personalizada se o estado for alterado. Você também pode obter essas informações analisando os logs ( /var/log/dpkg.log ).

Uma solução mais específica seria conectar-se ao mecanismo padrão que o Debian fornece para o seu problema. O pacote nginx (ou melhor, nginx-light ou nginx-full ) chama invoke-rc.d nginx start como parte de seu script de pós-instalação ( postinst ) e invoke-rc.d nginx stop como parte de seu script de pré-remoção ( prerm ) . Substitua o comando invoke-rc.d por um que seja personalizado para o runit e chame sv ; talvez você queira usar dpkg-divert para isso:

dpkg-divert --add --rename --divert /usr/sbin/invoke-rc.d.sysvinit /usr/sbin/invoke-rc.d
ln -s invoke-rc.d.runit /usr/sbin/invoke-rc.d

Como alternativa, coloque sua própria cópia de invoke-rc.d adaptada a sv antes de /usr/sbin no PATH, por exemplo em /usr/local/sbin .

O script /usr/sbin/invoke-rc.d.runit ou /usr/sbin/invoke-rc.d deve cuidar da implementação do invoke-rc.d interface :

  • Ofereça suporte à sintaxe invoke-rc.d SERVICE ACTION em que ACTION é um dos start , stop , restart , force-reload , reload .
  • Suporta a opção --quiet (a única que eu vejo usada pelos scripts de manutenção de pacotes no meu sistema, eu não fiz uma busca exaustiva de todos os pacotes Debian).
  • Invoque /usr/sbin/policy-rc.d conforme descrito na página do manual, se precisar (por exemplo, para evitar a execução de serviços em um chroot ou contêiner).

Se você quiser apenas gerenciar o Nginx com o runit, faça com que o invoke-rc.d execute o padrão se o nome do serviço não for nginx .

Considerando tudo, se você quiser apenas gerenciar o Nginx com o Runit, então desviar (ou mesmo editar - é um arquivo de configuração) /etc/init.d/nginx parece ser a maneira mais fácil. Use o script existente como ponto de partida e substitua as chamadas para start-stop-daemon pelas chamadas nv apropriadas.

    
por 30.07.2014 / 02:12

Tags