Триггеры предоставляют возможность изменять поведение пакета в зависимости от статуса установки другого пакета. Триггер - это скрипт, который разработчик поместил в свой spec-файл для того, чтобы система RPM запустила его на выполнение, если статус другого указанного пакета изменился. Если пакет каким-либо образом зависит от другого, может возникнуть необходимость выполнить какие-либо действия в случае изменений в этом другом пакете.
Триггеры не являются заменой зависимостей. Они нужны для
специальных случаев. Например, если пакет содержит программное обеспечение почтового клиента, ему потребуется присутствие в системе агента передачи почты, MTA. Linux поддерживает множество MTA и в стандартном случае один из них установлен в системе. В большинстве ситуаций почтовому клиенту нет нужды беспокоится об MTA, до тех пор, пока он установлен. Скрипт %trigger отработает, если пакет, от которого есть зависимость, будет, например, обновлен или удален. Он не будет отрабатывать, если будет удален наш гипотетический пакет с почтовым клиентом.
Для написания скрипта триггера нужен список целевых пакетов, например:
%triggerin -- tcsh
команды скрипта
|
Условимся об именах: наш пакет - это пакет, зависящий от другого, в данном случае, tcsh. Это пакет, в котором мы определяем триггер. tcsh - целевой пакет, от него зависит "наш пакет". Пример выше показывает, что если tcsh будет установлен или обновлен, RPM запустит скрипт. Если "наш пакет" будет установлен или обновлен, а tcsh в это время будет установленным, RPM также запустит скрипт.
В определении триггера также можно использовать номера версий, для того, чтобы скрипт запускался только в отношении пакета с определенной версией. Например:
%triggerpostun -- vixie-cron < 3.0.1-56
/sbin/chkconfig --del crond
/sbin/chkconfig --add crond
|
Этот пример из пакета планировщика отложенных задач vixie-cron запускает пост-инсталляционный триггер для того же пакета, но более старой версии.
Триггеры запускаются в интерпретаторе /bin/sh, наиболее общем исполнителе shell-скриптов, конкретный вариант которого может зависеть от системы. Для определения другого интерпретатора можно воспользоваться опцией -p. Например, для запуска триггера на Perl:
%triggerpostun -p /usr/bin/perl -- vixie-cron < 3.0.1-56
system("/sbin/chkconfig --del crond");
system("/sbin/chkconfig --add crond");
|
Для субпакетов используется опция -n, чтобы указать скрипту на субпакет:
%triggerpostun -n subpackage_name -- vixie-cron < 3.0.1-56
/sbin/chkconfig --del crond
/sbin/chkconfig --add crond
|
Внутри триггера $1 - первый аргумент командной строки, содержит количество установок "нашего пакета", которые будут существовать после того, как все операции завершатся. Второй аргумент, $2, содержит количество установок целевого пакета, которые будут существовать, когда все операции завершатся. Если
$2 есть 0, целевой пакет будет удален.
Пример пакета, содержащего множество триггеров - anonftp. Этот сетевой пакет сильно привязан к конкретной версии glibc:
%triggerin -- glibc
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
# Kill off old versions
rm -f /var/ftp/lib/ld-* /var/ftp/lib/libc* /var/ftp/lib/libnsl* /var/ftp/lib/lib
nss_files* &>/dev/null || :
# Copy parts of glibc, needed by various programs in bin.
LIBCVER=`basename $(ls --sort=time /lib/libc-*.so |head -n 1) .so |cut -f2- -d-`
copy /lib/ld-${LIBCVER}.so /var/ftp/lib
copy /lib/libc-${LIBCVER}.so /var/ftp/lib
copy /lib/libnsl-${LIBCVER}.so /var/ftp/lib
copy /lib/libnss_files-${LIBCVER}.so /var/ftp/lib
md5sum /var/ftp/lib/lib*-*.so /var/ftp/lib/libtermcap.so.*.*.* 2>/dev/null >/var
/ftp/lib/libs.md5
chmod 0400 /var/ftp/lib/libs.md5
# Use ldconfig to build symlinks and whatnot.
[ ! -e /var/ftp/etc/ld.so.conf ] && touch /var/ftp/etc/ld.so.conf
/sbin/ldconfig -r /var/ftp
%triggerin -- fileutils
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
copy /bin/ls /var/ftp/bin
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
%triggerin -- cpio
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
copy /bin/cpio /var/ftp/bin
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
%triggerin -- tar
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
copy /bin/tar /var/ftp/bin
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
%triggerin -- gzip
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
copy /bin/gzip /var/ftp/bin
ln -sf gzip /var/ftp/bin/zcat
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
%triggerin -- libtermcap
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
rm -f /var/ftp/lib/libtermcap.so.*.*.* &>/dev/null || :
copy '/lib/libtermcap.so.*.*.*' /var/ftp/lib
md5sum /var/ftp/lib/lib*-*.so /var/ftp/lib/libtermcap.so.*.*.* 2>/dev/null >/var
/ftp/lib/libs.md5
chmod 0400 /var/ftp/lib/libs.md5
# Use ldconfig to build symlinks and whatnot.
[ ! -e /var/ftp/etc/ld.so.conf ] && touch /var/ftp/etc/ld.so.conf
/sbin/ldconfig -r /var/ftp
%triggerin -- ncompress
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
copy /usr/bin/compress /var/ftp/bin
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
%triggerpostun -- anonftp 4.0
if [ "$2" != 1 ] ; then
# The user has multiple glibc packages installed. We can't read the
# user's mind, so don't do anything.
exit 0
fi
copy() { file="`ls --sort=time $1 |head -n 1`"; ln -f "$file" "$2" 2>/dev/null |
| cp -df "$file" "$2"; }
# Kill off old versions
rm -f /var/ftp/lib/ld-* /var/ftp/lib/libc* /var/ftp/lib/libnsl* /var/ftp/lib/lib
nss_files* &>/dev/null || :
# Copy parts of glibc, needed by various programs in bin.
LIBCVER=`basename /lib/libc-*.so .so | cut -f2- -d-`
copy /lib/ld-${LIBCVER}.so /var/ftp/lib
copy /lib/libc-${LIBCVER}.so /var/ftp/lib
copy /lib/libnsl-${LIBCVER}.so /var/ftp/lib
copy /lib/libnss_files-${LIBCVER}.so /var/ftp/lib
copy /bin/ls /var/ftp/bin
copy /bin/cpio /var/ftp/bin
copy /bin/tar /var/ftp/bin
copy /bin/gzip /var/ftp/bin
ln -sf gzip /var/ftp/bin/zcat
copy /usr/bin/compress /var/ftp/bin
rm -f /var/ftp/lib/libtermcap.so.*.*.* &>/dev/null || :
copy '/lib/libtermcap.so.*.*.*' /var/ftp/lib
# Use ldconfig to build symlinks and whatnot.
[ ! -e /var/ftp/etc/ld.so.conf ] && touch /var/ftp/etc/ld.so.conf
/sbin/ldconfig -r /var/ftp
# Generate md5sums for verifyscript
md5sum /var/ftp/lib/lib*-*.so /var/ftp/lib/libtermcap.so.*.*.* 2>/dev/null >/var
/ftp/lib/libs.md5
chmod 0400 /var/ftp/lib/libs.md5
md5sum `ls /var/ftp/bin/* |grep -v bin.md5` >/var/ftp/bin/bin.md5
chmod 0400 /var/ftp/bin/bin.md5
|
Далее - Написание проверочных скриптов
Назад - Автоматизация создания списка зависимостей
Содержание