
Я пытаюсь найти хороший метод поиска репозитория для каждого пакета, хранящегося в моей системе, который можно было бы легко проанализировать.
Предыстория:
У меня есть системы 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
доступна как пакет. При запуске она покажет все пакеты, которые не входят в текущий установленный релиз.