特定の Ubuntu リポジトリが使用されているかどうかを確認するにはどうすればいいですか?

特定の Ubuntu リポジトリが使用されているかどうかを確認するにはどうすればいいですか?

私たちは Ubuntu パッケージ用に独自のリポジトリを使用していますが、各ワークステーションでリポジトリが実際に使用されているかどうかを確認する方法が必要です。 を使用できますapt-cache policy|grep 'our-repository-address'が、同僚の中には「grep」が原因でそれを好まない人もいます。彼らには信頼性の低いハックのように見えます... この確認には他の方法がありますか、それともapt-cache policy|grep 'our-repository-address'標準的な方法ですか?

答え1

リポジトリによって提供される各パッケージを個別にチェックする必要があります。
パッケージがローカルで再構築されたもので、バージョン文字列が別のリポジトリと同じである場合は、手動でmd5sumsをチェックする必要があります。/var/lib/dpkg/info/PACKAGE.md5sums(パッケージが何もコンパイルされず、リポジトリ構造が異ならない場合は、起源を明らかにする方法はありません)。

バージョン文字列が異なる場合は、次のコード スニペットを使用できます。

#!/usr/bin/python
# Check original repository of installed packages from list.
# Usage: script PACKAGELIST

import apt
import sys
import re

# set values for local repository
component = "main"
archive = "experimental"
origin = "Debian"
label = "Debian"
site = "ftp.debian.org"

def main():
  try:
    pkglist = []
    f = open(sys.argv[1], "r")
    for line in f:
      if re.match('^Package: ', line):
        pkglist.append(re.sub('^Package: ', '', line).rstrip('\n'))
    f.close()

    cache = apt.Cache()
    for package in pkglist:
      pkg = cache[package]

      # check if package is installed
      if not pkg.installed:
        continue

      if pkg.installed.origins[0].component != component or \
          pkg.installed.origins[0].archive != archive or \
          pkg.installed.origins[0].origin != origin or \
          pkg.installed.origins[0].label != label or \
          pkg.installed.origins[0].site != site:
        print package
        #continue
      #else:
      #  print package + " is in repo."

  except KeyboardInterrupt:
    print "\nShutdown requested...exiting"
  except Exception, e:
    sys.stderr.write("An unecpected exeption was encountered: %s" % str(e) + "\n")
    sys.exit(1)

if __name__ == "__main__":
  main()

使用例script PACKAGELIST:

script /var/lib/apt/lists/ftp.debian.org_debian_dists_experimental_main_binary-amd64_Packages

また、ローカル アーカイブのコンポーネント、アーカイブなどを調整する必要があります ( の関連リリース ファイルを参照してください/var/lib/apt/lists)。

パッケージがインストールされているが、リポジトリからのものではない場合は、パッケージ名が取得されます。そうでない場合は、すべて正常です。

答え2

/etc/sources.listデフォルトの Ubuntu リポジトリの代わりに自分のリポジトリを使用する場合は、ファイルの先頭に自分のリポジトリ行を配置する必要があることは既にご存知だと思います。質問と回答はこちらそのトピックについて。

すでにリポジトリを「sources.list」ファイルの先頭に置いている場合は、次のようにコマンド--print-urisでスイッチを使用してパッケージのインストールが行われているかどうかを確認できます。apt-get

sudo apt-get install scribes --print-uris 

このコマンドは私のマシンでは次の結果を返します(小さなローカルリポジトリも持っています)

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  python-gtksourceview2
Suggested packages:
  libgtksourceview2.0-dev
The following NEW packages will be installed:
  python-gtksourceview2 scribes
0 upgraded, 2 newly installed, 0 to remove and 634 not upgraded.
Need to get 0 B/1,191 kB of archives.
After this operation, 8,954 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
'file:/media/Main/Linux-Software/Ubuntu/Precise/./precise-debs/python-gtksourceview2_2.10.1-2build1_i386.deb' python-gtksourceview2_2.10.1-2build1_i386.deb 90224 MD5Sum:3db673894b791f8843c3b0dcd8958e38
'file:/media/Main/Linux-Software/Ubuntu/Natty/natty/./scribes_0.4~r910-0ubuntu2_all.deb' scribes_0.4~r910-0ubuntu2_all.deb 1100712 MD5Sum:6555b7060ecd662fe1597724e9846b9c

最後の 2 行は、必要な 2 つのファイルに使用されているリポジトリを明確に示しています。

これがあなたの問題の解決に少しでも役立つことを願っています。

関連情報