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

3

Eu estou tentando encontrar um bom método para encontrar o repositório para cada pacote que foi armazenado no meu sistema que pode ser facilmente analisado.

Histórico:

Eu tenho sistemas wheezy do Debian e configuro o repositório wheezy-backports, para que eu possa obter uma versão mais nova de um pacote. Eu cometi um erro com meus padrões na configuração de fixação, o que eu não notei. Eu fixei * para o repositório backports. Algumas semanas depois, eu publiquei um apt-get -y dist-upgrade e não estava prestando atenção e atualizei muito mais pacotes para os wheezy-backports nos quais eu estava interessado.

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

Sobre o método mais próximo que encontrei até agora é assim. %código%. Que é um pouco próximo, mas idealmente eu gostaria de obter um relatório como este para todos os pacotes.

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

Em que Origem / Suite são os valores dos arquivos de Liberação do repositório.

    
por Zoredache 05.01.2015 / 22:20

1 resposta

4

O seguinte script python analisa a saída de apt-cache policy e 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-versions ainda é mantido, verifique a lista de discussão oficial . Mas não pode ajudar porque não produz a origem do pacote.
por 19.02.2015 / 13:16

Tags