После инициализации сета транзакции, запуск операций осуществляется вызовом run. Требуется два параметра:
ts.run(callback, client_data) |
Параметр callback должен быть функцией Python. Параметр client_data - любые данные, которые вы хотите поместить в обратный вызов. Поскольку в сете транзакции может быть много пакетов, это не должны быть данные, относящиеся к определенному пакету. В качестве client_data не может быть передано значение None.
16.6.4.1 Обратные вызовы метода run
Callback, который был передан в run, необходим. Обратный вызов должен сработать правильно, иначе транзакция завершится с ошибкой. Вы должны предоставить callback.
Поскольку callback будет вызываться не один раз, это отличный способ получить обратную связь для определения степени выполнения транзакции (особенно в разработке графических приложений для прогресс-баров).
Базовый синтаксис обратного вызова для сета транзакции:
def runCallback(reason, amount, total, key, client_data): |
key - это данные, предоставленные вами для метода addInstall. client_data - данные, которые будут передаваться в run.
Всякий раз, когда происходит обратный вызов, сет транзакции будет задавать флаг reason. Возможные значения флага показаны в таблице.
Значение |
На что указывает |
rpm.RPMCALLBACK_UNKNOWN |
Неизвестная ошибка |
rpm.RPMCALLBACK_INST_PROGRESS |
Прогресс установки |
rpm.RPMCALLBACK_INST_START |
Старт установки |
rpm.RPMCALLBACK_INST_OPEN_FILE |
Callback должен открыть файл пакета |
rpm.RPMCALLBACK_INST_CLOSE_FILE |
Callback должен закрыть файл пакета |
rpm.RPMCALLBACK_TRANS_PROGRESS |
Прогресс транзакции |
rpm.RPMCALLBACK_TRANS_START |
Старт транзакции |
rpm.RPMCALLBACK_TRANS_STOP |
Стоп транзакции |
rpm.RPMCALLBACK_UNINST_PROGRESS |
Прогресс удаления |
rpm.RPMCALLBACK_UNINST_START |
Старт удаления |
rpm.RPMCALLBACK_UNINST_STOP |
Стоп удаления |
rpm.RPMCALLBACK_REPACKAGE_PROGRESS |
Прогресс пересборки |
rpm.RPMCALLBACK_REPACKAGE_START |
Старт пересборки |
rpm.RPMCALLBACK_REPACKAGE_STOP |
Стоп пересборки |
rpm.RPMCALLBACK_UNPACK_ERROR |
Ошибка распаковки |
rpm.RPMCALLBACK_CPIO_ERROR |
Ошибка cpio при попытке разархивировать нагрузку |
Ваш callback должен обрабатывать по меньшей мере два случая: rpm.RPMCALLBACK_INST_OPEN_FILE и rpm.RPMCALLBACK_INST_CLOSE_FILE.
С reason, равным rpm.RPMCALLBACK_INST_OPEN_FILE, необходимо открыть файл rpm-пакета и вернуть дескриптор. Этот дескриптор необходимо хранить в глобально-доступной переменной, или по крайней мере в зоне видимости, так как потребуется файл закрыть, когда reason будет rpm.RPMCALLBACK_INST_CLOSE_FILE.
16.6.4.2 Кодируем пример callback-функции
Код ниже показывает работающий пример callback для установки или обновления пакетов.
# Global file descriptor for the callback. |
Этот callback подразумевает, что в вызов addInstall передается в качестве пользовательских данных имя файла rpm-пакета. client_data в метод run игнорируется, но это хорошее место для передачи объекта. Можно, например, использовать эту возможность для того, чтобы избежать хранения дескриптора файла в глобальной переменной.
16.6.4.3 Обновление пакета
Пример ниже содержит скрипт (rpmupgrade.py) для обновления или установки пакета.
#!/usr/bin/python |
Этот скрипт ожидает, что имя файла rpm-пакета будет передано в параметре командной строки, получив имя он выполняет обновление пакета (а если это новый пакет - то установку).
При запуске скрипта увидим следующее:
# rpm -q jikes |
Если запустить скрипт без прав суперпользователя, увидим сообщение об ошибке типа следующего:
$ python rpmupgrade.py jikes-1.18-1.i386.rpm |
Если пакет имеет зависимости от файла, например, разделяемой библиотеки, вывод будет таким:
# python rpmupgrade.py jikes-1.17-glibc2.2-1.i386.rpm jpilot-0_97-1_i386.rpm |
Если имеется неразрешаемая зависимость от другого пакета, вывод будет таким:
# python rpmupgrade.py eruby-devel-0.9.8-2.i386.rpm |
Далее - Раздел 17. Программирование RPM на Perl
Назад - Проверка и переопределение порядка элементов транзакции
Содержание