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

Обновление пакетов

Процесс обновления пакета сильно отличается от процесса перезаписи пакета. Несмотря на то, что имеются специальные средства, позволяющие обновлять стандартные пакеты, поставляемые как часть ОС Solaris, несобранный пакет может быть разработан с поддержкой собственного обновления – в некоторых предыдущих примерах описывались пакеты, подготовленные к будущим обновлениям и контролирующие точный метод установки под руководством администратора. Кроме того, можно создать сценарий request, который будет поддерживать прямое обновление пакета. Если администратор решит установить один пакет так, чтобы полностью удалить другой, не оставляя лишних устаревших файлов, сценарии пакета могут справиться с этой задачей.

Сценарии request и postinstall в приводимом примере предоставляют простой обновляемый пакет. Сценарий request открывает диалог с администратором, а затем создает простой файл в каталоге /tmp, служащий для удаления экземпляра старого пакета. (Хотя сценарий request и создает файл (что запрещено), в нашем случае это неважно, поскольку у всех есть доступ к каталогу /tmp).

Затем сценарий postinstall запускает сценарий интерпретатора команд в каталоге /tmp, который выполняет необходимую команду pkgrm на старом пакете и после этого удаляет себя.

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

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

Сценарий request

# request script
control an upgrade installation
 
PATH=/usr/sadm/bin:$PATH
UPGR_SCRIPT=/tmp/upgr.$PKGINST
 
UPGRADE_MSG="Do you want to upgrade the installed version ?"
 
UPGRADE_HLP="If upgrade is desired, the existing version of the \
	package will be replaced by this version. If it is not \
	desired, this new version will be installed into a different \
	base directory and both versions will be usable."
 
UPGRADE_NOTICE="Conflict approval questions may be displayed. The \
	listed files are the ones that will be upgraded. Please \
	answer \"y\" to these questions if they are presented."
 
pkginfo -v 1.0 -q SUNWstuf.\*
 
if [ $? -eq 0 ]; then
	  # See if upgrade is desired here
	  response=`ckyorn -p "$UPGRADE_MSG" -h "$UPGRADE_HLP"`
	  if [ $response = "y" ]; then
		    OldPkg=`pkginfo -v 1.0 -x SUNWstuf.\* | nawk ' \
		    /SUNW/{print $1} '`
		    # Initiate upgrade
		    echo "PATH=/usr/sadm/bin:$PATH" > $UPGR_SCRIPT
		    echo "sleep 3" >> $UPGR_SCRIPT
		    echo "echo Now removing old instance of $PKG" >> \
		    $UPGR_SCRIPT
		    if [ ${PKG_INSTALL_ROOT} ]; then
			      echo "pkgrm -n -R $PKG_INSTALL_ROOT $OldPkg" >> \
			      $UPGR_SCRIPT
		    else
			      echo "pkgrm -n $OldPkg" >> $UPGR_SCRIPT
		    fi
		    echo "rm $UPGR_SCRIPT" >> $UPGR_SCRIPT
		    echo "exit $?" >> $UPGR_SCRIPT
 
		    # Get the original package's base directory
		    OldBD=`pkgparam $OldPkg BASEDIR`
		    echo "BASEDIR=$OldBD" > $1
		    puttext -l 5 "$UPGRADE_NOTICE"
	   else
		     if [ -f $UPGR_SCRIPT ]; then
			       rm -r $UPGR_SCRIPT
		     fi
	   fi
fi
 
exit 0

Сценарий postinstall

# postinstall
to execute a simple upgrade
 
PATH=/usr/sadm/bin:$PATH
UPGR_SCRIPT=/tmp/upgr.$PKGINST
 
if [ -f $UPGR_SCRIPT ]; then
	  sh $UPGR_SCRIPT &
fi
 
exit 0