В данном практическом примере происходит изменение существующего файла в ходе установки пакета с помощью стандартных классов и сценариев действий над классами. Здесь используется один из трех способов изменения файла. Два других способа описаны в разделах Изменение файла с помощью класса sed и сценария postinstall и Изменение файла с помощью класса build. Изменяемый файл называется /etc/inittab.
В данном практическом примере показано, как использовать сценарии действий над классами в ходе установки и удаления пакета. Для получения дополнительной информации см. раздел Создание сценариев действий над классами.
Для изменения файла /etc/inittab в ходе установки с помощью классов и сценариев действий над классами необходимо выполнить следующие ниже задачи.
Создать класс.
Создайте класс с именем inittab. Для этого класса необходимо создать сценарий действия над классом в ходе установки и удаления. Определите inittab в параметре CLASSES файла pkginfo.
Создать файл inittab.
В данном файле содержится информация для записи, которая будет добавлена в файл /etc/inittab. Обратите внимание в примере файла prototype, что файл inittab является членом класса inittab и принадлежит к файлу типа e (редактируемый).
Создать сценарий действия над классом во время установки (i.inittab).
Помните, что сценарии действий над классами должны выдавать одинаковые результаты при каждом выполнении. Сценарий действия над классом выполняет следующие действия.
Проверяет, не была ли данная запись добавлена ранее
Если это так, удаляет все предыдущие версии записи
Редактирует файл inittab и добавляет строки с комментариями о происхождении этой записи
Перемещает временный файл обратно в файл /etc/inittab
Выполняет команду init q после получения признака ENDOFCLASS
Обратите внимание, что в данном сценарии установки можно выполнять команду init q. При таком подходе состоящий из одной строки сценарий postinstall не понадобится.
Создать сценарий действия над классом во время удаления (r.inittab).
Сценарий удаления очень похож на сценарий установки. Информация, добавленная сценарием установки, удаляется и выполняется команда init q.
Данный практический пример более сложный, чем следующий; см. Изменение файла с помощью класса sed и сценария postinstall. Требуются три файла вместо двух, и поставляемый файл /etc/inittab в действительности является лишь местозаполнителем, содержащим фрагмент записи, которая будет вставлена. Эту запись можно было бы разместить в файле i.inittab, однако для этого команде pkgadd нужен файл, который будет передан в файл i.inittab. Кроме того, процедура удаления в этом случае должна быть размещена в отдельном файле (r.inittab). Хотя данный способ работает хорошо, лучше использовать его для случаев, когда требуется очень сложная установка большого количества файлов. См. раздел Изменение файлов crontab в ходе установки.
Программа sed, используемая в разделеИзменение файла с помощью класса sed и сценария postinstall, поддерживает большое количество экземпляров пакета, поскольку комментарий в конце записи inittab основан на экземпляре пакета. В практическом примере в разделе Изменение файла с помощью класса build используется более простой подход для редактирования файла /etc/inittab в ходе установки.
PKG=case5 NAME=Case Study #5 CATEGORY=applications BASEDIR=/opt ARCH=SPARC VERSION=Version 1d05 CLASSES=inittab |
i pkginfo i i.inittab i r.inittab e inittab /etc/inittab ? ? ? |
# PKGINST parameter provided by installation service while read src dest do # remove all entries from the table that # associated with this PKGINST sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest > /tmp/$$itab || exit 2 sed -e "s/$/#$PKGINST" $src >> /tmp/$$itab || exit 2 mv /tmp/$$itab $dest || exit 2 done if [ "$1" = ENDOFCLASS ] then /sbin/init q || exit 2 fi exit 0 |
# PKGINST parameter provided by installation service while read src dest do # remove all entries from the table that # are associated with this PKGINST sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest > /tmp/$$itab || exit 2 mv /tmp/$$itab $dest || exit 2 done /sbin/init q || exit 2 exit 0 |
rb:023456:wait:/usr/robot/bin/setup |