RPMFileTrigger: различия между версиями

Материал из ALT Linux Wiki
(Изначальный вариант)
 
Нет описания правки
 
(не показаны 4 промежуточные версии 2 участников)
Строка 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}}
<pre>#!/bin/sh
<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>
</pre>


Однако, наличие файла в системе ({{cmd|[ -f "$file" ]}}) свидетельствует о том, что его пакет-обладатель был установлен,
Однако наличие файла в системе<ref>{{cmd|[ -f "$file" ]}}</ref> свидетельствует о том, что его пакет-обладатель был установлен,
а отсутствие - что удалён. Эту информацию так же можно использовать. Например, см. {{path|/usr/lib/rpm/gtk-icon-cache.filetrigger}}
а отсутствие — что удалён. Эту информацию также можно использовать. Например, см. {{path|/usr/lib/rpm/gtk-icon-cache.filetrigger}}
<pre>#!/bin/sh -e
<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</pre>
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

Примечания

  1. Начиная с 4.0.4-alt96.11 (ноябрь 2008).
  2. [ -f "$file" ]