Script de bash para verificar se um rpm está pelo menos em uma determinada versão

4

Eu preciso escrever um script para verificar se um RPM é pelo menos uma versão no Linux.

  • PERGUNTA 1: Como posso obter a versão do RPM em uma variável $ RPM_VERSION, de modo que ela contenha a versão até ".src.rpm"?
  • PERGUNTA 2: Qual é a melhor abordagem para comparar as duas versões?

Por exemplo: rpm-4.2-9.69.src.rpm comparado a rpm-4.14-0.69.src.rpm. Esta é minha tentativa, mas não funciona:

STR_BASE_ACCEPTABLE_VER="rpm-4.2-0.69.src.rpm"

if  [[ "$RPM_VERSION" < "$STR_BASE_ACCEPTABLE_VER" ]]; then   
    echo "$RPM_VERSION is too low..."  \
else   
    echo "$RPM_VERSION is fine"  \
fi
    
por bashquestion 23.10.2014 / 03:00

2 respostas

5

Versões de análise

Caminho Hackey

Para a primeira parte, eu consultaria o RPM para as informações da versão em particular, assim.

$ rpm -qi vim-enhanced | grep Version
Version     : 7.4.417

Você pode analisar isso assim:

$ rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}'
7.4.417

Isso pode ser capturado em uma variável assim:

$ RPM_VERSION=$(rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}')

$ echo $RPM_VERSION
7.4.417

Usando formatos de consulta

A ferramenta rpm também fornece um recurso chamado --queryformat , que permite personalizar a saída gerada. Sabendo disso, você pode dizer a rpm para imprimir a macro "VERSION" assim:

$ rpm -q --queryformat '%{VERSION}' vim-enhanced
7.4.417

Colocando-o em uma variável:

$ RPM_VERSION=$(rpm -q --queryformat '%{VERSION}' vim-enhanced)

OBSERVAÇÃO: você pode ver todas as tags de consulta usando a opção --querytags para rpm , por exemplo:

$ rpm --querytags | head -5
ARCH
ARCHIVESIZE
BASENAMES
BUGURL
BUILDARCHS

Comparando versões

Fazer a comparação será mais complicado. Felizmente há uma ferramenta no pacote rpmdevtools chamado rpmdev-vercmp que pode ajudar muito você.

Uso

$ rpmdev-vercmp --help

rpmdev-vercmp <epoch1> <ver1> <release1> <epoch2> <ver2> <release2>
rpmdev-vercmp <EVR1> <EVR2>
rpmdev-vercmp # with no arguments, prompt

Exit status is 0 if the EVR's are equal, 11 if EVR1 is newer, and 12 if EVR2
is newer.  Other exit statuses indicate problems.

Se você notar os status de saída que ele retorna, você pode descobrir qual versão é mais nova simplesmente perguntando a esta ferramenta, dando a ela os 2 nomes dos RPMs.

Exemplo

$ rpmdev-vercmp rpm-4.2-9.69 rpm-4.14-0.69
rpm-4.2-9.69 < rpm-4.14-0.69
$ echo $?
12

Portanto, com base no código de saída de 12, o segundo argumento seria o mais recente dos dois.

Juntando

Sua solução seria algo assim:

rpmdev-vercmp $RPM_VERSION $STR_BASE_ACCEPTABLE_VER > /dev/null
if [[ $? == 12 ]]; then
  echo "$RPM_VERSION is too low..."
else 
  echo "$RPM_VERSION is fine"
fi

Então, se fôssemos definir variáveis da seguinte forma:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.2-9.69"
$ RPM_VERSION="rpm-4.14-0.69"

$ ./cmp_rpmvers.bash    
rpm-4.14-0.69 is fine

SE eu trocá-los:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.14-0.69"
$ RPM_VERSION="rpm-4.2-9.69"

$ ./cmp_rpmvers.bash
rpm-4.2-9.69 is too low...
    
por 23.10.2014 / 03:12
2

Para Pergunta # 2 (se você não tiver rpmdevtools e não puder instalá-lo):

Na instalação mínima você ainda deve ter o yum, assim você também deve ter o pacote python python e rpm. Então, comparando 2 versões poderia ser assim:

python -c "import sys,rpm; print rpm.labelCompare((None, '$VER1', '$REL1'), (None, '$VER2', '$REL2'));"

Dado o nome do pacote "rpm-4.14-0.69", $ VER é uma parte da versão (4.14) e $ REL é uma parte da versão (0.69). Você pode extraí-los dividindo o nome do pacote por '-'. Eu coloquei None para partes de epoch aqui, pois seu exemplo não contém epoch no nome do pacote.

O resultado de labelCompare será 0, 1 ou -1.

Na verdade, você pode tentar baixar rpmdev-vercmp ou rpmdev-sort ( link ) e usar sem instalar o rpmdevtools, pois são scripts python simples.

    
por 14.09.2015 / 10:23