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

Пример. Аналитические сценарии, осуществляющие увод BASEDIR

Предположим, что SUNWstuf для процессора архитектуры x86 уже установлен на сервере в каталоге /opt/SUNWstuf. Когда администратор выполняет команду pkgadd для установки SPARC, сценарий request должен обнаружить существование версии x86 и начать диалог с администратором касательно данной установки.


Примечание –

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


Сценарии request и checkinstall для пакета, который регулирует эту ситуацию, может выглядеть следующим образом:

Сценарий request

# 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

# 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 имеет только две возможности: продолжить работу и завершить ее.