Como executar um comando após o upgrade do apt-get

7

Recentemente me deparei com a interessante ferramenta checkrestart , que verifica se os processos em execução usam uma versão desatualizada de uma biblioteca atualizada recentemente e precisaria de um reinício para carregá-los com a biblioteca atualizada. No momento, tenho que chamar checkrestart manualmente toda vez que usei apt-get upgrade ou aptitude upgrade .

Existe uma maneira de chamar tal comando automaticamente depois que apt-get ou aptitude atualizaram alguns pacotes? Pontos de bônus se a solução também funcionar com unattended-upgrades .

    
por Benedikt Bauer 31.03.2013 / 14:37

2 respostas

8

Depois de mais algumas pesquisas, descobri o que eu já suspeitava: apt em si fornece um conjunto de ganchos para invocar comandos em certos eventos, o que é usado por muitas ferramentas, mas parece estar mal documentado.

Chamar uma ferramenta como checkrestart após um upgrade de pacote é bastante simples. Basta colocar a seguinte linha de código em /etc/apt/apt.conf ou em um dos arquivos existentes ou em um novo arquivo em /etc/apt/apt.conf.d/ :

DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};

Isso chamará checkrestart toda vez que dpkg foi chamado por apt (e, é claro, qualquer outra ferramenta que dependa de apt , como aptitude ) e foi concluída com êxito.

    
por 03.04.2013 / 23:58
4

Existem algumas maneiras de fazer isso.

Usando um script

Uma solução rápida e suja seria escrever um script chamado apt-get ou aptitude e fazer com que ele chame o programa como tal:

#!/bin/bash
# filename: apt-get

# '$@' is all of the arguments passed to the script
/usr/bin/apt-get-bin "$@"
# or /usr/bin/aptitude-bin "$@"

if [[ $1 == *upgrade* ]] ; then
    checkrestart
fi

Torne o script executável: chmod +x apt-get . Você também pode querer tornar o script de propriedade de root: chown root apt-get; chgrp root apt-get . Tenha cuidado para não definir o bit setuid em seu script, porque se um invasor obtiver privilégios de gravação, ele poderá modificá-lo de maneira rápida e fácil para fornecer um shell raiz.

Esse método, é claro, exigirá que você mova o binário real para outro local e mova seu script de shell para algum local em seu caminho. O local adequado para colocar scripts de usuário é /usr/local/bin . Nesta situação, você deve colocar seu script no local em que o binário estava antes de movê-lo para manter as coisas organizadas.

Substituir o binário por um script dessa maneira é bastante invasivo e afeta todos os usuários da máquina. Como alternativa, você poderia chamar seu script de algo como apt-get-cr e lembre-se de chamar esse script em vez de apt-get . Você também pode escrever uma função de shell.

Usando uma função shell

Usar uma função shell permite manter o nome do comando apt-get sem ter que mover binários.

apt-get() {
    # 'command' makes sure this function doesn't call itself.
    # You could also use a direct path the binary as shown above.
    command apt-get "$@"

    if [[ $1 == *upgrade* ]] ; then
        checkrestart
    fi
}

Coloque esta função em algum lugar na sua configuração de shell ( ~/.bashrc , ~/.zshrc , etc.)

Este método é geralmente muito menos intrusivo que o método de script. Além disso, não é necessário mover os binários, o que geralmente é algo que apenas o usuário root pode fazer.

No lado negativo, o método da função shell nem sempre é muito portável entre shells e não se integra bem a interfaces gráficas como barras de inicialização na maneira como o script faz (você quase sempre pode tratar um script como um binário executável.)

    
por 31.03.2013 / 15:14