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.