Como obter as informações de versão do pacote opkg sem instalá-lo?

1

Eu quero escrever um script para verificar a versão de um pacote opkg antes de instalá-lo.

Eu fiz muita pesquisa e encontrei algumas respostas no sistema dpkg, mas nenhuma no sistema opkg.

Eu tentei opkg info , opkg status , opkg list , mas todos parecem funcionar em pacotes instalados, mas não com .opk arquivos.

De alguma forma, posso obter as informações por opkg install file.opk --noaction , mas é muito lento e a saída pode ser difícil de analisar de forma confiável porque a instalação de teste pode falhar por diferentes motivos.

E opkg compare-versions compara apenas strings, portanto, nenhuma solução.

Atualização:

Eu pensei mais sobre isso.

O pacote opk é basicamente um arquivo .tar.gz e o número da versão é armazenado em um dos arquivos de texto (no arquivo CONTROL/control ).

Portanto, para obter as informações de versão do pacote, é inevitável descompactá-lo, por isso, é necessário algum tempo.

Embora uma solução rápida seja colocar o número da versão como parte do nome do arquivo do pacote, analise o nome, mas o nome do arquivo pode ser facilmente alterado.

Meu plano é usar uma abordagem de duas passagens: 1) incluir o número da versão como parte do nome do pacote e analisar o nome do pacote para obter um número de versão "não muito confiável"; 2) se estiver com boa aparência, faça uma instalação "dry run" para obter o número da versão real, como no arquivo CONTROL/control . Se também estiver bom, prossiga para a instalação real.

Um dos problemas com essa abordagem é que, efetivamente, dobrou a quantidade de tempo para fazer uma instalação real: antes que uma instalação real possa executar uma execução a seco, é executada primeiro, o que leva um tempo igual.

Atualização 2:

A atualização acima não é totalmente verdadeira porque opk é um ar archive que tem dois arquivos em debian-binary control.tar.gz data.tar.gz e as informações da versão estão em control.tar.gz .

Por isso, é possível extrair rapidamente control.tar.gz de opk , depois extrair control de control.tar.gz e obter o número da versão daí.

    
por user3528438 23.03.2016 / 00:32

1 resposta

0

#!/bin/sh

# command that checks opk version number
#set -e

VERSION=3
version ()
{
  echo
  echo "'basename $1' version $VERSION"
  echo "command that checks opk version number"
  echo

  exit 0
}

usage ()
{
  echo "
Usage: 'basename $1' <options> [ files for install partition ]

Mandatory options:
  --opk_file         file name (e.g ./my_package.opk)

Optional options:
  --version             Print version. 
"
  exit 1
}


# Process command line...
while [ $# -gt 0 ]; do
  case $1 in
    --help | -h)
      usage $0
      ;;
    --opk_file) shift; opk_file=$1; shift; ;;
    --version) version $0;;
    *) copy="$copy $1"; shift; ;;
  esac
done

test -z $opk_file && usage $0
###########################
end parsing command line
###########################
ar -x $opk_file control.tar.gz    #extract control.tar.gz from .opk
tar -zxvf control.tar.gz ./control > /dev/null 2>&1
# extract control file from control.tar.gz, silent stderr/stdout
cat control |grep Version | sed -e "s/Version:\s*\(\d*\)\D*//"
# grep Version keyword and remove it
rm control
rm control.tar.gz
# clean up

Uso:

opkversion.sh --opk_file ./mypackage.opk

Exemplo de saída:

9999

Ajuste o comando sed para alterar a política de filtragem do comando (o número da versão de um pacote opk pode ser muito complicado).

    
por 29.03.2016 / 23:06

Tags