Como posso executar um script depois que um pacote específico é atualizado?

3

Eu criei um serviço systemd para um aplicativo, pois ele não inclui um, eu gostaria de poder reiniciar os serviços associados quando o pacote for atualizado.

Como posso fazer isso?

    
por Flutter Shy 07.01.2017 / 22:23

1 resposta

0

O AFAIK apt não possui ganchos específicos de pacotes (ou seja, não há como dizer a ele para executar um comando quando um determinado pacote é modificado). O que ele tem é DPkg::Pre-Install-Pkgs :

Pre-Install-Pkgs
   This is a list of shell commands to run before invoking dpkg(1).
   Like options this must be specified in list notation. The commands
   are invoked in order using /bin/sh; should any fail APT will abort.

Note que isto é executado antes de tudo ser feito com os pacotes.

Você pode especificar uma versão para as informações passadas para o comando via stdin; o nível de informação aumenta com a versão:

  • A versão 1 apenas envia os caminhos para os arquivos do pacote que estão sendo instalados
  • A versão 2 também despeja

    • VERSION 2 como a primeira linha e, em seguida,
    • a configuração atual do Apt, seguida por uma linha em branco

    e para cada pacote,

    • as versões do pacote antes e depois da operação,
    • , bem como a operação em si, por isso, ao contrário da versão 2,
  • A versão 3, além das informações em (2), adiciona informações de arquitetura (e tem VERSION 3 como a primeira linha)

Para um caso simples, você pode ter um script como (em, digamos /usr/local/bin/restart-foo ):

#! /bin/bash

if grep -q my-package
then
    # schedule an at job to restart it
    at now + 30 min <<<"service restart foo"
fi

E a configuração do apt em /etc/apt/apt.conf.d/99-foo-hook :

DPkg::Pre-Install-Pkgs {"/usr/local/bin/restart-foo";};
DPkg::Tools::Options::/usr/local/bin/restart-foo::Version "1";

Para um caso mais complexo, você pode solicitar mais informações e analisá-las, configurando DPkg::Tools::Options::/usr/local/bin/restart-foo::Version para "2" ou "3" , assim:

#! /bin/bash
declare -gA version action ver_index
ver_index["VERSION 2"]=3
ver_index["VERSION 3"]=5
skip_options ()
{
    while IFS= read -r line && [[ -n "$line" ]]
    do
        :
    done
}

IFS= read line
case $line in
    "VERSION "[23])
        ver_index="${ver_index[$line]}"
        skip_options
        while read -ra pack
        do
            echo "${pack[@]}"
            version["${pack[0]}"]="${pack[$ver_index]}"
            action["${pack[0]}"]="${pack[-1]}"
        done
        ;;
    *)
        while read pack ver
        do
            version["$pack"]="$ver"
            action["$pack"]="**CONFIGURE**"
        done < <( (echo "$line"; cat ) | xargs -d '\n' dpkg-deb --show --showformat='${Package} ${Version}\n')
        ;;
esac

for i in "${!version[@]}"
do
    echo "$i" "${version[$i]}" "${action[$i]}"
done

Claro que, em vez de echo ing os dados, você os usaria para decidir o que fazer.

Exemplos de entrada fornecidos:

V1:

/var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb

V2:

VERSION 2
APT::Architecture=amd64
APT::Build-Essential::=build-essential
APT::Install-Recommends=true
[...]
DPkg::Progress-Fancy=1
Binary=apt
CommandLine::AsString=apt%20install%20--reinstall%20tcsh

tcsh - < 6.18.01-5 /var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb
tcsh - < 6.18.01-5 **CONFIGURE**

Versão 3:

VERSION 3
APT::Architecture=amd64
APT::Build-Essential::=build-essential
APT::Install-Recommends=true
[...]
DPkg::Progress-Fancy=1
Binary=apt
CommandLine::AsString=apt%20install%20--reinstall%20tcsh
tcsh 6.18.01-5 amd64 none = 6.18.01-5 amd64 none /var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb
tcsh 6.18.01-5 amd64 none = 6.18.01-5 amd64 none **CONFIGURE**

O caminho inverso é usar os gatilhos do dpkg. Para isso, no entanto, você precisará criar um pacote que instale um acionador para algo do pacote que deseja assistir, mas os acionadores são executados depois que o pacote é configurado, portanto, isso é melhor para reiniciar os serviços. Esta postagem sobre estouro de pilha tem um bom guia para isso.

    
por muru 16.02.2018 / 08:50

Tags