
Ich versuche, eine gute Methode zu finden, um das Repository für jedes auf meinem System gespeicherte Paket zu finden, das leicht analysiert werden kann.
Hintergrundgeschichte:
Ich habe Debian-Wheezy-Systeme und habe das Wheezy-Backports-Repository eingerichtet, damit ich eine neuere Version eines Pakets erhalten konnte. Ich habe bei meinen Mustern in der Pinning-Konfiguration einen Fehler gemacht, den ich nicht bemerkt habe. Ich habe *
für das Backports-Repository gepinnt. Ein paar Wochen später habe ich eine Fehlermeldung ausgegeben apt-get -y dist-upgrade
und nicht aufgepasst und weitaus mehr Pakete auf die Wheezy-Backports aktualisiert, als ich wollte.
Ich hatte Backups, sodass ich die Dinge problemlos wiederherstellen konnte, aber diese Situation weckte in mir den Wunsch, herauszufinden, aus welchem Repository jedes Paket stammte.
Die Methode, die mir bisher am nächsten kommt, ist ungefähr diese. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )
Das kommt der Sache ziemlich nahe, aber im Idealfall würde ich gerne einen solchen Bericht für alle Pakete erhalten.
Package<tab>Version<tab>Origin<tab>Suite
Dabei sind Origin/Suite die Werte aus den Release-Dateien des Repository.
Antwort1
Das folgende Python-Skript analysiert die Ausgabe apt-cache policy
und generiert die Liste aller installierten Pakete mit dem Ausgabeformat
Package<tab>Version<tab>Origin<tab>Suite
apt-show-ursprünge
#!/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
Anmerkungen:
- Im Gegensatz zu dem, was in den Kommentaren gesagt wird,
apt-show-versions
wird immer noch beibehalten, überprüfen Sie dieoffizielle Mailingliste. Aber es hilft nichts, da es den Ursprung des Pakets nicht ausgibt.
Antwort2
Es ist schon eine Weile her, seit ich diese Frage gestellt habe. Jedenfalls wurde vor ein paar Jahren ein Tool hinzugefügt, das auch mein zugrunde liegendes Problem gelöst hätte, nämlich zusätzliche/veraltete/fremde Pakete zu finden, die auf dem System installiert sind.
Der Befehl apt-forktracer
ist als Paket verfügbar. Wenn er ausgeführt wird, werden grundsätzlich alle Pakete angezeigt, die nicht aus der aktuell installierten Version stammen.