
システムに保存されている各パッケージのリポジトリを簡単に解析できる適切な方法を見つけようとしています。
背景:
私は 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
パッケージとして利用できます。実行すると、基本的に現在インストールされているリリース以外のすべてのパッケージが表示されます。