home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / .extra.d / usr / sbin / pkginst / chkpkgrel next >
Text File  |  1998-08-19  |  8KB  |  272 lines

  1. # Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  2. #                                                                         
  3. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  4. #                   SANTA CRUZ OPERATION INC.                             
  5. #                                                                         
  6. #   The copyright notice above does not evidence any actual or intended   
  7. #   publication of such source code.                                      
  8.  
  9. #ident    "@(#)chkpkgrel.sh    15.1"
  10. #ident    "$Header: $"
  11.  
  12. #main()
  13. #  This script is invoked from the request script of a package, therefore
  14. #  $PKGINST must be defined. The script is optionally called with one arg.
  15. #  If there is an arg, then it checks the version of $1
  16. #
  17. #  It checks if the $PKGINST or $1 exists on the system.
  18. #  If so, it checks its VERSION.  It  exits with code:
  19. #    9, if $PKGINST (or $1) that is installed is a newer version 
  20. #    6, if $PKGINST (or $1) is installed and is 2.01 version (UPGRADE2)
  21. #    4, if $PKGINST (or $1) is installed and is 1.1 version (UPGRADE)
  22. #    2, if $PKGINST (or $1) is installed and is current version (OVERLAY)
  23. #            if the version of the installed package is older
  24. #            than that being installed, we'll create a file
  25. #            $UPGRADE_STORE/$PKGINST.ver
  26. #       1, if $PKGINST (or $1) is neither a UPGRADE or OVERLAYable
  27. #       0, if $PKGINST (or $1) is not installed or  other problems
  28. #
  29. #  This scripts is also invoked if a package is run in automatic mode.
  30. #  It is called from preinstall script either directly, or from 'pkgsavfiles'.
  31. #  If called in automatic mode, the menu to warn the user to remove the newer
  32. #  version, should have been handled via menu (set.8) of the set request script.#  Therefore, no user input is needed in the preinstall stage!
  33.  
  34. SBINPKGINST=/usr/sbin/pkginst
  35.  
  36. . $SBINPKGINST/updebug
  37.  
  38. # If PKGINST is in the file /tmp/pkg.newinstall, it is being installed
  39. # from the boot floppy, but it was not on the system originally.  So the
  40. # value of PKGINSTALL_TYPE which might be set in the common.sh file is
  41. # inaccurate, and this package should do a NEWINSTALL
  42.  
  43. grep "^$PKGINST$" /tmp/pkg.newinstall >/dev/null 2>&1  && exit 0
  44.  
  45. # If chkpkgrel is running from a request script run out
  46. # of the postreboot script after a boot floppy installation,
  47. # get the install type out of the file saved it from the
  48. # boot floppy
  49.  
  50. [ -f /etc/inst/scripts/common.sh ] && {
  51.     . /etc/inst/scripts/common.sh
  52.     case $PKGINSTALL_TYPE in
  53.         NEWINSTALL)
  54.             exit 0
  55.             ;;
  56.         OVERLAY)
  57.             exit 2
  58.             ;;
  59.         UPGRADE)
  60.             exit 4
  61.             ;;
  62.         UPGRADE2)
  63.             exit 6
  64.             ;;
  65.     esac
  66. }
  67. #
  68. #  Call Set_LANG defined in updebug to make sure LANG environment variable 
  69. #  is set.  UPGRADE_MSGS and menu_color will also be set.
  70.  
  71. [ "$UPDEBUG" = "YES" ] && set -x
  72. Set_LANG
  73. Chk_Color_Console
  74. export TERM
  75.  
  76. PKGVERSION=0        #pkg is not installed
  77.  
  78. # exit 0, if the user selected destructive install
  79. # That is, INSTALL_TYPE=NEWINSTALL in /var/sadm/upgrade/install_type
  80. [ -f /var/sadm/upgrade/install_type ] && {
  81.     . /var/sadm/upgrade/install_type
  82.     [ "$INSTALL_TYPE" = NEWINSTALL ] && exit $PKGVERSION
  83. }
  84.  
  85. pkg=$PKGINST
  86.  
  87. [ "$1" ] && pkg="$1"    #check existence/version of pkg $1
  88.  
  89. UPDIR=/etc/inst/up
  90. [ -d $UPDIR ] || mkdir -p $UPDIR
  91.  
  92. #UPGRADE_STORE=/var/sadm/upgrade
  93. UPGRADE_STORE=/etc/inst/save.user
  94. [ -d $UPGRADE_STORE ] || mkdir -p $UPGRADE_STORE
  95.  
  96. PKGINFO=/var/sadm/pkg/$pkg/pkginfo
  97.  
  98. [ "$1" ] && {
  99.  
  100.     # Note that if $1 is set, we are checking for a package other than 
  101.     # that being installed. We will set VERSION to 999. This means that 
  102.     # if current pkg is installed, we'll always return code 2 (indicating 
  103.     # OVERLAY). chkpkgrel is invoked with an arg when a pkg 
  104.     # being installed wants to check if another pkg is installed and if 
  105.     # yes, what version of it is installed. We don't want to return 9
  106.     # in this case.
  107.  
  108.     VERSION=999
  109.  
  110. }
  111.  
  112. # if $PKGINFO does not exist, this must be a new installation or
  113. # a version of the package which did not support 'pkginfo' is installed.
  114. # For all these cases we exit with code 0, implying destructive installation
  115.  
  116.  
  117. [ "$UPDEBUG" = "YES" ] && goany
  118.  
  119. [ -f $PKGINFO ] || exit $PKGVERSION
  120.  
  121. # Get the version number of the installed package.
  122. verline=`grep "^VERSION=" ${PKGINFO} 2>>$UPERR`
  123.  
  124. # Save IFS and restore it later.
  125. OIFS=$IFS; IFS="="
  126.  
  127. set $verline
  128. version=$2
  129.  
  130. # Get pstamp of installed package to retrieve release
  131. # PSTAMP=<REL><SPACE><DATE><SPACE> optionally followed by <SPACE><LOAD>.
  132.  
  133. stamp=`grep "^PSTAMP=" ${PKGINFO} 2>>$UPERR`
  134.  
  135. set $stamp
  136. # $1 is PSTAMP    $2 is <REL><SPACE><DATE>, optionally followed by <SPACE><LOAD>.
  137. # For SVR4.0 V4 $2 is not set.
  138.  
  139. [ "$2" ] && {
  140.     IFS=" "       # space
  141.     set $2       # now $1 is <REL>, $2 is <DATE>, and $3, if set, is load.
  142.     REL=$1       # REL (release) is set to SVR4.2
  143. }
  144.  
  145. # for SVR4.0 V4 we'll read RELEASE.
  146. [ "$REL" ] || {
  147.     release=`grep "^RELEASE=" ${PKGINFO} 2>>$UPERR`    # RELEASE=4.0
  148.     set $release
  149.     REL=$2
  150. }
  151.  
  152. IFS=$OIFS        # now reset IFS to the original IFS
  153.  
  154. PKGVERSION=1        # unknown version
  155. [ "$version" ] && {
  156.     # $VERSION is the version being installed.
  157.     # $version is the installed version
  158.  
  159.     case "$REL" in
  160.  
  161.         SVR4.2MP | UW2.0 | UW2.01)
  162.         PKGVERSION=6 ;;        # UW 2.0 or 2.01 package
  163.  
  164.         UW2.1)    #current PSTAMP as of eiger3, I suspect it will change
  165.  
  166.         [ $version -gt $VERSION ] && {    
  167.  
  168.             # If CALLED_FROM_SET is set, set request will do the
  169.             # the warning screen to pkgrm the newer package(s).
  170.  
  171.             [ "$CALLED_FROM_SET" ] && exit 9
  172.  
  173.             # Warn user to pkgrm the newer version installed.
  174.             # If version 1 pkg is being installed on a newer pkg,
  175.             # we'll ask the user to hit the delete key in the
  176.             # warning screen to terminate installation.
  177.             # This will prevent trashing of configuration files
  178.             # of the newer package.
  179.  
  180.             menu_colors warn
  181.             export PKGINST NAME VERSION version 
  182.  
  183.             WARN_MSG=$UPGRADE_MSGS/rm.newerpkg
  184.             menu -f ${WARN_MSG} -o /dev/null
  185.  
  186.             # If installing version 1 on top of a newer version, 
  187.             # send interrupt signal to all processes in this group
  188.             # so that installation is terminated and configuration 
  189.             # files are not trashed.
  190.             [ $VERSION = 1 ] &&  kill -2 0
  191.  
  192.             # If installing versions other than 1 on top of newer
  193.             # version, exit with code 9 to inform my parent to 
  194.             # signal installation termination to pkgadd by retuning
  195.             # code 3 to pkgadd.
  196.             exit 9
  197.         }
  198.  
  199.         [ $version -eq $VERSION ] && {
  200.             # same SVR4.2 package
  201.             # Return code 2 for OVERLAY  only if the pkg 
  202.             # is completely installed, 
  203.  
  204.             PKGVERSION=2     
  205.         }
  206.         [ $version -lt $VERSION ] && {
  207.             # Older SVR4.2 package. Return code will be 2 (OVERLAY).
  208.             # If any special processing is to be done for upgrade of
  209.             # an older SVR4.2 package, the package install scripts
  210.             # can look for the file $UPGRADE_STORE/${pkg}.ver
  211.  
  212.             PKGVERSION=2     
  213.  
  214.             # save older version of the pkg being installed in
  215.             # $UPGRADE_STORE/$pkg.ver. Note that if VERSION==999
  216.             # $PKGINST is checking if $pkg installed, and if yes,
  217.             # what version of $pkg is installed. In this case we do
  218.             # not need the $UPGRADE_STORE/$pkg.ver file.
  219.  
  220.             [ $VERSION -ne 999 ] && 
  221.                 echo $version >${UPGRADE_STORE}/${pkg}.ver
  222.         }
  223.  
  224.         [ "$version" != "$VERSION" ] && {
  225.             # versions are not identical, but might compare
  226.             # equal due to multiple '.' (2.0 vs 2.0.1 for example)
  227.             # Make $UPGRADE_STORE/$pkg.ver file.
  228.  
  229.             [ $VERSION -ne 999 ] &&
  230.                 echo $version >${UPGRADE_STORE}/${pkg}.ver
  231.         } ;;
  232.  
  233.         SVR4.2)
  234.         PKGVERSION=4    ;;    # UW 1.1
  235.         *)    ;;
  236.     esac
  237.  
  238.     # If /tmp/$pkg.Lock exists, the pkg is only partially installed
  239.     # and the pkg is installed via set installation.
  240.     # Reset the return code to 1,  for new installation of the pkg,
  241.     # if version is checked for the pkg being installed.
  242.  
  243.     [ -f /tmp/$pkg.Lock -a "$pkg" = "$PKGINST" ] && {
  244.         rm -f /tmp/$pkg.Lock
  245.         PKGVERSION=1
  246.     }
  247. }
  248.  
  249. # Create $UPGFILE so that pkgsavfiles.sh knows not to find pkg version again
  250. UPGFILE=$UPGRADE_STORE/$PKGINST.env
  251.  
  252. # Saving $PKGVERSION in $UPGFILE will enable to set PKGINSTALL_TYPE
  253. # in pkgsavfiles, if it is not set already.
  254.  
  255. [ "$pkg" = "$PKGINST" ] && {
  256.     case "$PKGVERSION" in
  257.         6)    PKGINSTALL_TYPE=UPGRADE2
  258.             break;;
  259.         4)    PKGINSTALL_TYPE=UPGRADE
  260.             break;;
  261.         2)    PKGINSTALL_TYPE=OVERLAY
  262.             break;;
  263.         0)    PKGINSTALL_TYPE=NEWINSTALL
  264.             break;;
  265.     esac
  266.     echo PKGINSTALL_TYPE=$PKGINSTALL_TYPE >"$UPGFILE"
  267. }
  268.  
  269. [ "$UPDEBUG" = "YES" ] && goany
  270.  
  271. exit $PKGVERSION
  272.