パッケージのアップグレードのプロセスは、パッケージの上書きのプロセスとは異なっています。Solaris OS の一部として提供される標準パッケージのアップグレードをサポートする特殊ツールはありますが、アンバンドルのパッケージは独自のアップグレードをサポートするように設計できます。前のいくつかの例で、先を見越して、管理者の管理下でインストールの正確な方法を制御するパッケージについて説明しました。同様に、パッケージの直接アップグレードをサポートする request スクリプトを設計できます。管理者が、古いファイルが残らないように、あるパッケージをすべて置き換えて別のパッケージをインストールすることにした場合、パッケージスクリプトでこの処理を行うことができます。
この例の request スクリプトおよび postinstall スクリプトでは、単純なアップグレード可能パッケージを提供しています。request スクリプトは管理者と対話して、古いパッケージインスタンスを削除するための簡単なファイルを /tmp ディレクトリに設定します。request スクリプトはファイルを作成します (これは禁止されている) が、/tmp には全員がアクセスできるため、問題ありません。
postinstall スクリプトは、/tmp のシェルスクリプトを実行します。このスクリプトは、古いパッケージに対して必要な 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 |