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.