Руководство разработчика по пакетированию приложений

Изменение файла с помощью стандартных классов и сценариев действий над классами

В данном практическом примере происходит изменение существующего файла в ходе установки пакета с помощью стандартных классов и сценариев действий над классами. Здесь используется один из трех способов изменения файла. Два других способа описаны в разделах Изменение файла с помощью класса sed и сценария postinstall и Изменение файла с помощью класса build. Изменяемый файл называется /etc/inittab.

Методы

В данном практическом примере показано, как использовать сценарии действий над классами в ходе установки и удаления пакета. Для получения дополнительной информации см. раздел Создание сценариев действий над классами.

Подход

Для изменения файла /etc/inittab в ходе установки с помощью классов и сценариев действий над классами необходимо выполнить следующие ниже задачи.

Данный практический пример более сложный, чем следующий; см. Изменение файла с помощью класса sed и сценария postinstall. Требуются три файла вместо двух, и поставляемый файл /etc/inittab в действительности является лишь местозаполнителем, содержащим фрагмент записи, которая будет вставлена. Эту запись можно было бы разместить в файле i.inittab, однако для этого команде pkgadd нужен файл, который будет передан в файл i.inittab. Кроме того, процедура удаления в этом случае должна быть размещена в отдельном файле (r.inittab). Хотя данный способ работает хорошо, лучше использовать его для случаев, когда требуется очень сложная установка большого количества файлов. См. раздел Изменение файлов crontab в ходе установки.

Программа sed, используемая в разделеИзменение файла с помощью класса sed и сценария postinstall, поддерживает большое количество экземпляров пакета, поскольку комментарий в конце записи inittab основан на экземпляре пакета. В практическом примере в разделе Изменение файла с помощью класса build используется более простой подход для редактирования файла /etc/inittab в ходе установки.

Файлы практических примеров

Файл pkginfo

PKG=case5
NAME=Case Study #5
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=inittab

Файл prototype

i pkginfo
i i.inittab
i r.inittab
e inittab /etc/inittab ? ? ?

Сценарий действия над классом при установке i.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

Сценарий действия над классом при удалении r.inittab

# 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

Файл inittab

rb:023456:wait:/usr/robot/bin/setup