Где информация от 'способного шоу <packagename>' сохранена?

У меня есть следующая проблема: Я записал сценарий, который извлекает информацию об установленных пакетах моей системы (Ubuntu 16.04 LTS). Я особенно интересуюсь источником пакета. Это означает, что данные Источников APT от apt show <packagename> крайне важно для меня.

На данный момент мой сценарий должен звонить apt show для каждого установленного пакета, который создает почти недопустимую рабочую нагрузку по сравнению с тем, насколько маленький из задачи это должно быть [загрузка ЦП достигает почти 100%].

Я надеялся, что был некоторый файл в системе, которая имеет всю хранившую информацию, который производится apt show. Чтение и парсинг того файла должны быть быстрее, чем вызов apt show тысячи времен. Есть ли такой файл?


Отметьте, который я уже попытался использовать dpkgи apt-cache, но оба не предоставляют информацию об Источниках APT.


править: Возможно, некоторая разработка могла бы быть полезной. Мои вызовы сценария Python apt list --installed для получения списка установленных пакетов и синтаксических анализов, этот вывод в список, содержа только пакет называет как строки.

Затем это звонит apt show для каждого элемента в этом списке.

Мне понравилось бы, чтобы только иметь единственный файл, читайте однажды, который содержит информацию об установленных пакетах. У меня затем был бы свой сценарий, анализирует этот файл, добавляет информация к элементу списка и быть сделанной в одном повторении. Моя надежда была, то чтение большого файла однажды и парсинг его, быстрее, чем вызов команды CLI много сотен времен.

По сути, я принимаю, это grepлуг по нескольким файлам многократно действительно не уменьшил бы рабочую нагрузку.

1
задан 20 July 2017 в 10:59

2 ответа

Я в основном реализовал систему для слежения за установленными пакетами в нашей среде, собрав информацию о них и проверке, если некоторые из тех установлены с неверной версией. Так как некоторые из этих пакетов прибывают из наших собственных репозиториев интерна, необходимо знать, куда пакет прибыл из.

Использование APT Python API:

#! /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)

Пример произвел:

$ ./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']
0
ответ дан 7 December 2019 в 15:32

Здесь:

ls /var/lib/apt/lists

зависьте от репозитория и раздела, например, для сбора данных вокруг wget в main раздел для amd64 архитектура можно использовать:

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

или поскольку Muru предложил использование awk для более гибкого результата:

awk -v RS='\n\n' -v pkg=wget '$2 == pkg' /var/lib/apt/lists/*_ubuntu_dists_xenial_main_binary-amd64*
  • Используя RS (Разделитель записей) мы можем легко получить все данные, связанные с нашим пакетом.

Отметьте это apt также использование некоторые двоичные кэши, сделанные из вышеупомянутых файлов увеличить скорость его запросов, эти кэши расположены здесь:

ls /var/cache/apt/
1
ответ дан 7 December 2019 в 15:32

Другие вопросы по тегам:

Похожие вопросы: