Найти исходный код всех установленных пакетов в системах на базе Debian

Найти исходный код всех установленных пакетов в системах на базе Debian

Я пытаюсь найти хороший метод поиска репозитория для каждого пакета, хранящегося в моей системе, который можно было бы легко проанализировать.

Предыстория:

У меня есть системы Debian wheezy, и я настроил репозиторий wheezy-backports, чтобы получить более новую версию пакета. Я допустил ошибку в своих шаблонах в конфигурации закрепления, которую не заметил. Я закрепил *для репозитория backports. Несколько недель спустя я выпустил apt-get -y dist-upgradeи не обратил внимания и обновил гораздо больше пакетов до wheezy-backports, чем мне было интересно.

У меня были резервные копии, поэтому я мог легко восстановить данные, но в этой ситуации мне действительно захотелось найти способ узнать, из какого репозитория был получен каждый пакет.

Самый близкий метод, который я нашел на данный момент, выглядит так. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' ). Что довольно близко, но в идеале я хотел бы получить такой отчет для всех пакетов.

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

Где Origin/Suite — значения из файлов релиза репозитория.

решение1

Следующий скрипт Python анализирует вывод apt-cache policyи генерирует список всех установленных пакетов в формате вывода

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

Примечания:

  • Вопреки тому, что сказано в комментариях apt-show-versions, все еще сохраняется, проверьтеофициальный список рассылки. Но это не может помочь, поскольку не выводит источник пакета.

решение2

Прошло некоторое время с тех пор, как я задавал этот вопрос. В любом случае, пару лет назад был добавлен инструмент, который также решил бы мою основную проблему, которая заключалась в поиске дополнительных/устаревших/чужих пакетов, установленных в системе.

Команда apt-forktracerдоступна как пакет. При запуске она покажет все пакеты, которые не входят в текущий установленный релиз.

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

Связанный контент