升级软件包的过程与覆写软件包的过程极为不同。尽管有一些特殊工具支持对作为 Solaris OS 的一部分交付的标准软件包进行升级,但可以设计一个非随附软件包来支持它自己的升级-前面的多个示例描述了一些可在管理员指导下具有前瞻性并且控制精确安装方法的软件包。您还可以设计 request 脚本以支持软件包的直接升级。如果管理员选择安装一个软件包以便完全替换另一个软件包,并且不留下残余的过时文件,软件包脚本可以执行此任务。
此示例中的 request 脚本和 postinstall 脚本提供了一个简单的可升级软件包。request 脚本与管理员通信,然后在 /tmp 目录中设置一个简单的文件以删除旧的软件包实例。(虽然 request 脚本创建了一个被禁止的文件,但这不会有什么问题,因为每个人都有权访问 /tmp。)
然后, postinstall 脚本执行 /tmp 中的 shell 脚本,该脚本对旧软件包执行必要的 pkgrm 命令,然后删除它自身。
此示例演示基本升级。该示例少于 50 行代码,其中包括一些相当长的消息。可以对其进行扩展以回退升级,或者根据设计者的要求对软件包进行其他重要转换。
升级选项的用户界面设计必须完全确保管理员充分了解升级过程,并且已经主动请求升级而不是并行安装。只要用户界面能够清楚地说明操作,执行诸如升级这样的复杂操作就不会出现什么错误。
# 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 |