Процесс обновления пакета сильно отличается от процесса перезаписи пакета. Несмотря на то, что имеются специальные средства, позволяющие обновлять стандартные пакеты, поставляемые как часть ОС Solaris, несобранный пакет может быть разработан с поддержкой собственного обновления – в некоторых предыдущих примерах описывались пакеты, подготовленные к будущим обновлениям и контролирующие точный метод установки под руководством администратора. Кроме того, можно создать сценарий request, который будет поддерживать прямое обновление пакета. Если администратор решит установить один пакет так, чтобы полностью удалить другой, не оставляя лишних устаревших файлов, сценарии пакета могут справиться с этой задачей.
Сценарии request и postinstall в приводимом примере предоставляют простой обновляемый пакет. Сценарий request открывает диалог с администратором, а затем создает простой файл в каталоге /tmp, служащий для удаления экземпляра старого пакета. (Хотя сценарий request и создает файл (что запрещено), в нашем случае это неважно, поскольку у всех есть доступ к каталогу /tmp).
Затем сценарий postinstall запускает сценарий интерпретатора команд в каталоге /tmp, который выполняет необходимую команду pkgrm на старом пакете и после этого удаляет себя.
Данный пример иллюстрирует базовое обновление. В нем менее пятидесяти строк кода, включая несколько довольно длинных сообщений. Его функциональность можно расширить, например, чтобы отменить обновление или произвести другие важные изменения пакета по требованию разработчика.
Разработчик пользовательского интерфейса для обновления должен быть абсолютно уверен, что администратор полностью осознает процесс и действительно запросил обновление, а не параллельную установку экземпляра. Нет ничего страшного в выполнении хорошо понятой сложной операции, такой как обновление, при условии, что пользовательский интерфейс делает эту операцию понятной.
# 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 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 |