16.6.3 Проверка и переопределение порядка элементов транзакции

После того, как методом addInstall или addErase набраны пакеты для установки (удаления), вызываются два метода для проверки и выстраивания правильного порядка установки (удаления). Это методы check и order.

16.6.3.1 Проверка зависимостей
Метод check проверяет зависимости в сете транзакции.

unresolved_dependencies = ts.check()

Метод возвращает None, если все зависимости разрешены, или сложный список для каждой неразрешенной зависимости. В целом, если метод вернул что-либо помимо None, транзакция не может быть выполнена.

Список, возвращаемые методом check в случае неразрешенных зависимостей, имеет следующий формат:

((N,V,R), (reqN, reqV), needsFlags, suggestedPackage, sense)

Первый элемент списка - имя, версия, релиз пакета, который вы пытаетесь установить. Следующая последовательность - имя и версия пакета, от которого зависит устанавливаемый (или с которым конфликтует). Версия не выводится, если зависимость от библиотеки или другого файла (а не пакета целиком).

needsFlags говорят о том, что произошло - имеет место зависимость или конфликт. Значение флага - битовая маска, которая может содержать флаги для rpm.RPMSENSE_EQUAL, rpm.RPMSENSE_GREATER и rpm.RPMSENSE_LESS. Эти флаги могут дать понять, что имеется зависимость от пакета версии старше, чем 4.1, например.

Параметр suggestedPackage именует пакет, который разрешает зависимость. Эта переменная будет иметь значение None, если не известен пакет, разрешающий зависимость.

Также можно понять, является ли зависимость требованием или конфликтом с помощью rpm.RPMSENSE_CONFLICTS или rpm.RPMSENSE_REQUIRES. Это возможные значения sense.

Пример. Следующий список показывает зависимость от пакета:

(('eruby-devel', '0.9.8', '2'), ('eruby-libs', '0.9.8'), 8, None, 0)

А этот - зависимость от разделяемой библиотеки:

(('jpilot', '0.97', '1'), ('libpisock.so.3', None), 0, None, 0)

Данный формат вывода будет меняться в будущих версиях. Для установления текущей версии формата просмотрите онлайн-документацию Python API.

16.6.3.2 Обратный вызов метода check
В вызов check опционально может быть добавлена callback-функция. Эта функция будет вызываться для каждой неразрешенной зависимости в сете транзакции. Вы можете использовать этот обратный вызов для обработки ситуации. Базовый синтаксис:

def checkCallback(ts, TagN, N, EVR, Flags):

# Do something…

Подобную callback-функцию можно использовать, например, для автоматического добавления пакетов в транзакцию (тех пакетов, от которых имеется неразрешенная зависимость). Информацию о пакетах можно брать из базы данных пакетов Red Hat, пакета rpmdb-redhat. Используя вышеописанный трюк, можно открыть транзакцию, используя более чем одну БД одновременно. Определите макрос _dbpath как путь "/usr/lib/rpmdb/i386-redhat-linux/redhat", или какой-то еще, где расположена БД из пакета rpmdb-redhat, и создайте сет транзакции. Тогда обратный вызов check найдет данные по пакетам в экстра-базе данных и добавит их текущую, реальную БД RPM.

Также check callback можно использовать для поиска файлов, от которых имеются зависимости, на диске или в сетевом архиве. Нижеследующий код показывает обратный вызов, который может быть заполнен в попытке удовлетворить зависимости по ходу проверки. Этот обратный вызов устанавливает формат поиска в альтернативной БД или где-либо еще. Данный скелет должен быть заполнен реальными данными для того, чтобы осуществлялся настоящий поиск пакетов для разрешения зависимостей.

def checkCallback(ts, TagN, N, EVR, Flags):

if TagN == rpm.RPMTAG_REQUIRENAME:

prev = ""

Nh = None

if N[0] == '/':

dbitag = 'basenames'

else:

dbitag = 'providename'

# What do you need to do.

if EVR:

print "Must find package [", N, "-", EVR, "]"

else:

print "Must find file [", N, "]"

if resolved:

# ts.addIntall(h, h, 'i')

return -1

return 1

В зависимости от того, какие параметры вы передадите в обратный вызов, код должен искать пакет как таковой, или пакет, который предоставляет нужный файл. Если имеется альтернативная БД пакетов, используйте dbMatch для поиска. Если же вы работаете с директорией, в которой лежат rpm-пакеты, потребуется построить полные имена пакетов, соединяя имена, версии и релизы.

16.6.3.3 Изменение порядка пакетов в сете транзакции
Добавление пакетов в сет может быть осуществлено в любом порядке. Метод order выстраивает свой порядок установки (удаления) в соответствии с зависимостями. Перед вызовом order должен быть выполнен check.

Далее - Запуск транзакции
Назад - Элементы транзакции
Содержание