Encuentre la fuente de todos los paquetes instalados en sistemas basados ​​en Debian

Encuentre la fuente de todos los paquetes instalados en sistemas basados ​​en Debian

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-upgradey 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 policyy 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-versionsAl 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-forktracerestá disponible como paquete. Cuando se ejecuta, básicamente mostrará todos los paquetes que no pertenecen a la versión instalada actualmente.

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

información relacionada