Eu tenho um script simples que aplica um patch a um determinado pacote e, como cada vez que esse pacote é atualizado, o patch é substituído, eu realmente gostaria de aplicar o patch automaticamente após cada atualização.
Para fazer isso, criei um arquivo /etc/apt/apt.conf.d/
e adicionei um gancho para DPkg::Post-Invoke
. Conforme documentado por man apt-get
, esse gancho é executado apt-get
após a instalação de um pacote com dpkg
. No entanto, este gancho não parece ter qualquer informação sobre qual pacote específico foi instalado, então não posso saber se devo aplicar o patch ou não. Nada é passado para seu stdin, nada é passado como argumento e a página de manual não diz nada sobre isso.
Então, para resolver isso, fiz a única coisa que consegui pensar: adicionei outro gancho para DPkg::Pre-Install-Pkgs
, que é executado apt-get
antes que os pacotes sejam instalados. Este gancho obtém (através do stdin) a lista de .deb
arquivos que serão instalados pelo dpkg
, então eu apenas verifico se algum nome de arquivo corresponde ao nome do pacote que quero corrigir e, se sim, crio um arquivo em /tmp
. Quando meu outro gancho é executado, ele primeiro verifica a existência do referido arquivo e, se presente, aplica o patch ao pacote que acabou de ser instalado.
Aqui está o arquivo que eu criei /etc/apt/apt.conf.d/
:
DPkg::Pre-Install-Pkgs {
"while read -r pkg; do case $pkg in *somepkg*) touch /tmp/.patch && exit 0; esac done < /dev/stdin";
};
DPkg::Post-Invoke {
"[ -f /tmp/.patch ] && /home/marco/scripts/apply_somepkg_patch.sh && rm -f /tmp/.patch; exit 0";
};
Para ser claro : apply_somepkg_patch.sh
simplesmente edita o conteúdo de um arquivo fornecido pelo pacote. Eu quero que o arquivo seja atualizado e corrigido a cada vez, não quero "bloqueá-lo" para que não seja atualizado.
Agora, enquanto tudo isso funciona bem, parece muito sujo e de alguma forma errado para mim. Existe alguma maneira mais limpa de fazer isso? Talvez usando apenas o DPkg::Post-Invoke
gancho? Ou, em outras palavras, existe uma maneira de saber qual pacote foi instalado no DPkg::Post-Invoke
gancho?
EDIT : adicionando um exemplo detalhado do que estou fazendo apenas para ficar 101% claro, embora não ache que adicione mais informações ao que disse acima.
Suponha que somepkg
seja o pacote do qual estou falando e somefile
seja o arquivo instalado por tal pacote que eu quero corrigir.
Primeira instalação de
somepkg
, conteúdo desomefile
:some_opt1 = some_value some_opt2 = some_value some_opt3 = a, b, c, d some_opt4 = some_value
Aplique o patch, alterando-o para:
some_opt1 = some_value some_opt2 = some_value some_opt3 = X, Y, Z, d some_opt4 = some_value
Atualização de
somepkg
, conteúdosomefile
após atualização:some_opt1 = some_value some_opt2 = some_value some_opt5 = some_value some_opt3 = a, b, c, d some_opt6 = some_value some_opt4 = some_value
Aplique o patch, alterando-o para:
some_opt1 = some_value some_opt2 = some_value some_opt5 = some_value some_opt3 = X, Y, Z, d some_opt6 = some_value some_opt4 = some_value
Agora, qual é o somepackage
, onde somefile
está, o que está dentro somefile
: tudo isso é completamente irrelevante para minha pergunta. Tudo que você precisa saber é que eu quero modificar dinamicamente o conteúdo de somefile
, que faz parte de somepkg
, depois de obter a versão atualizada do arquivo .
Isso obviamente não pode ser feito estaticamente: eu preciso de um script para ler somefile
, analisar seu conteúdo e corrigi-lo de acordo. Portanto, se eu quiser que meu script seja executado automaticamente toda vez somepkg
que for atualizado, preciso apt-get
executá-lo automaticamente para mim.
Não há uma maneira legal de fazer isso com ganchos
apt
dodpkg
estilo que você está usando no momento. Pode haver uma maneira simples de lidar com esses patches em atualizações para o pacote e arquivo específico que você está modificando, mas se você quiser uma solução genérica, acho que a melhor abordagem no Debian atualmente é usar gatilhos de arquivo .Isso envolve a criação de um pacote (simples) que cuidará de corrigir o arquivo nas atualizações do outro pacote (aquele que contém o arquivo que você deseja corrigir). Seu pacote de patch precisa declarar seu interesse em um gatilho de arquivo; para fazer isso, adicione um arquivo chamado
debian/triggers
) contendo a única linhaEm seguida, no pacote
postinst
(debian/postinst
), verifique se o primeiro argumento étriggered
, e se for, execute seu script de correção (ou mescle-o em seupostinst
). Se você quiser manter seu script de patch separado, você pode enviá-lo em seu pacote de patch para manter as coisas contidas.Feito tudo isso, construa e instale seu pacote de correção e, sempre que você atualizar o pacote que está modificando, o pacote de correção
postinst
será chamado.