Como eu crio um pacote RPM que falharia uma transação YUM se uma determinada creteria fosse atendida?

3

Estou tentando empacotar um produto que consiste em muitos pacotes.

Tenho sucesso escrevendo todos os arquivos de especificações, as dependências entre os pacotes e assim por diante. Eles estão todos instalados e funcionam bem.

A única coisa que não consigo fazer é executar um teste de pré-requisição: Em certos casos, eu gostaria que os pacotes não fossem instalados, e o usuário recebesse um erro, explicando-lhe o que ele precisa. para corrigir primeiro, antes de executar a instalação dos pacotes.

Por exemplo: Eu quero verificar se o usuário está rodando no nível de execução 3, e se não, aborto toda a instalação, e peço ao usuário para reinstalar o CentOS no perfil "Mínimo" - como eu não quero tudo os pacotes extras que vem com "Desktop". (Este é apenas um exemplo, eu tenho alguns testes para realizar).

A maneira como abordei este problema é esta:

Eu criei uma espécie de 'meta package', que seu nome aparece em todos os outros pacotes 'Requires:' diretiva, então seria instalado primeiro pelo YUM, e nesse arquivo de especificação do pacote, no% co_de Na seção%, fiz os vários testes que queria realizar, gerando erros de teste quando aplicável e, em seguida, ' %pre '.

A razão pela qual escolhi essa abordagem é esta: "Se cada pacote depender desse pacote e este pacote não puder ser instalado, a transação deverá falhar, assim que o gerenciador de pacotes desejar instalar um pacote que dependa de um pacote que falha na instalação ... afinal, a dependência não foi atendida ". No Gentoo, por exemplo, se um pacote falha na instalação, por qualquer motivo, o emerge para completamente - mesmo não para problemas de dependência; E há um sinalizador especial para que o emerge continue, apesar do erro retornado de um dos pacotes.

O problema é que, de fato, o pacote falha quando os testes falham (o RPM diz especificamente que ele retornou o código 1), MAS ... O YUM não parece se importar que isso aconteça - e continua a instalar tudo o resto, incluindo pacotes que dependem de um pacote que não está instalado (!). No final, ele simplesmente relata que todos os pacotes foram instalados com sucesso, espera pelo pacote que deliberadamente falhou ...

Eu estou supondo que a razão para isso é que a verificação de dependência acontece antes do início da transação e, de fato, as dependências são atendidas a partir dos vários repositórios à disposição do YUM. Ainda assim, não faz qualquer sentido para mim que, se uma dependência eventualmente falhar, a instalação de pacotes dependentes continuaria.

Minha lógica é falha? Eu duvido que seja um bug, já que alguém o teria encontrado agora (isso é no CentOS 6.3 se isso importa ...) - mas todo meu Google-foo não produziu nada. Eu nem encontrei alguém fazendo a mesma pergunta ... talvez eu esteja usando palavras-chave erradas?

Estou me aproximando desse jeito errado? Qualquer outra idéia (que se encaixa em especificações RPM ou outra mágica do repositório YUM, mesmo no arquivo YUM .repo ... - mas tudo dentro da infraestrutura YUM, sem scripts externos para executar antes de 'yum install') - seria muito apreciado !

    
por Shimi 20.08.2013 / 18:58

2 respostas

2

and in that package spec file, in the %pre section, I did the various tests I wanted to perform, outputting test errors when applicable, and then 'exit 1'.

Isto não funciona, o rpm não pára / desenrola a transação quando% de pré-scripts falham assim. O rpm não se comporta com transações ACID de várias maneiras, das quais é uma delas. Você precisará adicionar conflitos para interromper a transação no estágio depsolve.

    
por 22.08.2013 / 16:08
0

Basicamente você não quer uma bandeira mágica para o yum, mas alguma forma de um script% pretrans que verifica suas necessidades, correto? % pretrans está disponível desde as rpm 4.4. Verifique link ou talvez link

Para mais informações, veja as discussões e desvantagens no link

Então crie um scriptlet% pretrans, empilhe todos os seus testes lá (runlevel, hostname) e o que e quando o $ total? é igual a 0 a transação será iniciada, se não falhará.

Embora esta abordagem pareça definitivamente uma falha lógica.

Para sua pergunta porque o yum não irá parar com o primeiro pacote falhando: Porque você basicamente diz para instalar, digamos uma dúzia de pacotes. Um deles falha, mas os outros não dependem dele (caso contrário você acabaria com dependências circulares que também podem ser complicadas) para que os outros sejam instalados. Isso é um comportamento normal. Você pode alterar todos os pacotes dependentes para dizer Requires(pre): yourmetapackagehere >= some.version

Para alterar a ordem da instalação de todas as dependências, você pode usar a verificação "dependências marcadas pelo contexto" (dependências pedidas), e. link

    
por 09.09.2014 / 01:09