Encontre a fonte de todos os pacotes instalados em sistemas baseados em Debian

Encontre a fonte de todos os pacotes instalados em sistemas baseados em Debian

Estou tentando encontrar um bom método para encontrar o repositório de cada pacote armazenado em meu sistema que possa ser facilmente analisado.

História de fundo:

Eu tenho sistemas wheezy Debian e configurei o repositório wheezy-backports, para poder obter uma versão mais recente de um pacote. Cometi um erro com meus padrões na configuração de fixação, que não percebi. Eu fixei *no repositório backports. Algumas semanas depois, emiti um apt-get -y dist-upgradee não estava prestando atenção e atualizei muito mais pacotes para wheezy-backports do que estava interessado.

Eu tinha backups, então poderia restaurar as coisas facilmente, mas essa situação me fez realmente querer encontrar uma maneira de descobrir de qual repositório cada pacote veio.

O método mais próximo que encontrei até agora é assim. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' ). O que é um pouco próximo, mas o ideal seria obter um relatório como este para todos os pacotes.

Package<tab>Version<tab>Origin<tab>Suite

Onde Origin/Suite são os valores dos arquivos Release do repositório.

Responder1

O script python a seguir analisa a saída apt-cache policye gera a lista de todos os pacotes instalados com o formato de saída

Package<tab>Version<tab>Origin<tab>Suite

apt-show-origins

#!/usr/bin/env python

# Should be written with python-apt
# but for now parse the output of apt-cache policy

import os
import re
command    = "apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )"
stream     = os.popen(command);
content    = stream.readlines()
getOrigin  = False
pkgList    = []

#Parse the output generated by apt-cache
for s in content:
  if(not s.startswith(' ')):
    pkg = type('', (), {})()   #Create an empty object 
    pkg.name = s[:-2]          #Remove trailing ':\n'
  elif(getOrigin):
    pkg.origin = re.split('\s+',s)[2]
    pkg.suite = re.split('\s+',s)[3]
    pkgList.append(pkg)
    getOrigin = False
  elif(s.startswith(' ***')):
    pkg.version = re.split('\s+',s)[2]
    getOrigin = True

#Display the list
for pkg in pkgList:
  print pkg.name    + '\t'\
      + pkg.version + '\t'\
      + pkg.origin  + '\t'\
      + pkg.suite

Notas:

  • Ao contrário do que é dito nos comentários apt-show-versionsainda se mantém, verifique olista de discussão oficial. Mas não pode ajudar porque não mostra a origem do pacote.

Responder2

Já faz um tempo desde que postei esta pergunta. De qualquer forma, uma ferramenta foi adicionada há alguns anos que também teria resolvido meu problema subjacente, que era encontrar pacotes extras/desatualizados/estrangeiros instalados no sistema.

O comando apt-forktracerestá disponível como um pacote. Quando executado, basicamente mostrará todos os pacotes que não são da versão atualmente instalada.

https://packages.debian.org/stable/apt-forktracer

informação relacionada