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

Создание сценариев установки

В этом разделе описываются дополнительные сценарии установки пакетов. С помощью команды pkgadd автоматически выполняются все действия, необходимые для установки пакета, с использованием информационных файлов в качестве входных данных. Предоставлять сценарии установки пакета нет необходимости. Однако если для пакета требуется создать специальные процедуры установки, это можно сделать с помощью сценариев установки. Сценарии установки:

Выполнять пользовательские действия можно при помощи четырех типов сценариев установки:

Обработка сценария во время установки пакета

Тип используемых сценариев зависит от того, в какой момент процесса установки необходимо действие над классом. После установки пакета с помощью команды pkgadd выполняются следующие действия.

  1. Выполняется сценарий request

    Пакет может запросить данные от администратора, который выполняет установку, только во время этого действия.

  2. Выполняется сценарий checkinstall

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

  3. Выполняется сценарий preinstall

  4. Выполняется установка объектов пакета для каждого устанавливаемого класса.

    Установка этих файлов производится по классам. Сценарии действий над классами выполняются соответствующим образом. Список классов, над которыми выполняется действие, и порядок их установки изначально определяется с помощью параметра CLASSES в файле pkginfo. Однако сценарий request или checkinstall может изменять значение параметра CLASSES. Для получения дополнительной информации об обработки классов во время установки см. раздел Обработка классов во время установки пакета.

    1. Выполняется создание символьных ссылок, устройств, именованных каналов и необходимых каталогов.

    2. Выполняется установка стандартных файлов (типы файлов e, v, f) на основе их классов

      Сценарий действия над классом разрешает установку только обычных файлов. Все другие объекты пакета создаются автоматически на основе информации в файле pkgmap.

    3. Создаются все жесткие ссылки.

  5. Выполняется сценарий postinstall.

Обработка сценариев во время удаления пакета

При удалении пакета команда pkgrm выполняет следующие действия:

  1. Выполняется сценарий preremove.

  2. Выполняется удаление объектов пакета для каждого класса

    Удаление также производится по классам. Обработка сценариев удаления производится в порядке, обратному порядку установки, на основе последовательности, определенной в параметре CLASSES. Для получения дополнительной информации об обработки классов во время установки см. раздел Обработка классов во время установки пакета.

    1. Выполняется удаление жестких ссылок.

    2. Выполняется удаление стандартных файлов.

    3. Выполняется удаление символических ссылок, устройств и именованных каналов.

  3. Выполняется сценарий postremove.

Обработка сценария request во время удаления пакета не производится. Однако результат выполнения сценария сохраняется в установленном пакете и предоставляется для сценариев удаления. Результат выполнения сценария request - это список переменных среды.

Доступные для сценариев переменные среды пакета

Для всех сценариев установки доступны следующие группы переменных среды. Некоторые из переменных среды можно изменить с помощью сценария request или сценария checkinstall.

Получение информации пакета для сценария

Для получения информации о пакете можно использовать две команды:

Коды выхода для сценария

Каждый сценарий должен завершать работу с использованием кодов выхода, перечисленных в таблице ниже.

Таблица 3–2 Коды выхода сценария установки

Код 

Описание 

Успешное выполнение сценария.  

Неустранимый сбой. При этом производится прерывание процесса установки.  

2  

Предупреждение или состояние возможной ошибки. Процесс установки продолжается. По завершении установки показывается сообщение с предупреждением.  

3  

Выполнение команды pkgadd останавливается. Это код возвращается только сценарием checkinstall.

10  

По завершении установки всех пакетов необходимо перезагрузить компьютер. (Это значение должно быть добавлено к одному из одноразрядных числовых кодов выхода.)  

20  

По завершении установки текущего пакета следует немедленно перезагрузить компьютер. (Это значение должно быть добавлено к одному из одноразрядных числовых кодов выхода.)  

Примеры кодов выхода, возвращаемых сценариями установки, приведены в Глава 5Практические примеры создания пакета.


Примечание –

Все включенные в пакет сценарии установки должны иметь записи в файле prototype. Файл должен иметь тип i (для сценария установки пакета).


Создание сценария request

Сценарий request представляет собой единственный способ взаимодействия администратора с устанавливаемым пакетом. Это сценарий можно использовать, например, чтобы предоставить администратору возможность выбора установки дополнительных компонентов пакета.

Результат выполнения сценария request должен представлять собой список переменных и их значений. В этот список могут входить любые параметры, созданные в файле pkginfo, а также параметры CLASSES и BASEDIR. В этом списке могут быть указаны переменные среды, которые не назначены в других компонентах. Однако файл pkginfo должен всегда содержать умолчания значений (когда это практически необходимо). Для получения дополнительной информации о переменных среды пакета см. раздел Переменные среды пакета.

Когда сценарий request производит назначение значений для переменной, они должны быть предоставлены для использования командой pkgadd и других сценариев установки.

Поведение сценария request

Правила разработки сценариев request


Примечание –

Если администратор, который будет устанавливать пакет, использует решение JumpStartTM, то установка пакета не должна осуществляться в интерактивном режиме. Необходимо или не предоставлять для своего пакета сценарий request, или сообщать администраторам, чтобы до установки пакета они использовали команду pkgask. Команда pkgask сохраняет ответы администраторов в сценарийrequest. Для получения дополнительных сведений о команде pkgask см. справочную страницу pkgask(1M).


ProcedureСоздание сценария request

  1. Сделайте каталог, где содержатся информационные файлы, текущим рабочим каталогом.

  2. Создайте файл request с помощью любого текстового редактора.

  3. По завершении сохраните изменения и закройте редактор.

  4. Выполните одну из следующих задач.

  5. Выполните сборку пакета.

    В случае необходимости см. главу Как собрать пакет.


Пример 3–5 Создание сценария request

Когда сценарий request присваивает значения переменным среды, они должны быть доступны для команды pkgadd. В примере ниже показан сегмент сценария request, который выполняет эту задачу для четырех переменных среды: CLASSES, NCMPBIN, EMACS и NCMPMAN. Предположим, что эти переменные были определены во время интерактивного сеанса сценария ранее.


# make environment variables available to installation
# service and any other packaging script we might have
 
cat >$1 <<!
CLASSES=$CLASSES
NCMPBIN=$NCMPBIN
EMACS=$EMACS
NCMPMAN=$NCMPMAN
!

См. также

После сборки пакета установите его для подтверждения правильности выполнения установки и проверьте его целостность. В Глава 4Проверка и запись пакета содержатся пояснения по этим задачам и поэтапные указания по записи проверенного пакета на распространяемый носитель.

Сбор данных о файловой системе с помощь сценария checkinstall

Сценарий checkinstall выполняется вскоре после необязательного сценария request. Сценарий checkinstall выполняется от имени пользователя install, если такой существует, или от имени пользователя nobody. Сценарийcheckinstall не имеет полномочий на изменение данных файловой системы. Однако в зависимости от собранной информации сценарий может создавать или изменять переменные среды для контроля за ходом итоговой установки. Сценарий также может безопасно остановить процесс установки.

Сценарий checkinstall предназначен для выполнения основной проверки файловой системы, которая будет стандартной для выполнения команды pkgadd. Например, этот сценарий может использоваться для предварительной проверки возможности перезаписи существующих файлов или управления общими зависимостями программ. Файл depend производит управление только зависимостями на уровне пакета.

В отличие от сценария request, сценарий checkinstall выполняется вне зависимости от наличия файла с результатами выполнения. Наличие сценария не позволяет считать пакет интерактивным. Сценарий checkinstall можно использовать, если сценарий request запрещен или взаимодействие с администраторам нецелесообразно.


Примечание –

Сценарий checkinstall доступен, начиная с Solaris 2.5 и совместимых выпусков.


Поведение сценария checkinstall

Правила разработки сценария checkinstall

ProcedureСбор данных о файловой системе

  1. Сделайте каталог, где содержатся информационные файлы, текущим рабочим каталогом.

  2. С помощью любого текстового редактора создайте файл с именем checkinstall.

  3. По завершении сохраните изменения и закройте редактор.

  4. Выполните одну из следующих задач.

  5. Выполните сборку пакета.

    В случае необходимости см. главу Как собрать пакет.


Пример 3–6 Создание сценария checkinstall

В этом примере сценария checkinstall производится проверка, установлено ли требуемое для пакета SUNWcadap ПО базы данных.


# checkinstall script for SUNWcadap
#
# This confirms the existence of the required specU database
 
# First find which database package has been installed.
pkginfo -q SUNWspcdA	# try the older one
 
if [ $? -ne 0 ]; then
   pkginfo -q SUNWspcdB	# now the latest
 
	  if [ $? -ne 0 ]; then	# oops
		    echo "No database package can be found. Please install the"
		    echo "SpecU database package and try this installation again."
		    exit 3		# Suspend
	  else
		    DBBASE="`pkgparam SUNWsbcdB BASEDIR`/db"	# new DB software
	  fi
else
	  DBBASE="`pkgparam SUNWspcdA BASEDIR`/db"	# old DB software
fi
 
# Now look for the database file we will need for this installation
if [ $DBBASE/specUlatte ]; then
	  exit 0		# all OK
else
	  echo "No database file can be found. Please create the database"
	  echo "using your installed specU software and try this"
	  echo "installation again."
	  exit 3		# Suspend
fi
 

См. также

После сборки пакета установите его для подтверждения правильности выполнения установки и проверьте его целостность. В Глава 4Проверка и запись пакета содержатся пояснения по этим задачам и поэтапные указания по записи проверенного пакета на распространяемый носитель.

Создание процедурных сценариев

Процедурные сценарии позволяют установить набор инструкций, которые выполняются в конкретные моменты при установке или удалении пакета. Каждый из четырех процедурных сценариев должен иметь одно из четырех заранее определенных имен в зависимости от выполняемых инструкций. Сценарии выполняются без аргументов.

Поведение сценариев процедур

Процедурные сценарии выполняются от имени uid=root и gid=other.

Правила разработки процедурных сценариев

ProcedureСоздание процедурных сценариев

  1. Сделайте каталог, где содержатся информационные файлы, текущим рабочим каталогом.

  2. Создайте один или более процедурный сценарий с помощью любого текстового редактора.

    Процедурный сценарий должен иметь одно из ранее определенных имен: preinstall, postinstall, preremove или postremove.

  3. Сохраните изменения и выйдите из редактора.

  4. Выполните одну из следующих задач.

  5. Выполните сборку пакета.

    В случае необходимости см. главу Как собрать пакет.

См. также

После сборки пакета установите его для подтверждения правильности выполнения установки и проверьте его целостность. В Глава 4Проверка и запись пакета содержатся пояснения по этим задачам и поэтапные указания по записи проверенного пакета на распространяемый носитель.

Создание сценариев действий над классами

Определение классов объекта

Классы объектов позволяют выполнять серию действий над группой объектов пакета при установке или удалении. Назначение объектов классу производится в файле prototype. Все объекты пакета должны иметь определенный класс, а для объектов, не требующих специального действия, по умолчанию используется класс none.

Параметр установки CLASSES, назначенный в файле pkginfo представляет собой список устанавливаемых классов (включая класс none).


Примечание –

Объекты, определенные в файле pkgmap, которые принадлежат классу, не указанному в этом параметре в файле pkginfo, установлены не будут.


Порядок установки определяется списком CLASSES. Класс none, если он имеется, всегда устанавливается первым и удаляется последним. Поскольку каталоги являются основной структурой поддержки для всех других объектов файловой системы, они должны иметь класс none. Возможны исключения, однако, как правило, класс none является самым безопасным. Эта стратегия позволяет обеспечить создание каталогов до объектов, которые в них будут содержаться. Кроме того, каталоги удаляться не будут до тех пор, пока не будут удалены содержащиеся в них объекты.

Обработка классов во время установки пакета

Ниже приведено описание действий системы при установке класса. Эти действия повторяются для каждого тома пакета во время его установки.

  1. Команда pkgadd позволяет создать список путевых имен.

    С помощью команды pkgadd производится создание списка путевых имен, над которыми производит действие сценарий. В каждой строке этого списка указывается исходный и целевой пути, разделенные пробелом. Исходный путь указывает, где в установочном томе расположен устанавливаемый объект . Целевой путь указывает местоположение в целевой системе, куда будет устанавливаться объект. Содержимое списка ограничивается следующими критериями.

    • В списке содержатся только путевые имена, принадлежащие связанному классу.

    • При сбое создания объекта пакета каталоги, именованные каналы, символьные устройства, блочные устройства и символические ссылки включаются в список с исходными путевым именем, равным /dev/null. Обычно эти элементы автоматически создаются с помощью команды pkgadd (если еще не существуют) и наделяются правильными атрибутами (режим, владелец, группа) согласно определению в файле pkgmap.

    • В список ни в коем случае не включаются связанные файлы типа l. Жесткие ссылки в данном классе создаются в элементе 4.

  2. Если для установки конкретного класса не предоставлен сценарий действия над классом, путевые имена в создаваемом списке копируются из тома в соответствующее целевое местоположение.

  3. Выполняется сценарий действия над классом (если существует).

    При вызове сценария действия над классом на его стандартный вход подается список, созданный в элементе 1. Если этот том является последним томом пакета или при отсутствии других объектов в этом классе сценарий выполняется с единственным аргументом ENDOFCLASS.


    Примечание –

    Даже если в пакете больше нет обычных файлов этого класса, производится вызов сценария действия над классом как минимум один раз с пустым списком и аргументом ENDOFCLASS.


  4. Командаpkgadd осуществляет аудит содержимого и атрибутов, а также создание жестких ссылок.

    После успешного выполнения элемента 2 или 3 команда pkgadd производит аудит содержимого и информации атрибутов для списка путевых имен. Команда pkgadd автоматически создает ссылки, связанные с классом. Обнаруженные несовпадения атрибутов в созданном списке исправляются для всех путевых имен.

Обработка классов при удалении пакета

Объекты удаляются по классам. Сначала удаляются классы, существующие для пакетов, однако не перечисленные в параметре CLASSES (например, объект, установленный с помощью команды installf). Классы, указанные в параметре CLASSES, удаляются в обратном порядке. Класс none всегда удаляется в последнюю очередь. Ниже описаны действия, которые производятся в системе при удалении класса.

  1. Создание списка путевых имен с помощью команды pkgrm.

    Производится создание списка установленных путевых имен, принадлежащих указанному классу, с помощью команды pkgrm. Путевые имена, на которые ссылается другой пакет, из этого списка исключаются, если они не принадлежат к типу e. Тип файлов e означает, что по установки или удалении файл должен быть изменен.

    Если удаляемый пакет произвел изменение каких-либо файлов типа e во время установки, то при удалении производится удаление только добавленных строк. Не удаляйте непустой редактируемый файл. Удалите строки, которые были добавлены пакетом.

  2. Если сценария действия над классом не существует, производится удаление путевых имен.

    Если в пакете отсутствуют сценарии действий над классами для этого класса, производится удаление всех путевых имен в списке, созданном с помощью команды pkgrm.


    Примечание –

    Файлам, принадлежащим к типу e (редактируемые), не назначается класс и связанный с ним сценарий действия над классом. Эти файлы удаляются в данный момент, даже если их путевые имена используются другими пакетами.


  3. Если сценарий действия над классом уже существует, производится выполнение сценария.

    Командаpkgrm производит вызов сценария действия над классом, на стандартный вход которого подается список, созданный в элементе 1.

  4. Командаpkgrm выполняет аудит.

    После успешного выполнения сценария действия над классом команда pkgrm производит удаление ссылок на путевые имена из БД пакета, если на них нет ссылок других пакетов.

Сценарий действия над классом

Сценарий действия над классом определяет набор действия для выполнения при установке или удалении пакета. Действия выполняются над группой путевых имен в зависимости от их определения класса. Примеры сценариев действий над классами приведены в Глава 5Практические примеры создания пакета.

Имя сценария действия над классом основывается на классе, над которым должно производиться действие, а также на том, должны ли эти действия производиться при установке или удалении пакета. В следующей таблице показаны два формата имен:

Формат имени 

Описание 

i.класс

Производит действия над путевыми именами в указанном классе при установке пакета 

r.класс

Производит действия над путевыми именами в указанном классе при удалении пакета  

Например, имя сценария установки для класса с именем manpage будетi.manpage. Сценарий удаления должен иметь имя r.manpage.


Примечание –

Этот формат имен файлов не используется для файлов, которые принадлежат к системным классам sed, awk или build. Для получения дополнительной информации по этим классам см. раздел Специальные системные классы .


Поведение сценариев действий над классами

Правила разработки сценариев действий над классами

Специальные системные классы

В системе имеются четыре специальных класса:

Если для некоторых файлов необходима специальная обработка, выполнение которой может быть невозможно с помощью команд sed, awk илиsh, установка с помощью системных классов может производиться быстрее, чем с помощью нескольких классов и соответствующих сценариев действий над классами.

Сценарий класса sed

Класс sed обеспечивает метод изменения существующего объекта в целевой системе. Сценарий действия над классом sed выполняется при установке автоматически, если имеется файл, принадлежащий классу sed. Имя сценария действия над классом sed должно быть тем же, что и имя файла, над которым выполняются команды.

Сценарий действия над классом sed обеспечивает передачу инструкций sed в следующем формате:

Время, когда должны выполняться команды, показывается следующими двумя командами. При установке пакета производится выполнение команды программы sed, которая следует за командой !install. При удалении пакета производится выполнение команды программы sed, которая следует за командой !remove. Порядок, в котором используются эти команды, не учитывается.

Для получения дополнительной информации об командах программы sed см. справочную страницу sed(1). Примеры сценариев действий над классами sed приведены в Глава 5Практические примеры создания пакета.

Сценарий класса awk

Класс awk обеспечивает метод изменения существующего объекта в целевой системе. Изменения производятся согласно командам программы awk в сценарии действия над классом awk .

Сценарий действия над классом awk выполняется при установке автоматически, если имеется файл, принадлежащий классу awk. В этом файле содержатся команды для сценария действия над классом awk в следующем формате:

Момент, когда должны выполняться команды, указывается следующими двумя командами. При установке пакета производится выполнение команд программы awk, которые следуют за командой !install. При удалении пакета производится автоматические выполнение команд, которые следуют за командой !remove. Эти команды могут выполняться в любом порядке.

Имя сценария действия над классом awk должно быть тем же, что и имя файла, над которым выполняются команды программы awk.

В качестве входных данных для команды awk используется файл, который необходимо изменить. В результате выполнения сценария производится полная замена исходного объекта. С помощью этого синтаксиса передать переменные среды для команды awk невозможно.

Для получения дополнительной информации о командах программы sed см. справочную страницу awk(1).

Сценарий класса build

Класс 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 возможны два варианта действий:

Для сценария preserve оба варианта являются успешными. Ошибка происходит только во втором варианте, если выполнить копирование файла в целевой каталог невозможно.

Начиная с Solaris 7, сценарий i.preserve и его копия - i.CONFIG.prsv - находятся в каталоге /usr/sadm/install/scripts, где имеются и другие сценарии действий над классами.

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

Сценарий класса manifest

Класс 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

ProcedureСоздание сценариев действий над классом

  1. Сделайте каталог, где содержатся информационные файлы, текущим рабочим каталогом.

  2. Назначьте для объектов пакета необходимые имена классов в файле prototype.

    Например, при назначении объектам классов applicationи manpage строка будет выглядеть следующим образом:


    f manpage /usr/share/man/manl/myappl.1l
    f application /usr/bin/myappl
  3. Измените параметр CLASSES в файле pkginfo, добавив в него имена классов, которые необходимо использовать в пакете.

    Например, записи для классов applicationи manpage будут выглядеть следующим образом:


    CLASSES=manpage application none

    Примечание –

    Класс none всегда устанавливается первым и удаляется последним вне зависимости от места, где он указан в определении параметра CLASSES.


  4. Если вы создаете сценарий действия над классом для файла, принадлежащего классу sed, awk или build, сделайте каталог, содержащий объект пакета, текущим рабочим каталогом.

  5. Создайте сценарии действий над классами или объекты пакета (для файлов, которые принадлежат классу sed, awk или build).

    Например, сценарий установки для класса с именем application будет иметь имя i.application, а сценарий удаления будет иметь имя r.application.

    Помните о том, что если файл является частью класса, который имеет сценарий действия над классом, то этот файл должен быть установлен сценарием. Командаpkgadd не производит установку файлов, для которых существует сценарий действия над классом, однако с ее помощью производится проверка установки. Кроме того, если вы определите класс, однако не создадите сценарий действия над классом, единственное действие, которое будет возможно для этого класса - копирование компонентов с установочного носителя в целевую систему (поведения по умолчанию команды pkgadd).

  6. Выполните одну из следующих задач.

  7. Выполните сборку пакета.

    В случае необходимости см. главу Как собрать пакет.

Что делать дальше

После сборки пакета установите его для подтверждения правильности выполнения установки и проверьте его целостность. В Глава 4Проверка и запись пакета содержатся пояснения по выполнению этой задачи и поэтапные указания по записи проверенного пакета на носитель для распространения.