Crie um arquivo JSON de todo o software dpkg instalado

3

Estou tentando coletar todos os pacotes instalados através do dpkg em um arquivo JSON.

Eu tentei este script:

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

Embora eu tenha notado rapidamente que os espaços reservados estão sem escape e alguns campos (como as dependências) precisariam de algum processamento para ser realmente útil.

Então eu estava pensando em apenas obter uma lista simples com o comando dpkg-query -W -f '${binary:Package}' e iterar sobre ela e processar cada campo individualmente. Embora eu esteja preocupado que vai ter um impacto severo no desempenho tendo 10ish dpkg-query chamadas por pacote.

Então, como eu poderia conseguir isso da maneira mais portátil possível? (O script terminará como parte de uma ferramenta de monitoramento em muitas máquinas diferentes. O suporte para outros gerenciadores de pacotes seguirá).

EDITAR:

Como os espaços reservados parecem ser projetados para serem compatíveis com RFC 822 (e outros softwares, como apt-cache show <package> , produzem saída compatível com RFC 822), acho que uma solução sh para transformar o RFC 822 em JSON seria incrível solução.

EDIT 2:

Acabei de notar que isso seria bom, mas infelizmente não facilita o processamento de valores individuais.

Assim como o RFC 822 para variáveis com escape adequado ou algo assim, o que poderia fazer tudo funcionar.

EDIT 3:

Chamar de forma repetida dpkg-query absolutamente mata o desempenho. Ter uma única chamada faz com que o script seja executado em menos de um segundo. Executá-lo uma vez para cada pacote faz com que o script fique bem acima de 30s com 100% de CPU. Isso não é aceitável ...

    
por BrainStone 22.08.2018 / 15:55

1 resposta

2

Há alguns meses, escrevi um script ruby simples para fazer um trabalho muito semelhante à nossa ferramenta de monitoramento. Eu só precisava do nome e da versão. Eu adicionei o short_description e o autor. Quaisquer outros campos podem exigir mais processamento. É um ponto de partida para algo que você pode construir, se desejar.

#!/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)
    
por 24.08.2018 / 01:27