O processo de atualização de um pacote é muito diferente do processo de substituição de um pacote. Ao mesmo tempo em que há ferramentas especiais que oferecem suporte à atualização de pacotes padrão entregues como parte do sistema operacional Solaris, um pacote não incorporado pode estar destinado a oferecer suporte a sua própria atualização — vários exemplos anteriores descreveram os pacotes pensados para o futuro e que controlam o método exato de instalação sob a direção do administrador. Você também pode criar um script request para oferecer suporte à atualização direta de um pacote. Se o administrador optar por instalar um pacote de modo a substituir completamente o outro, sem deixar rastro de arquivos obsoletos, os scripts de pacote podem fazê-lo.
O script request e o script postinstall deste exemplo oferecem um pacote atualizável simples. O script request se comunica com o administrador e configura um arquivo simples no diretório /tmp para remover a instância de pacote antiga. (Embora o script request crie um arquivo (que é proibido), não há problema porque todos têm acesso ao /tmp).
O script postinstall executa, então, o script shell em /tmp, que executa o comando pkgrm necessário contra o pacote antigo e, em seguida, se auto-exclui.
Este exemplo ilustra uma atualização básica. Tem menos de cinqüenta linhas de código incluindo algumas mensagens bastante longas. Pode ser estendido para que devolva a atualização ou realize outras transformações principais no pacote conforme requerido pelo criador.
O design de uma opção de atualização da interface de usuário deve estar absolutamente segura de que o administrador está totalmente ciente do processo e solicitou ativamente a atualização em vez da instalação paralela. Não há nada de errado em realizar uma operação complexa como a atualização contanto que a interface de usuário permita que a operação seja realizada com clareza.
# 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 |