Вопрос или проблема
Чтобы дать некоторый контекст, я пытаюсь проверить версии двух пакетов и сравнить их. Если, например, версия сервера ниже, чем его зависимости и не находится в транзакции, которая обновляется, я хотел бы остановить обновление. Проблема в том, что я не могу получить версию сервера в пре-части.
Я уже пробовал использовать следующее в пре-части:
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
Примечания
- Проверка на условия: Вы можете задать дополнительные переменные для хранения значения версии зависимости, с которой вы сравниваете.
- Проблемы с сопоставлением версий: Следует учитывать, что вы должны правильно обрабатывать сравнения версий, так как команды сравнения могут не работать так, как ожидается, с разными форматами номеров версий.
Заключение
Понимание ограничений RPM и использования переменных в спецификациях может помочь вам создать более надежный механизм проверки версий. Ваш основной вызов – это интеллектуально обрабатывать ситуацию, когда некоторые пакеты могут не быть частью обновления. Используя предложенные рекомендации и учитывая специфику взаимоотношений между пакетами, вы сможете реализовать квалифицированный и успешный процесс обновления.