Guide du développeur pour l'empaquetage d'applications

Mise à niveau des packages

La procédure de mise à niveau d'un package est très différente de la procédure de remplacement d'un package. Bien qu'il existe des outils particuliers prenant en charge la mise à niveau des packages standard fournis dans le cadre du système d'exploitation Solaris, un package non fourni en standard peut être conçu pour prendre en charge sa propre mise à niveau ; plusieurs des exemples précédents décrivent des packages qui prévoient et contrôlent minutieusement la méthode d'installation sous la direction de l'administrateur. Vous pouvez concevoir le script request pour qu'il prenne aussi en charge la mise à niveau directe d'un package. Si l'administrateur décide d'installer un package en remplacement intégral d'un autre package, ne laissant aucun fichier obsolète, les scripts du package peuvent se charger de l'opération.

Le script request et le script postinstall de cet exemple fournissent un package simple pouvant être mis à niveau. Le script request communique avec l'administrateur et définit ensuite un fichier simple dans le répertoire /tmp pour supprimer l'ancienne instance du package. Bien que le script request crée un fichier (ce qui est interdit), l'opération est passée outre car tous les utilisateurs ont accès au fichier /tmp.

Le script postinstall exécute ensuite le script shell dans /tmp, lequel exécute la commande pkgrm requise sur l'ancien package avant de s'auto-supprimer.

Cet exemple illustre une mise à niveau de base. Il se compose de moins de cinquante lignes de code et contient d'assez longs messages. Il pourrait être étendu afin de désinstaller la mise à niveau ou d'apporter d'autres transformations majeures au package en fonction des besoins du concepteur.

Le concepteur de l'interface utilisateur d'une option de mise à niveau doit être certain que l'administrateur connaît la procédure et qu'il a expressément demander une mise à niveau plutôt qu'une installation en parallèle. La réalisation d'une opération complexe bien comprise telle qu'une mise à niveau est tout à fait acceptable tant que l'interface utilisateur clarifie l'opération.

Script request

# 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

Script postinstall

# 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