
Estoy tratando de encontrar un buen método para encontrar el repositorio de cada paquete almacenado en mi sistema que pueda analizarse fácilmente.
Trasfondo:
Tengo sistemas Debian wheezy y configuré el repositorio wheezy-backports, para poder obtener una versión más nueva de un paquete. Cometí un error con mis patrones en la configuración de fijación, que no noté. Fijé *
para el repositorio de backports. Unas semanas más tarde emití un aviso apt-get -y dist-upgrade
y no presté atención y actualicé muchos más paquetes a los wheezy-backports de los que me interesaban.
Tenía copias de seguridad, por lo que podía restaurar las cosas fácilmente, pero esta situación me hizo querer encontrar una manera de encontrar de qué repositorio proviene cada paquete.
El método más cercano que he encontrado hasta ahora es este. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )
. Lo cual está un poco cerca, pero lo ideal sería recibir un informe como este para todos los paquetes.
Package<tab>Version<tab>Origin<tab>Suite
Donde Origin/Suite son los valores de los archivos de versión del repositorio.
Respuesta1
El siguiente script de Python analiza la salida apt-cache policy
y genera la lista de todos los paquetes instalados con el formato de salida.
Package<tab>Version<tab>Origin<tab>Suite
apt-show-origenes
#!/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:
apt-show-versions
Al contrario como se sigue manteniendo lo dicho en comentarios , revisa ellista de correo oficial. Pero no puede ayudar porque no muestra el origen del paquete.
Respuesta2
Ha pasado un tiempo desde que publiqué esta pregunta. De todos modos, hace un par de años se agregó una herramienta que también habría resuelto mi problema subordinado, que era encontrar paquetes adicionales/obsoletos/extraños instalados en el sistema.
El comando apt-forktracer
está disponible como paquete. Cuando se ejecuta, básicamente mostrará todos los paquetes que no pertenecen a la versión instalada actualmente.