Onde as informações de 'apt show packagename' estão armazenadas?

1

Eu tenho o seguinte problema: Eu escrevi um script, que extrai informações sobre os pacotes instalados do meu sistema (Ubuntu 16.04 LTS). Estou particularmente interessado na fonte do pacote. Isso significa que os dados de APT-Sources de apt show <packagename> são cruciais para mim.

A partir de agora, meu script precisa chamar apt show para cada pacote instalado, o que cria uma carga de trabalho quase inaceitável em comparação com o tamanho de uma tarefa que deve ser [a carga da CPU atinge quase 100%].

Eu esperava que houvesse algum arquivo no sistema, com todas as informações armazenadas, que são geradas por apt show . Ler e analisar esse arquivo deve ser mais rápido do que chamar apt show milhares de vezes. Existe tal arquivo?

Observe que já tentei usar dpkg e apt-cache , mas ambos não fornecem as informações APT-Sources .

edit: Talvez alguma elaboração possa ser útil. Meu script Python chama apt list --installed para obter a lista de pacotes instalados e analisa essa saída em uma lista, contendo apenas os nomes dos pacotes como strings.

Em seguida, chama apt show para todos os elementos desta lista.

Eu teria gostado, para ter apenas um único arquivo, ler uma vez , que contém informações sobre os pacotes instalados. Eu então teria meu script analisar este arquivo, adicionar as informações ao elemento list e ser feito em uma iteração. Minha esperança era que ler um arquivo grande uma vez e analisá-lo é mais rápido do que chamar um comando da CLI centenas de vezes.

Como tal, presumo que grep ing em múltiplos ficheiros várias vezes não diminuiria realmente a carga de trabalho.

    
por Alex Poth 20.07.2017 / 09:09

2 respostas

0
  

Eu basicamente implementei um sistema para vigiar os pacotes instalados em nosso ambiente, coletando informações sobre eles e checando, se alguns deles forem instalados com uma versão incorreta. Como alguns desses pacotes vêm de nossos próprios repositórios internos, é necessário saber de onde veio o pacote.

Usando a API APT do Python:

#! /usr/bin/python3
import apt
cache = apt.cache.Cache()
for pkg in cache:
    if pkg.is_installed:
         name = pkg.name
         version = pkg.installed.version
         origins = [o.site for o in pkg.installed.origins if o.site]
         print(name, version, origins)

Exemplo de saída:

$ ./foo.py| head
a11y-profile-manager-indicator 0.1.10-0ubuntu3 ['jp.archive.ubuntu.com']
account-plugin-facebook 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-flickr 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-google 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
accountsservice 0.6.40-2ubuntu11.3 ['jp.archive.ubuntu.com']
acl 2.2.52-3 ['jp.archive.ubuntu.com']
acpi-support 0.142 ['jp.archive.ubuntu.com']
acpid 1:2.0.26-1ubuntu2 ['jp.archive.ubuntu.com']
activity-log-manager 0.9.7-0ubuntu23.16.04.1 ['jp.archive.ubuntu.com']
adduser 3.113+nmu3ubuntu4 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
    
por muru 20.07.2017 / 10:15
1

Aqui:

ls /var/lib/apt/lists

depende do repositório e da seção, por exemplo, para reunir dados sobre wget in main seção para amd64 arquitetura que você pode usar:

grep -A20 "Package: wget" /var/lib/apt/lists/*_ubuntu_dists_xenial-updates_main_binary-amd64_Packages

ou como Muru sugeriu usar awk para um resultado mais flexível:

awk -v RS='\n\n' -v pkg=wget ' == pkg' /var/lib/apt/lists/*_ubuntu_dists_xenial_main_binary-amd64*
  • Usando RS (separador de registro), podemos facilmente obter todos os dados relacionados ao nosso pacote.

Observe que apt também usa alguns caches binários compostos dos arquivos acima para aumentar a velocidade de suas consultas. Esses caches estão localizados aqui:

ls /var/cache/apt/
    
por Ravexina 20.07.2017 / 09:10