설치된 모든 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)

관련 정보