В секции %pre файла .spec с помощью rpm как получить имя пакета и версию, которые обновляются в этой транзакции?

Вопрос или проблема

Чтобы дать некоторый контекст, я пытаюсь проверить версии двух пакетов и сравнить их. Если, например, версия сервера ниже, чем его зависимости и не находится в транзакции, которая обновляется, я хотел бы остановить обновление. Проблема в том, что я не могу получить версию сервера в пре-части.

Я уже пробовал использовать следующее в пре-части:

  • rpm -qa "server" -> Это дает уже установленную версию, так что если сервер также является частью транзакции обновления, он покажет старую версию в пре-коде.
  • rpm -q --qf '%VERSION' --whatprovides server 2>/dev/null -> Это дает версию целевого пакета, которая устанавливается с помощью rpm, но проблема в том, что она также дает целевую версию, даже если сервер не будет установлен, так что он не является частью этой транзакции.
  • rpm -q --last server | head -n 1 -> Это предоставляет уже установленную версию, так что та же проблема, что и с первой.

Есть ли еще идеи о том, как проверить, что сервер также обновляется (обратите внимание, что мне нужно сделать это до того, как обновление произойдет, так что в пре-коде) до целевой версии? Любая помощь будет оценена. Спасибо.

Ответ или решение

Чтобы успешно решить задачу получения названия и версии пакетов, которые обновляются во время транзакции RPM в разделе %pre файла .spec, необходимо учитывать, что в этот момент система еще не обновила пакеты до новых версий. Однако, есть подходы, которые могут помочь реализовать вашу проверку.

Обзор проблемы

Ваша цель заключается в том, чтобы сравнить версию текущего установленного пакета (например, серверного) с версиями его зависимостей и принять решение о продолжении обновления на основе этих условий. Важно, чтобы проверка происходила до обновления пакетов, что требует от нас доступа к информации о целевых версиях, которые будут установлены. Однако стандартные команды RPM не всегда дают точные данные в контексте %pre.

Решение с использованием переменных

К сожалению, в контексте секции %pre, информация о версиях пакетов, которые обновляются, не доступна напрямую. Тем не менее, вы можете использовать переменные RPM, такие как %{name} и %{version}. Вот пример, как вы можете получить информацию о пакете в pre секции:

%pre
# Получаем информацию о текущем пакете
CURRENT_VERSION=$(rpm -qa 'server' | awk -F- '{print $2}' | head -n 1)
# Получаем информацию о новом пакете
NEW_VERSION=%{version}

# Проверяем условие обновления
if [ "$CURRENT_VERSION" != "" ] && [ "$(rpm -q --provides 'server' | grep $NEW_VERSION)" ]; then
    echo "Server will be upgraded from $CURRENT_VERSION to $NEW_VERSION."
    # Ваши условия проверки и действия
    if [ "$CURRENT_VERSION" -lt "$DEPENDENCY_VERSION" ]; then
        echo "Current version is lower than dependency version. Aborting upgrade."
        exit 1
    fi
else
    echo "Server is not part of the upgrade transaction."
    # Ваши действия, если сервер не обновляется
fi

Примечания

  1. Проверка на условия: Вы можете задать дополнительные переменные для хранения значения версии зависимости, с которой вы сравниваете.
  2. Проблемы с сопоставлением версий: Следует учитывать, что вы должны правильно обрабатывать сравнения версий, так как команды сравнения могут не работать так, как ожидается, с разными форматами номеров версий.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...