インストールされているすべてのdpkgソフトウェアのJSONファイルを生成する

インストールされているすべてのdpkgソフトウェアのJSONファイルを生成する

dpkgを介してインストールされたすべてのパッケージをJSONファイルに収集しようとしています。

私は次のスクリプトを試しました。

echo [ > installed_packages.json
dpkg-query -W -f '{"name":"${binary:Package}","version":"${Version}","short_description":"${binary:Summary}","description":"${Description}","author":"${Maintainer}","location":"${Filename}","status":{"want":"${db:Status-Want}","status":"${db:Status-Status}","eflag":"${db:Status-Eflag}"},"dependencies":"${Depends}","tags":"${Depends}"},\n' >> installed_packages.json
echo ] >> installed_packages.json

プレースホルダがエスケープされておらず、一部のフィールド(依存関係など)が実際に役に立つにはいくつかの処理が必要であることに気づきました。

そのため、コマンドを使用して簡単なリストを取得し、それを繰り返してdpkg-query -W -f '${binary:Package}'各フィールドを個別に処理したいと思います。dpkg-queryパッケージごとに10の呼び出しを使用すると、パフォーマンスに重大な影響を与える可能性があることが心配されます。

それでは、可能な限り移植性の高い方法でこれを達成するにはどうすればよいですか? (このスクリプトは最終的にさまざまなシステムで監視ツールの一部になります。他のパッケージマネージャもサポートされる予定です。)

編集する:

プレースホルダはRFC 822に準拠するように設計されているようです(たとえば、他のソフトウェアはとにかくRFC 822準拠の出力を生成します)、RFC 822をJSONに変換するソリューションは驚くべき解決策になるとapt-cache show <package>思いました。sh

編集2:

これで良いことがわかりましたが、残念ながら個々の値で作業する方が簡単ではありません。

したがって、RFC 822などの変数を適切にエスケープすると、すべてが機能します。

編集3:

繰り返しの呼び出しは間違いなくdpkg-queryパフォーマンスを低下させます。単一の呼び出しでスクリプトを実行するのに1秒もかかりません。パッケージごとに一度実行すると、スクリプトは100%CPUで30秒以上かかります。これは容認できないことです...

ベストアンサー1

数ヶ月前、私はモニタリングツールと非常によく似たタスクを実行するための簡単なRubyスクリプトを書いていました。名前とバージョンだけが必要です。簡単な説明と作者を追加しました。他のフィールドには追加の処理が必要な場合があります。これはあなたのニーズに合わせて構築できる出発点です。

#!/usr/bin/env ruby

require 'open3'
# json is only necessary for the pretty_generate at end, remove if not needed
require 'json'

allpkgs = {}
# Edit this command to serve your own purposes
cmd = ("dpkg-query -W -f='${binary:Package};${Version};${binary:Summary};${Maintainer}\n'")

dpkgout, stderr, status = Open3.capture3(cmd)
dpkgout.split("\n").each do |line|
  pkginfo = line.split(';')
  allpkgs[pkginfo[0]] = { 'version': pkginfo[1], 'short_description': pkginfo[2], 'author': pkginfo[3] }
end

# pretty JSON print, otherwise use 'puts allpkgs'
puts JSON.pretty_generate(allpkgs)

おすすめ記事