Por que uma atualização do pacote yum substitui meus arquivos de configuração do yum-cron?

3

Normalmente, ao aplicar atualizações de pacote via yum update , o rpm é 'inteligente' suficiente para respeitar minhas alterações nos arquivos de configuração em /etc .

( basicamente analisa o mtime, compara-o e, dependendo no resultado substitui o arquivo pela nova versão ou apenas coloca a nova versão ao lado dela.)

Mas com uma das últimas atualizações do yum / yum-cron no Centos 7, meus arquivos de configuração do yum-cron customizados foram substituídos:

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

Agora eu estou querendo saber por que isso aconteceu exatamente?

Quero dizer, a resposta deve estar no pacote fonte - mas não consigo encontrá-lo:

$ rpm -qi yum-cron | grep src
Source RPM  : yum-3.4.3-132.el7.centos.0.1.src.rpm
$ yumdownloader --source yum-3.4.3-132.el7.centos.0.1
$ grep '%.*yum-cron.*\.conf' yum.spec
%config(noreplace) %{_sysconfdir}/yum/yum-cron.conf
%config(noreplace) %{_sysconfdir}/yum/yum-cron-hourly.conf

Olhando para o arquivo spec, na seção yum-cron, a diretiva config tem noreplace especificado.

Por outro lado, a propriedade dos arquivos de configuração parece ser compartilhada entre os pacotes binários yum e yum-cron :

$ rpm -ql yum-cron | grep 'yum-cron.*\.conf'
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf
$ rpm -ql yum | grep 'yum-cron.*\.conf' 
/etc/yum/yum-cron-hourly.conf
/etc/yum/yum-cron.conf

Como assim?

Quero dizer, eu só vejo os arquivos de configuração do yum-cron mencionados na seção de arquivos específicos do cron do arquivo de especificações ...

Veja também o problema do CentOS e o Problema do RHEL sobre isso.

    
por maxschlepzig 30.12.2015 / 12:50

3 respostas

1

Isso se deve à seguinte linha na seção principal %files do arquivo yum.spec :

%(dirname %{compdir})

Significa que o rpm primeiro substitui %{compdir} e então executa dirname com o resultado como argumento em um shell. A saída é então adicionada à lista de arquivos.

A variável compdir é definida assim:

%define compdir %(pkg-config --variable=completionsdir bash-completion)
%if "%{compdir}" == ""
%define compdir "/etc/bash_completion.d"
%endif

Assumindo que bash-completion esteja instalado no tempo de compilação (no sistema de compilação), pkg-config , portanto, retorna talvez:

/usr/share/bash-completion/completions

E, assim, adicionando

dirname /usr/share/bash-completion/completions
-> /usr/share/bash-completion

para a lista de arquivos está ok (e faz sentido se o pacote yum também instalar ajudantes, por exemplo, em /usr/share/bash-completion/helpers ).

O caso problemático é quando o pacote bash-completion não é instalado no tempo de compilação porque, em seguida, pkg-config retorna a sequência vazia, ou seja:

 compdir := /etc/bash_completion.d
 => dirname /etc/bash_completion.d
 -> /etc

Assim, o diretório /etc completo do buildroot do pacote é adicionado recursivamente à lista de arquivos.

Aparentemente, a caixa onde o pacote binário do CentOS yum foi construído não tem o pacote bash-completion instalado. Na verdade, o RHEL (e, portanto, o CentOS) nem sequer fornece um pacote bash-completion .

Isso explica por que os arquivos

/etc/yum/yum-cron.conf
/etc/yum/yum-cron-hourly.conf

são de propriedade dos pacotes yum e yum-cron .

(E só estão corretamente marcados pelo pacote yum-cron .)

Adendo

A motivação para os condicionais é provavelmente a idéia de ter um arquivo de especificação yum para distribuições múltiplas baseadas em rpm (por exemplo, diferentes versões do Fedora, RHEL, ...). Conseqüentemente, o arquivo de especificação também condicionalmente depende de compilação e bash-completions apenas em sistemas não-RHEL:

%if ! 0%{?rhel}
# we don't have this in rhel yet...
BuildRequires: bash-completion
%endif

A mudança que introduziu o dirname foi discutida na lista de discussão yum :

package also $(compdir)'s parent (not sure why, just in case)

A introdução da lógica condicional também foi discutida :

Oh, and instead of hardcoding the completions dir, it'd be better to get it from "pkg-config --variable=completionsdir bash-completion".

Correção de especificações

Uma correção é mover a chamada dirname para o ramo condicional certo, por exemplo:

--- a/SPECS/yum.spec
+++ b/SPECS/yum.spec
@@ -28,7 +28,7 @@ BuildRequires: bash-completion

 # disable broken /usr/lib/rpm/brp-python-bytecompile
 %define __os_install_post %{nil}
-%define compdir %(pkg-config --variable=completionsdir bash-completion)
+%define compdir %(pkg-config --variable=completionsdir bash-completion | xargs -r dirname)
 %if "%{compdir}" == ""
 %define compdir "/etc/bash_completion.d"
 %endif
@@ -451,7 +451,7 @@ exit 0
 %dir %{_sysconfdir}/yum/fssnap.d
 %dir %{_sysconfdir}/yum/vars
 %config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
-%(dirname %{compdir})
+%{compdir}
 %dir %{_datadir}/yum-cli
 %{_datadir}/yum-cli/*
 %exclude %{_datadir}/yum-cli/completion-helper.py?
    
por 31.12.2015 / 00:40
1

Este é um problema na forma como a Red Hat criou o pacote - o arquivo yum-cron.conf deve ser marcado como um arquivo de configuração (ao contrário do que a saída indica deve ser o caso), mas não é (consultando o pacote instalado para arquivos de configuração não lista o arquivo yum-cron.conf ). A resposta real é corrigi-lo por RH, a resposta mais útil é chattr +i . Consulte também: link

    
por 30.12.2015 / 13:42
1

Obrigado pela explicação detalhada maxschlepzig , mas a sua correção proposta não está correta. Isso resultaria no comdir sendo definido como /usr/share/bash-completion quando o bash-completion estiver instalado. Os arquivos de lá não são carregados, eles precisam estar em /usr/share/bash-completion/completions . Isso quebraria a possibilidade de usar consistentemente %{compdir} como um caminho de instalação para arquivos de conclusão, que é o ponto inteiro da macro.

A maneira mais segura de corrigir isso é ser explícita:

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%global compdir %{_datadir}/bash-completion/completions
%else
%global compdir %{_sysconfdir}/bash_completion.d
%endif

Depois, na seção% files:

%if 0%{?fedora} >= 19 || 0%{?rhel} >= 7
%(dirname %{compdir})
%else
%{compdir}
%endif
    
por 05.02.2016 / 21:24