Триггеры предоставляют возможность изменять поведение пакета в зависимости от статуса установки другого пакета. Триггер - это скрипт, который разработчик поместил в свой 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 
  
 | 
 Далее - Написание проверочных скриптов 
 Назад - Автоматизация создания списка зависимостей 
 Содержание