Предположим, что SUNWstuf для процессора архитектуры x86 уже установлен на сервере в каталоге /opt/SUNWstuf. Когда администратор выполняет команду pkgadd для установки SPARC, сценарий request должен обнаружить существование версии x86 и начать диалог с администратором касательно данной установки.
В сценарии checkinstall увод базового каталога может осуществляться и без взаимодействия с администратором, однако если произвольные операции подобно этой случаются слишком часто, то администраторы начинают испытывать недоверие к происходящему процессу.
Сценарии request и checkinstall для пакета, который регулирует эту ситуацию, может выглядеть следующим образом:
# request script
for SUNWstuf to walk the BASEDIR parameter.
PATH=/usr/sadm/bin:${PATH} # use admin utilities
GENMSG="The base directory $LOCAL_BASE already contains a \
different architecture or version of $PKG."
OLDMSG="If the option \"-a none\" was used, press the \
key and enter an unused base directory when it is requested."
OLDPROMPT="Do you want to overwrite this version? "
OLDHELP="\"y\" will replace the installed package, \"n\" will \
stop the installation."
SUSPEND="Suspending installation at user request using error \
code 1."
MSG="This package could be installed at the unused base directory $WRKNG_BASE."
PROMPT="Do you want to use to the proposed base directory? "
HELP="A response of \"y\" will install to the proposed directory and continue,
\"n\" will request a different directory. If the option \"-a none\" was used,
press the key and enter an unused base directory when it is requested."
DIRPROMPT="Select a preferred base directory ($WRKNG_BASE) "
DIRHELP="The package $PKG will be installed at the location entered."
NUBD_MSG="The base directory has changed. Be sure to update \
any applicable search paths with the actual location of the \
binaries which are at $WRKNG_BASE/EZstuf and $WRKNG_BASE/HRDstuf."
OldSolaris=""
Changed=""
Suffix="0"
#
# Determine if this product is actually installed in the working
# base directory.
#
Product_is_present () {
if [ -d $WRKNG_BASE/EZstuf -o -d $WRKNG_BASE/HRDstuf ]; then
return 1
else
return 0
fi
}
if [ ${BASEDIR} ]; then
# This may be an old version of Solaris. In the latest Solaris
# CLIENT_BASEDIR won't be defined yet. In older version it is.
if [ ${CLIENT_BASEDIR} ]; then
LOCAL_BASE=$BASEDIR
OldSolaris="true"
else # The base directory hasn't been processed yet
LOCAL_BASE=${PKG_INSTALL_ROOT}$BASEDIR
fi
WRKNG_BASE=$LOCAL_BASE
# See if the base directory is already in place and walk it if
# possible
while [ -d ${WRKNG_BASE} -a Product_is_present ]; do
# There is a conflict
# Is this an update of the same arch & version?
if [ ${UPDATE} ]; then
exit 0 # It's out of our hands.
else
# So this is a different architecture or
# version than what is already there.
# Walk the base directory
Suffix=`expr $Suffix + 1`
WRKNG_BASE=$LOCAL_BASE.$Suffix
Changed="true"
fi
done
# So now we can propose a base directory that isn't claimed by
# any of our other versions.
if [ $Changed ]; then
puttext "$GENMSG"
if [ $OldSolaris ]; then
puttext "$OLDMSG"
result=`ckyorn -Q -d "a" -h "$OLDHELP" -p "$OLDPROMPT"`
if [ $result="n" ]; then
puttext "$SUSPEND"
exit 1 # suspend installation
else
exit 0
fi
else # The latest functionality is available
puttext "$MSG"
result=`ckyorn -Q -d "a" -h "$HELP" -p "$PROMPT"`
if [ $? -eq 3]; then
echo quitinstall >> $1
exit 0
fi
if [ $result="n" ]; then
WRKNG_BASE=`ckpath -ayw -d "$WRKNG_BASE" \
-h "$DIRHELP" -p "$DIRPROMPT"`
else if [ $result="a" ]
exit 0
fi
fi
echo "BASEDIR=$WRKNG_BASE" >> $1
puttext "$NUBD_MSG"
fi
fi
exit 0
|
# checkinstall script for SUNWstuf to politely suspend grep quitinstall $1 if [ $? -eq 0 ]; then exit 3 # politely suspend installation fi exit 0 |
Данный подход работал бы не очень хорошо, если бы базовым каталогом был просто /opt. Данный пакет должен вызывать BASEDIR более конкретно, поскольку осуществить увод в каталоге /opt достаточно сложно. На самом деле, в зависимости от схемы монтирования, это может оказаться невозможным. В приведенном примере увод базового каталога осуществляется путем создания нового каталога, который не представляет никаких проблем, под каталогом /opt.
В примере используются сценарии request и checkinstall несмотря на то, что версии Solaris до выпуска 2.5 не допускали выполнения сценария checkinstall. Сценарий checkinstall в данном примере используется для приостановки процесса установки в ответ на частное сообщение в форме строки quitinstall. Если этот сценарий выполняется в Solaris 2.3, сценарий checkinstall игнорируется, и сценарий request приостанавливает установку и выдает сообщение об ошибке.
Помните, что в выпусках до Solaris 2.5 и совместимых выпусках параметр BASEDIR был параметром только для чтения и не мог быть изменен сценарием request. По этой причине при обнаружении (путем проверки обусловленной переменной среды CLIENT_BASEDIR) старой версии операционной системы SunOS сценарий request имеет только две возможности: продолжить работу и завершить ее.