apt hook para verificar mudanças específicas no pacote

2

Meu objetivo é proibir a instalação / atualização de um pacote específico se o sistema não estiver em um estado específico (alguns trabalhos de pré-atualização precisam ser feitos).

Eu tentei o DPkg::Pre-Invoke hook, mas ele não recebe nenhum argumento:

DPkg::Pre-Invoke { "echo >&2 PREINVOKE [$@]"; };

apenas imprime

PREINVOKE []

Existe uma maneira de obter a lista de pacotes que serão tocados deste gancho? Ou talvez um gancho diferente faça isso? A solução deve ser melhor em todo o sistema, portanto, as soluções que usam o comando apt-get não parecem ser possíveis, infelizmente.

    
por kkm 17.10.2015 / 15:29

1 resposta

1

Existe outro gancho que, quando usado com cuidado, ajuda a fazer o trabalho. O nome do gancho é DPkg::Pre-Install-Pkgs e também é uma matriz como Pre-Invoke . De acordo com man apt.conf ,

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. APT will pass the filenames of all .deb files it is going to install to the commands, one per line on the requested file descriptor, defaulting to standard input.

Especifique um script no gancho como este

DPkg::Pre-Install-Pkgs { "/usr/local/libexec/somepackage-preinstall"; }

O script é invocado sem argumentos e obtém uma lista de nomes de arquivos de pacotes .deb em sua entrada padrão. Agora, é importante que o script seja invocado não apenas para apt-get install , mas também para apt-get remove (com entrada vazia). Portanto, no script, você precisa detectar que o pacote que requer algum processamento de pré-instalação está, na verdade, entre os que foram passados para sua entrada padrão. Isso pode ser feito assim

#!/bin/bash
grep -q '/somepackage_' || exit 0
... Do what you need here ...

o grep tenta comparar cada nome de arquivo na entrada padrão com o padrão que deve identificar o pacote exclusivamente, e o script sai com êxito se o apt-get install ou apt-get upgrade não foi chamado de forma a atualizar o pacote no qual você está interessado Se você quiser também obter o nome do arquivo .deb, você pode usar, por exemplo, o seguinte bashisa

#!/bin/bash
read debfile < <(grep '/somepackage_') || exit 0

Esse uso garante que a variável $debfile obtenha exatamente um nome de arquivo de pacote, para evitar surpresas se mais de uma corresponder à entrada.

Lembre-se de que os nomes dos arquivos estão começando na raiz do sistema de arquivos, como /var/cache/apt/archives/acl_2.2.52-1_amd64.deb .

Como DPkg::Pre-Install-Pkgs é uma matriz, todas as linhas que a especificam em vários arquivos em apt.conf.d são cumulativas: cada script será invocado com a mesma entrada.

    
por 18.10.2015 / 08:32

Tags