Как мне надежно определить в Ubuntu, когда была выпущена последняя версия пакета?

Как создать команду в Ubuntu, чтобы сообщать, когда была выпущена последняя версия данного пакета?

(Мне нужно проверить это как часть доказательства того, что мы устанавливаем определенные обновления на определенные серверы в течение заданного времени.)

Прямо сейчас мой сценарий делает следующее:

  • issue apt-cache policy
  • извлечь URL-адреса репозитория для последней версии
  • проблема apt-cache show
  • извлечь путь URL-адреса для последней версии
  • объединить их
  • выполнить запрос HTTP HEAD для результирующие URL
  • сообщают значение заголовка Last-Modified

. Предполагается, что локальный индекс обновлен (например, sudo apt-get update или аналогичный Алент запущен достаточно недавно). Меня это устраивает.

Если не считать этого предположения, насколько это достоверно? Есть ли способ лучше?

0
задан 28 January 2021 в 22:44
2 ответа

Если вы готовы поскрести HTML, вы можете получить дату выпуска пакета для любого пакета с launchpad.

Рассмотрим недавно выпущенный пакет sudo. Для этого примера предположим, что вы используете Ubuntu 20.04 LTS (focal). У вас есть последний пакет, версия 1.8.31-1ubuntu1.2. Вы можете найти:

https://launchpad.net/ubuntu/+source/sudo/1.8.31-1ubuntu1.2/+publishinghistory

На этой странице вы найдете даты публикации во многих местах. Выберите ту, которую, по вашему мнению, будет легче всего разобрать вашему скрипту.

1
ответ дан 24 April 2021 в 01:25

Launchpad, основная платформа, используемая для отслеживания создания и выпуска пакетов для Ubuntu, предлагает API.

Скорее всего, вас интересует объект История публикаций.

Пример на Python - возможно, вам придется немного усложнить задачу, если вам нужно сначала сопоставить бинарное имя пакета с исходным именем пакета:

from launchpadlib.launchpad import Launchpad
lp = Launchpad.login_anonymously("https://github.com/example/ex")
ubuntu = lp.distributions["ubuntu"]
archive = ubuntu.main_archive
focal = ubuntu.getSeries(name_or_version="focal")
firefox_releases = archive.getPublishedSources(
     distro_series=focal,
     source_name="firefox", exact_match=True,
     status="Published")
for s in firefox_releases:
    print(s.source_package_version, s.pocket, s.date_published)

Если это не подходит для ваших нужд, есть шанс, что это будет изменено, если только вы изложите убедительную причину.

Внимание: Использование этого подхода дает возможность изящно обработать некоторые раздражающие режимы отказа вашего подхода. Но что бы вы ни делали с полученными данными, вам все равно придется решать, что делать с состояниями Supersed и Deleted. Пример: Последний пакет, запрошенный сегодня, может быть старше, чем последний пакет, запрошенный вчера, поэтому не следует предполагать строго монотонный рост.

3
ответ дан 24 April 2021 в 01:25

Теги

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