В данном практическом примере в ходе установки будет создан файл базы данных и его копия сохранена после удаления пакета.
В практическом примере применяются следующие ниже методы.
Использование классов и сценариев действий над классами для выполнения особых действий на различных наборах объектов
Для получения дополнительной информации см. раздел Создание сценариев действий над классами.
Использование файла space для сообщения команде pkgadd о необходимости дополнительного дискового пространства для корректной установки данного пакета
Для получения дополнительной информации о файле space см. раздел Резервирование дополнительного места на диске на целевой системе.
Использование команды installf для установки файла, не определенного в файлах prototype и pkgmap.
Чтобы создать файл базы данных в ходе установки и сохранить его копию при удалении, необходимо выполнить следующие ниже задачи.
Определите три класса.
Для данного практического примера пакета требуется определение следующих трех классов в параметре CLASSES:
Стандартный класс none, содержащий набор процессов, принадлежащий подкаталогу bin.
Класс admin, содержащий исполняемый файл config, а также каталог с файлами данных.
Класс cfgdata, содержащий каталог.
Сделайте пакет коллективно перемещаемым.
Обратите внимание, что в файле prototype ни одно из имен путей не начинается с косой черты или с переменной среды. Это означает, что они являются коллективно перемещаемыми.
Вычислите объем дискового пространства, требуемого для файла базы данных, и создайте файл space, который будет поставляться в составе пакета. Данный файл уведомляет команду pkgadd, что для пакета требуется дополнительное пространство и указывает его объем.
Создайте сценарий действия над классом для класса admin (i.admin).
Пример сценария инициализирует базу данных, используя файлы данных, принадлежащие классу admin. Для выполнения этой задачи сценарий выполняет следующие действия.
Копирует исходный файл данных в предназначенное место
Создает пустой файл с именем config.data и назначает его классу cfgdata
Выполняет команду bin/config (поставляемую с пакетом и уже установленную) для наполнения данными файла базы данных config.data с помощью файлов данных, принадлежащих классу admin
Выполняет команду installf -f для завершения установки файла config.data
Никакие особые действия для класса admin во время удаления пакета не требуются, поэтому сценарий действия над классом во время удаления не создается. Это означает, что все файлы и каталоги в классе admin удаляются из системы.
Создайте сценарий действия над классом для класса cfgdata (r.cfgdata).
Сценарий удаления создает копию файла базы данных перед его удалением. Никакие особые действия для этого класса во время установки не требуется, поэтому сценарий действия над классом во время установки не нужен.
Помните, что в качестве входных данных для сценария удаления выступает список имен путей, которые необходимо удалить. Имена путей всегда идут в обратном алфавитном порядке. Сценарий удаления копирует файлы в каталог с именем $PKGSAV. После обработки всех имен путей сценарий возвращается назад и удаляет все каталоги и файлы, связанные с классом cfgdata.
Результатом выполнения этого сценария удаления является копирование файла config.data в каталог $PKGSAV и последующее удаление файла config.data и каталога с данными.
PKG=krazy NAME=KrAzY Applications CATEGORY=applications BASEDIR=/opt ARCH=SPARC VERSION=Version 1 CLASSES=none cfgdata admin |
i pkginfo i request i i.admin i r.cfgdata d none bin 555 root sys f none bin/process1 555 root other f none bin/process2 555 root other f none bin/process3 555 root other f admin bin/config 500 root sys d admin cfg 555 root sys f admin cfg/datafile1 444 root sys f admin cfg/datafile2 444 root sys f admin cfg/datafile3 444 root sys f admin cfg/datafile4 444 root sys d cfgdata data 555 root sys |
# extra space required by config data which is # dynamically loaded onto the system data 500 1 |
# PKGINST parameter provided by installation service # BASEDIR parameter provided by installation service while read src dest do cp $src $dest || exit 2 done # if this is the last time this script will be executed # during the installation, do additional processing here. if [ "$1" = ENDOFCLASS ] then # our config process will create a data file based on any changes # made by installing files in this class; make sure the data file # is in class `cfgdata' so special rules can apply to it during # package removal. installf -c cfgdata $PKGINST $BASEDIR/data/config.data f 444 root sys || exit 2 $BASEDIR/bin/config > $BASEDIR/data/config.data || exit 2 installf -f -c cfgdata $PKGINST || exit 2 fi exit 0 |
Здесь продемонстрирован редкий случай, когда команда installf может быть необходима для сценария действия над классом. Поскольку файл space использовался для резервирования пространства в конкретной файловой системе, этот новый файл может быть добавлен в пакет несмотря на то, что он не включен в файл pkgmap.
# the product manager for this package has suggested that # the configuration data is so valuable that it should be # backed up to $PKGSAV before it is removed! while read path do # path names appear in reverse lexical order. mv $path $PKGSAV || exit 2 rm -f $path || exit 2 done exit 0 |