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 ...