Классы объектов позволяют выполнять серию действий над группой объектов пакета при установке или удалении. Назначение объектов классу производится в файле prototype. Все объекты пакета должны иметь определенный класс, а для объектов, не требующих специального действия, по умолчанию используется класс none.
Параметр установки CLASSES, назначенный в файле pkginfo представляет собой список устанавливаемых классов (включая класс none).
Объекты, определенные в файле pkgmap, которые принадлежат классу, не указанному в этом параметре в файле pkginfo, установлены не будут.
Порядок установки определяется списком CLASSES. Класс none, если он имеется, всегда устанавливается первым и удаляется последним. Поскольку каталоги являются основной структурой поддержки для всех других объектов файловой системы, они должны иметь класс none. Возможны исключения, однако, как правило, класс none является самым безопасным. Эта стратегия позволяет обеспечить создание каталогов до объектов, которые в них будут содержаться. Кроме того, каталоги удаляться не будут до тех пор, пока не будут удалены содержащиеся в них объекты.
Ниже приведено описание действий системы при установке класса. Эти действия повторяются для каждого тома пакета во время его установки.
Команда pkgadd позволяет создать список путевых имен.
С помощью команды pkgadd производится создание списка путевых имен, над которыми производит действие сценарий. В каждой строке этого списка указывается исходный и целевой пути, разделенные пробелом. Исходный путь указывает, где в установочном томе расположен устанавливаемый объект . Целевой путь указывает местоположение в целевой системе, куда будет устанавливаться объект. Содержимое списка ограничивается следующими критериями.
В списке содержатся только путевые имена, принадлежащие связанному классу.
При сбое создания объекта пакета каталоги, именованные каналы, символьные устройства, блочные устройства и символические ссылки включаются в список с исходными путевым именем, равным /dev/null. Обычно эти элементы автоматически создаются с помощью команды pkgadd (если еще не существуют) и наделяются правильными атрибутами (режим, владелец, группа) согласно определению в файле pkgmap.
В список ни в коем случае не включаются связанные файлы типа l. Жесткие ссылки в данном классе создаются в элементе 4.
Если для установки конкретного класса не предоставлен сценарий действия над классом, путевые имена в создаваемом списке копируются из тома в соответствующее целевое местоположение.
Выполняется сценарий действия над классом (если существует).
При вызове сценария действия над классом на его стандартный вход подается список, созданный в элементе 1. Если этот том является последним томом пакета или при отсутствии других объектов в этом классе сценарий выполняется с единственным аргументом ENDOFCLASS.
Даже если в пакете больше нет обычных файлов этого класса, производится вызов сценария действия над классом как минимум один раз с пустым списком и аргументом ENDOFCLASS.
Командаpkgadd осуществляет аудит содержимого и атрибутов, а также создание жестких ссылок.
После успешного выполнения элемента 2 или 3 команда pkgadd производит аудит содержимого и информации атрибутов для списка путевых имен. Команда pkgadd автоматически создает ссылки, связанные с классом. Обнаруженные несовпадения атрибутов в созданном списке исправляются для всех путевых имен.
Объекты удаляются по классам. Сначала удаляются классы, существующие для пакетов, однако не перечисленные в параметре CLASSES (например, объект, установленный с помощью команды installf). Классы, указанные в параметре CLASSES, удаляются в обратном порядке. Класс none всегда удаляется в последнюю очередь. Ниже описаны действия, которые производятся в системе при удалении класса.
Создание списка путевых имен с помощью команды pkgrm.
Производится создание списка установленных путевых имен, принадлежащих указанному классу, с помощью команды pkgrm. Путевые имена, на которые ссылается другой пакет, из этого списка исключаются, если они не принадлежат к типу e. Тип файлов e означает, что по установки или удалении файл должен быть изменен.
Если удаляемый пакет произвел изменение каких-либо файлов типа e во время установки, то при удалении производится удаление только добавленных строк. Не удаляйте непустой редактируемый файл. Удалите строки, которые были добавлены пакетом.
Если сценария действия над классом не существует, производится удаление путевых имен.
Если в пакете отсутствуют сценарии действий над классами для этого класса, производится удаление всех путевых имен в списке, созданном с помощью команды pkgrm.
Файлам, принадлежащим к типу e (редактируемые), не назначается класс и связанный с ним сценарий действия над классом. Эти файлы удаляются в данный момент, даже если их путевые имена используются другими пакетами.
Если сценарий действия над классом уже существует, производится выполнение сценария.
Командаpkgrm производит вызов сценария действия над классом, на стандартный вход которого подается список, созданный в элементе 1.
Командаpkgrm выполняет аудит.
После успешного выполнения сценария действия над классом команда pkgrm производит удаление ссылок на путевые имена из БД пакета, если на них нет ссылок других пакетов.
Сценарий действия над классом определяет набор действия для выполнения при установке или удалении пакета. Действия выполняются над группой путевых имен в зависимости от их определения класса. Примеры сценариев действий над классами приведены в Глава 5Практические примеры создания пакета.
Имя сценария действия над классом основывается на классе, над которым должно производиться действие, а также на том, должны ли эти действия производиться при установке или удалении пакета. В следующей таблице показаны два формата имен:
Формат имени |
Описание |
---|---|
i.класс |
Производит действия над путевыми именами в указанном классе при установке пакета |
r.класс |
Производит действия над путевыми именами в указанном классе при удалении пакета |
Например, имя сценария установки для класса с именем manpage будетi.manpage. Сценарий удаления должен иметь имя r.manpage.
Этот формат имен файлов не используется для файлов, которые принадлежат к системным классам sed, awk или build. Для получения дополнительной информации по этим классам см. раздел Специальные системные классы .
Сценарии действий над классами выполняются под именем uid=root и gid=other.
Сценарий выполняется для всех файлов данного класса на текущем томе.
Команды pkgadd и pkgrm производят создание списка всех объектов, указанных в файле pkgmap, которые принадлежат классу. В результате сценарий действия над классом может выполнять операции только над путевыми именами, определенными в файле pkgmap, которые принадлежат конкретному классу.
При последнем выполнении сценария действия над классом (т.е. файлов, принадлежащих этому классу, больше нет) сценарий действия над классом выполняется однократно с ключевым аргументом ENDOFCLASS.
При выполнении сценариев действий над классами взаимодействие с администратором не допускается.
Если пакет распределен более чем на один том, для каждого тома, содержащего хотя бы один файл, принадлежащий этому классу, выполняется сценарий действия над классом. Соответственно, каждый сценарий должен иметь возможность неоднократного выполнения. Это означает, что выполнение сценария неограниченное количество раз с одними вводными данными должны получаться те же результаты, что и при однократном выполнении.
Если файл является частью класса, имеющего сценарий действия над классом, сценарий должен производить установку файла. Командаpkgadd не производит установку файлов, для которых существует сценарий действия над классом, однако с ее помощью производится проверка установки.
Сценарий действия над классом ни в коем случае не должен производить добавление, изменение или удаление путевого имени или системного атрибута, отсутствующего в списке, который создан с помощью команды pkgadd. Для получения дополнительной информации о списке см. пункт 1 раздела Обработка классов во время установки пакета.
Когда сценарий обнаруживает аргумент ENDOFCLASS, добавьте в сценарий действия после обработки, например очистку.
Все взаимодействие с оператором ограничивается сценарием request. Не пытайтесь получить информацию от администратора с помощью сценария действия над классом.
В системе имеются четыре специальных класса:
Обеспечивает метод для использования команд sed для изменения файлов после удаления или установки пакета.
Обеспечивает метод для использования инструкций awk для изменения файлов после удаления или установки пакета.
Обеспечивает метод динамического создания или изменения файла с помощью команд интерпретатора sh
Обеспечивает метод сохранения файлов, которые не должны перезаписываться при будущих установках пакета.
Обеспечивает автоматическую установку и удаление служб SMF (подсистемы управления службами, связанных с манифестом Для всех манифестов SMF в пакете должен использоваться класс manifest.
Если для некоторых файлов необходима специальная обработка, выполнение которой может быть невозможно с помощью команд sed, awk илиsh, установка с помощью системных классов может производиться быстрее, чем с помощью нескольких классов и соответствующих сценариев действий над классами.
Класс sed обеспечивает метод изменения существующего объекта в целевой системе. Сценарий действия над классом sed выполняется при установке автоматически, если имеется файл, принадлежащий классу sed. Имя сценария действия над классом sed должно быть тем же, что и имя файла, над которым выполняются команды.
Сценарий действия над классом sed обеспечивает передачу инструкций sed в следующем формате:
Время, когда должны выполняться команды, показывается следующими двумя командами. При установке пакета производится выполнение команды программы sed, которая следует за командой !install. При удалении пакета производится выполнение команды программы sed, которая следует за командой !remove. Порядок, в котором используются эти команды, не учитывается.
Для получения дополнительной информации об командах программы sed см. справочную страницу sed(1). Примеры сценариев действий над классами sed приведены в Глава 5Практические примеры создания пакета.
Класс awk обеспечивает метод изменения существующего объекта в целевой системе. Изменения производятся согласно командам программы awk в сценарии действия над классом awk .
Сценарий действия над классом awk выполняется при установке автоматически, если имеется файл, принадлежащий классу awk. В этом файле содержатся команды для сценария действия над классом awk в следующем формате:
Момент, когда должны выполняться команды, указывается следующими двумя командами. При установке пакета производится выполнение команд программы awk, которые следуют за командой !install. При удалении пакета производится автоматические выполнение команд, которые следуют за командой !remove. Эти команды могут выполняться в любом порядке.
Имя сценария действия над классом awk должно быть тем же, что и имя файла, над которым выполняются команды программы awk.
В качестве входных данных для команды awk используется файл, который необходимо изменить. В результате выполнения сценария производится полная замена исходного объекта. С помощью этого синтаксиса передать переменные среды для команды awk невозможно.
Для получения дополнительной информации о командах программы sed см. справочную страницу awk(1).
Класс build позволяет создавать или изменять файл объекта пакета путем выполнения инструкций интерпретатора команд sh. Эти команды предоставляются как объект пакета. Команды выполняются автоматически при установке, если объект пакета принадлежит к классу build.
Имя сценария действия над классом build должно быть тем же, что и имя файла, над которым выполняются команды. Имя должно допускать выполнение действия с помощь команды sh. Результат выполнения сценария становится новой версией измененного или созданного файла Если при выполнении сценария результат отсутствует, создание или изменение файла не производится. Таким образом, сценарий может создать или изменять сам файл.
Например, если в пакете поставляется файл /etc/randomtable по умолчанию, и если в целевой системе файл еще отсутствует, то запись файла prototype может иметь следующий вид:
e build /etc/randomtable ? ? ? |
Объект пакета /etc/randomtable может выглядеть следующим образом:
!install # randomtable builder if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then echo "/etc/randomtable is already in place."; else echo "# /etc/randomtable" > $PKG_INSTALL_ROOT/etc/randomtable echo "1121554 # first random number" >> $PKG_INSTALL_ROOT/etc/randomtable fi !remove # randomtable deconstructor if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then # the file can be removed if it's unchanged if [ egrep "first random number" $PKG_INSTALL_ROOT/etc/randomtable ]; then rm $PKG_INSTALL_ROOT/etc/randomtable; fi fi |
Еще один пример использования класса build приведен в Глава 5Практические примеры создания пакета.
Класс preserve позволяет сохранить файл объекта пакета путем определения необходимости перезаписи существующего файла при установке пакета. При использовании сценария класса preserve возможны два варианта действий:
Если устанавливаемый файл в целевом каталоге отсутствует, он будет установлен в стандартном порядке.
Если устанавливаемый файл в целевом каталоге уже имеется, появится сообщение о том, что файл уже существует. Установка файла производиться не будет.
Для сценария preserve оба варианта являются успешными. Ошибка происходит только во втором варианте, если выполнить копирование файла в целевой каталог невозможно.
Начиная с Solaris 7, сценарий i.preserve и его копия - i.CONFIG.prsv - находятся в каталоге /usr/sadm/install/scripts, где имеются и другие сценарии действий над классами.
Измените сценарий, добавив имена файлов, изменение которых необходимо предотвратить.
Класс manifest служит для автоматической установки и удаления служб SMF (подсистемы управления службами), связанных с манифестом SMF. Для получения ознакомительной информации относительно управления службами с помощью SMF см. Глава 17, Managing Services (Overview), в System Administration Guide: Basic Administration.
Все манифесты служб в пакетах должны быть обозначены классом manifest. В подсистему пакетов включены сценарии действий классов, предназначенные для установки и удаления манифестов служб При вызове команды pkgadd(1M) выполняется импорт манифеста. При вызове команды pkgrm(1M) выполняется удаление отключенных экземпляров в манифесте служб. Все службы в манифесте, для которых не осталось экземпляров, также удаляются. Если командам pkgadd (1M) или pkgrm (1M) передается параметр -R, то соответствующие действия манифеста служб выполняются при следующей перезагрузке системы с альтернативным корневым путем.
В приведенном ниже фрагменте кода из файла информации о пакете демонстрируется использование класса manifest.
# packaging files i pkginfo i copyright i depend i preinstall i postinstall i i.manifest i r.manifest # # source locations relative to the prototype file # d none var 0755 root sys d none var/svc 0755 root sys d none var/svc/manifest 0755 root sys d none var/svc/manifest/network 0755 root sys d none var/svc/manifest/network/rpc 0755 root sys f manifest var/svc/manifest/network/rpc/smserver.xml 0444 root sys