RPMFileTrigger
Материал из ALT Linux Wiki
Bga (обсуждение | вклад) (Изначальный вариант) |
|||
(4 промежуточные версии не показаны) | |||
Строка 1: | Строка 1: | ||
- | Пакетный менеджер RPM в свежих дистрибутивах ALT Linux собран с поддержкой запуска файл-триггеров. | + | Пакетный менеджер RPM в свежих<ref>Начиная с 4.0.4-alt96.11 (ноябрь 2008).</ref> дистрибутивах ALT Linux собран с поддержкой запуска файл-триггеров. |
- | Основная идея файл- | + | Основная идея файл-триггера — выполнять '''единообразное''' действие, |
связанное с установкой/удалением пакетов, '''один''' раз по окончании транзакции | связанное с установкой/удалением пакетов, '''один''' раз по окончании транзакции | ||
вместо того, чтобы делать это в '''разноообразных''' секциях {{term|%post}} / {{term|%postun}} после | вместо того, чтобы делать это в '''разноообразных''' секциях {{term|%post}} / {{term|%postun}} после | ||
установки/удаления '''каждого''' пакета транзакции. | установки/удаления '''каждого''' пакета транзакции. | ||
- | ''Файл-триггер выполняется после установки и/или удаления всех пакетов транзакции и получает на вход ({{term|STDIN}}) список файлов всех затронутых пакетов | + | Файлы {{path|/usr/lib/rpm/*.filetrigger}} обрабатываются скриптом |
+ | {{path|/usr/lib/rpm/posttrans-filetriggers}} последовательно, | ||
+ | в алфавитном порядке. | ||
+ | |||
+ | Список файлов всех затронутых транзакцией пакетов rpm добавляет в файл {{path|/var/lib/rpm/files-awaiting-filetriggers}}, который очищается при успешном выполнении {{path|/usr/lib/rpm/posttrans-filetriggers}}. Таким образом, если хотя бы один из {{path|*.filetrigger}} не отработает корректно, файл с ожидающими обработки файлами будет увеличиваться при каждой операции с пакетами. | ||
+ | |||
+ | ''Файл-триггер выполняется после установки и/или удаления всех пакетов транзакции и получает на вход ({{term|STDIN}}) список файлов всех затронутых пакетов с момента предыдущей успешной обработки триггеров.'' | ||
Авторам файл-триггеров обычно требуется выполнить определённую команду, | Авторам файл-триггеров обычно требуется выполнить определённую команду, | ||
фиксирующую изменения в системе, независимо от того, был пакет удалён или установлен. | фиксирующую изменения в системе, независимо от того, был пакет удалён или установлен. | ||
- | Например, см. {{path|/usr/lib/rpm/menu.filetrigger}} | + | Например, см. {{path|/usr/lib/rpm/menu.filetrigger}} |
- | < | + | <source lang="bash">#!/bin/sh |
# | # | ||
# RPM filetrigger for system menus. | # RPM filetrigger for system menus. | ||
Строка 24: | Строка 30: | ||
if egrep -qs '^/etc/menu-methods/|^/usr/(lib|lib64|share)/menu/'; then | if egrep -qs '^/etc/menu-methods/|^/usr/(lib|lib64|share)/menu/'; then | ||
/usr/sbin/update-menus | /usr/sbin/update-menus | ||
- | fi | + | fi</source> |
- | </ | + | |
- | Однако | + | Однако наличие файла в системе<ref>{{cmd|[ -f "$file" ]}}</ref> свидетельствует о том, что его пакет-обладатель был установлен, |
- | а | + | а отсутствие — что удалён. Эту информацию также можно использовать. Например, см. {{path|/usr/lib/rpm/gtk-icon-cache.filetrigger}} |
- | < | + | <source lang="bash">#!/bin/sh -e |
egrep -o '^/usr/share/icons/[^/]+/' |sort -u | | egrep -o '^/usr/share/icons/[^/]+/' |sort -u | | ||
Строка 40: | Строка 45: | ||
rmdir --ignore-fail-on-non-empty "$dir" | rmdir --ignore-fail-on-non-empty "$dir" | ||
fi | fi | ||
- | done</ | + | done</source> |
- | [[Категория:RPM]][[Категория:devel]] | + | == Примечания == |
+ | <references/> | ||
+ | [[Категория:RPM]] | ||
+ | [[Категория:RPM spec]] | ||
+ | [[Категория:devel]] |
Текущая версия на 22:13, 25 августа 2015
Пакетный менеджер RPM в свежих[1] дистрибутивах ALT Linux собран с поддержкой запуска файл-триггеров.
Основная идея файл-триггера — выполнять единообразное действие, связанное с установкой/удалением пакетов, один раз по окончании транзакции вместо того, чтобы делать это в разноообразных секциях %post / %postun после установки/удаления каждого пакета транзакции.
Файлы /usr/lib/rpm/*.filetrigger обрабатываются скриптом /usr/lib/rpm/posttrans-filetriggers последовательно, в алфавитном порядке.
Список файлов всех затронутых транзакцией пакетов rpm добавляет в файл /var/lib/rpm/files-awaiting-filetriggers, который очищается при успешном выполнении /usr/lib/rpm/posttrans-filetriggers. Таким образом, если хотя бы один из *.filetrigger не отработает корректно, файл с ожидающими обработки файлами будет увеличиваться при каждой операции с пакетами.
Файл-триггер выполняется после установки и/или удаления всех пакетов транзакции и получает на вход (STDIN) список файлов всех затронутых пакетов с момента предыдущей успешной обработки триггеров.
Авторам файл-триггеров обычно требуется выполнить определённую команду, фиксирующую изменения в системе, независимо от того, был пакет удалён или установлен. Например, см. /usr/lib/rpm/menu.filetrigger
#!/bin/sh # # RPM filetrigger for system menus. # # Copyright (C) 2008 Alexey Tourbin <at@altlinux.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. if egrep -qs '^/etc/menu-methods/|^/usr/(lib|lib64|share)/menu/'; then /usr/sbin/update-menus fi
Однако наличие файла в системе[2] свидетельствует о том, что его пакет-обладатель был установлен, а отсутствие — что удалён. Эту информацию также можно использовать. Например, см. /usr/lib/rpm/gtk-icon-cache.filetrigger
#!/bin/sh -e egrep -o '^/usr/share/icons/[^/]+/' |sort -u | while read -r dir; do dir=${dir%/} if [ -f "$dir"/index.theme ]; then ### установлен или удалён index.theme ? gtk-update-icon-cache --force --quiet "$dir" elif [ -f "$dir"/icon-theme.cache ]; then rm -f "$dir"/icon-theme.cache rmdir --ignore-fail-on-non-empty "$dir" fi done