Debianベースのシステムにインストールされているすべてのパッケージのソースを見つける

Debianベースのシステムにインストールされているすべてのパッケージのソースを見つける

私は簡単に解析できる私のシステムに保存されているすべてのパッケージのリポジトリを見つける良い方法を見つけようとしています。

背景ストーリー:

私はDebian wheezyシステムを持っていて、最新バージョンのパッケージを入手できるようにwheezy-backportsリポジトリを設定しました。固定構成でモードを間違って書いたのに気づかなかった。バックポートリポジトリを修正しました*。数週間後、私はapt-get -y dist-upgrade気づかずに1つをリリースし、興味があったwheezeバックポートにさらにパッケージをアップグレードしました。

コンテンツを簡単に復元できるようにバックアップがありますが、この状況では、各パッケージがどのリポジトリから来たのかを調べる方法を探しています。

これまで私が見つけた最も近い方法はこれです。 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 - ショー - 起源

#!/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

関連情報