Como posso obter um código de saída apt-get 'detalhado'?

12

Como posso obter um código de saída 'detalhado' para apt-getque erros como este

Package google-chrome is a virtual package provided by:
  google-chrome-stable 29.0.1547.76-r223446
  google-chrome-beta 30.0.1599.47-1
You should explicitly select one to install.

E: Package 'google-chrome' has no installation candidate

tem um código de saída diferente do que erros de download como este

Err http://dl.google.com/linux/chrome/deb/ stable/main google-chrome-stable amd64 29.0.1547.76-r223446
  Something wicked happened resolving 'dl.google.com:http' (-11 - System error)

Atualmente, os dois erros saem com 100

Basicamente, eu gostaria que os erros de download saíssem com um código diferente dos erros como o primeiro. Se possível, gostaria que cada erro específico tivesse um código de saída diferente, mas o exemplo acima é o mínimo necessário. Como posso fazer isso em uma instalação baunilha do Ubuntu sem software adicional (com exceção de aptitude)?

kiri
fonte
Você pode agrupar o comando apt-get em um script que analisa a saída. Ou isso conta como "software adicional"? Além disso, para detectar erros de download, considere fazer apt-get --download-onlyprimeiro.
21713 Jos
Ah, isso faz sentido. Talvez você possa verificar a existência do pacote X primeiro fazendo apt-cache policy X?
21713 Jos
Novamente, você precisaria grep a saída. Suponho que fazer apt-cache policy google-chromenão lhe dê uma linha com a palavra "Candidato", enquanto o apt-cache policy google-chrome-stablefaria.
21713 Jos
ESTÁ BEM. Estou movendo esta discussão para o bate-papo e inserindo essa sugestão como uma resposta (parcial).
21713 Jos

Respostas:

1

Não é uma resposta completa, mas você pode testar primeiro a existência de pacotes executando apt-cache policy Xe cumprimentando a saída para "Candidate (none)" ou "Não foi possível encontrar o pacote X" etc.

Jos
fonte
Votado por enquanto, mas como você disse, é parcial. Sinta-se livre para excluir todos os seus comentários que estão em uma resposta agora. Obrigado pela sua ajuda
kiri
15

Eu acredito que este não é um caso de XY, e você só deseja poder depurar o apt-get em geral. Sob tais suposições, aqui está minha resposta.

De man apt.conf:

OPÇÕES DE DEBUG

A ativação das opções na seção Debug :: fará com que as informações de depuração sejam enviadas ao fluxo de erros padrão do programa utilizando as bibliotecas do apt ou habilite modos de programa especiais que são úteis principalmente para depurar o comportamento do apt.

Portanto, você só precisa ativar as regras para cada um dos comportamentos de depuração de apt-get:

  • Debug :: pkgProblemResolver : ativa a saída sobre as decisões tomadas pelo dist-upgrade, upgrade, instalação, remoção, remoção.
  • Debug :: NoLocking : desativa todo o bloqueio de arquivos. Isso pode ser usado para executar algumas operações (por exemplo, apt-get -s install) como um usuário não root.
  • Debug :: pkgDPkgPM : imprime a linha de comando real toda vez que o apt chama o dpkg (1).

Esses três são os primeiros que a página do manual recomenda e o primeiro ajudará você a depurar o primeiro erro que você mostrar. Por um segundo, você pode precisar de:

  • Debug :: Adquirir :: http : imprime informações relacionadas ao download de pacotes usando HTTP. Há também https, ftp, cdrom.

A página de manual tem muito mais, você pode listá-las facilmente usando man apt.conf | grep -A5 -i debug.

Tudo isso deve ser escrito usando a sintaxe correta e eles aceitam valores booleanos:

Debug::*::*  "true";

ou se você quiser usar várias linhas:

Debug {
  Acquire {
    http "true";
    ftp "true";
  };
  NoLocking "true";
};

Se você deseja executar apenas para uma instância do apt-get, pode usar a opção -o/ --option:

sudo apt-get -o Debug::pkgProblemResolver=true -o Debug::Acquire::http=true -f install 

Outro método é criar seu arquivo de configuração personalizado e carregá-lo com a opção -c/ --config-file:

sudo apt-get -c debug-apt.conf install hello

Sobre a alteração dos códigos de saída, acredito que você não pode, a menos que altere o código-fonte. apt-geté uma peça de software de última geração , pois possui métodos avançados para depurar o processo sem a necessidade de confiar nos códigos de saída.

Braiam
fonte
Na verdade, estou tentando colocar esses comandos em um script que pode ser executado sem supervisão. Como eu usaria isso em um script bash para descobrir se o primeiro erro ocorreu?
kiri
Eu também gostaria de fazer isso apenas para uma instância específica de apt-get, não o tempo todo.
kiri
@ minerz029 você pode usar a -oopção para executar comandos ad-hoc. Atualizei minha resposta.
Braiam
Sobre o primeiro comentário, você deve fazer algo inteligente ao analisar a saída. Eu não tenho a ideia cega de como você pode fazer isso.
Braiam 21/09/13
Na verdade, eu consegui trabalhar com grepping a saída de apt-cache policy PACKAGE, como Jos disse. Eu estava tentando verificar se um pacote foi instalado, não pode ter pedido a minha pergunta certa, mas esta é uma boa resposta
kiri