home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / doc / install / request < prev    next >
Text File  |  1998-08-19  |  30KB  |  1,144 lines

  1. #ident    "@(#)request    16.1    98/03/03"
  2. # set installation package (SIP) request script
  3.  
  4. PKGMSG=${SETINST}.pkg
  5. LOCALE=${LC_ALL:-${LC_MESSAGES:-${LANG:-"C"}}}
  6. MAX_MENU_FIELD_LEN="42"
  7.  
  8. #
  9. #  If this script exits normally or if DEL is pressed, clean up /tmp
  10. #  If DEL is pressed, make sure we exit 77 so pkgadd knows no packages
  11. #  were selected.
  12. #
  13. trap `rm /tmp/*$$ > /dev/null 2>&1; EXITCODE=77; exit` 2
  14. trap `rm /tmp/*$$ > /dev/null 2>&1; exit $EXITCODE` 0
  15.  
  16. #
  17. #  Definitions of files we're going to use.  They all end in $$ for
  18. #  easy cleanup (see trap stmt, above)
  19. #
  20. DEP_SUCC=/tmp/succ$$
  21. DEP_FAIL=/tmp/fail$$
  22. MENU_OUT=/tmp/out$$
  23. MENU_FILE=/tmp/menu$$
  24. PKGS_FILE=/tmp/pkglist$$
  25. PKG_RM=/tmp/pkgrm$$
  26. TAB='    '
  27.  
  28. if [ ! -f /usr/lib/locale/${LOCALE}/LC_MESSAGES/${PKGMSG} ]
  29. then
  30.    if [ -f ${REQDIR}/inst/locale/${LOCALE}/${PKGMSG} -a \
  31.     -d /usr/lib/locale/${LOCALE}/LC_MESSAGES ]
  32.    then
  33.     cp ${REQDIR}/inst/locale/${LOCALE}/${PKGMSG} \
  34.        /usr/lib/locale/${LOCALE}/LC_MESSAGES
  35.    fi
  36. fi
  37. #
  38. #  Set up the menu directory to be locale specific
  39. #
  40. MENU_DIR=/etc/inst/locale/${LOCALE}/menus/${PKG}
  41. [ -d ${MENU_DIR} ] || mkdir -p ${MENU_DIR}
  42.  
  43. MENUS="set.1 set.2 set.3 set.4 set.5 set.6 set.7 set.8 set.9"
  44.  
  45. for i in $MENUS
  46. do
  47.    if [ ! -f ${MENU_DIR}/$i ]
  48.    then
  49.       if [ -f ${REQDIR}/inst/locale/${LOCALE}/${PKG}/$i ]
  50.       then
  51.            cp ${REQDIR}/inst/locale/${LOCALE}/${PKG}/$i ${MENU_DIR}
  52.       else
  53.            cp ${REQDIR}/$i ${MENU_DIR}
  54.       fi
  55.    fi
  56. done
  57. #
  58. #  Set up to use menu_colors; default to C-locale if ${LOCALE}'s dir has
  59. #  no menu_colors.sh
  60. #
  61. if [ -f /etc/inst/locale/${LOCALE}/menus/menu_colors.sh ]
  62. then
  63.     . /etc/inst/locale/${LOCALE}/menus/menu_colors.sh
  64. else
  65.     . /etc/inst/locale/C/menus/menu_colors.sh
  66. fi
  67.  
  68. #####    Begin UPNOVER    ######
  69.  
  70. SCRIPTSDIR=/usr/sbin/pkginst
  71. . ${SCRIPTSDIR}/updebug
  72. [ "$UPDEBUG" = YES ] && set -x
  73.  
  74. # chk_upnover <resp_file> <pkginst>
  75. #
  76. # This routine returns 1 if AUTO/CUSTOM question is asked
  77. #              returns 0 if AUTO/CUSTOM question not to be asked
  78. chk_upnover () {
  79.     # $1 is the response file
  80.     # $2 is the pkgabbrev.  (a.k.a PKGINST)
  81.  
  82.     # chkpkgrel needs to know the VERSION being installed.
  83.     # grep VERSION from pkginfo for this pkg and export it.
  84.  
  85.     # save current VERSION if set.
  86.     [ "$VERSION" ] && O_VERSION=$VERSION
  87.     
  88.     grep "^VERSION=" $REQDIR/${2}/pkginfo >/tmp/$$.ver
  89.     [ -s /tmp/$$.ver ] && . /tmp/$$.ver
  90.     rm -f /tmp/$$.ver
  91.     export VERSION
  92.  
  93.  
  94.     [ "$UPDEBUG" = YES ] && goany
  95.  
  96.     # Set CALLED_FROM_SET and export it. When chkpkgrel finds a newer 
  97.     # version of a package already installed, it will not do the warning
  98.     # screen to tell the user to pkgrm the pkg, before the older version is
  99.     # installed, if CALLED_FFROM_SET is set. In this case a single warning
  100.     # screen 'set.8' is done in this request screen for all such packages.
  101.  
  102.     CALLED_FROM_SET=YES
  103.     export CALLED_FROM_SET
  104.  
  105.     ${SCRIPTSDIR}/chkpkgrel $2
  106.     PKGVERSION=$?
  107.     unset CALLED_FROM_SET
  108.  
  109.     unset VERSION
  110.     [ "$O_VERSION" ] && {
  111.         VERSION=$O_VERSION
  112.         unset O_VERSION
  113.     }
  114.  
  115.     # chkpkgrel returns 0: if pkg not installed
  116.     #                1: if pkg installed is neither SVR4.0 V4 nor SVR4.2
  117.     #            2: if SVR4.2 pkg installed
  118.     #                4: if SVR4.0 V4 pkg installed
  119.     #                9: if a newer version of SVR4.2 pkg is installed, 
  120.     #            in which case, tell'm to pkgrm it.
  121.  
  122.     [ "$UPDEBUG" = YES ] && goany
  123.  
  124.     # If AUTOMERGE is the only question to be asked, then AUTO/CUSTOM
  125.     # question should only be displayed for non-destructive installation.
  126.     # The response file for such a package must define ONLYVAR=UPNOVER.
  127.  
  128.     [ $PKGVERSION -lt 2 ] && {
  129.         grep "^ONLYVAR=UPNOVER" $1 >/dev/null 2>&1 || return 1
  130.         return 0
  131.     }
  132.  
  133.     # chkpkgrel exits with code, 9 they have to pkgrm this pkg.
  134.     [ $PKGVERSION -eq 9 ] && {
  135.         # list the pkg name in the file $PKG_RM. 
  136.         # It will be used in set.8 screen.
  137.  
  138.         echo $2 >>$PKG_RM
  139.         return 0
  140.     }
  141.     return 1
  142. }
  143.  
  144. check_oam_version ()
  145.     # check_oam_version $RESPDIR/${1}
  146.     # This procedure is run for packages run in AUTOMATIC install mode.
  147.     # It checks the version of oam package installed.
  148.     # If an OAM package other than SVR4.2 OAM is installed, it
  149.     # removes OAMadmin from the CLASSES defined in the response file.
  150.     # This should happen for nfs and inet packages. 
  151.     # The reason is that OAM interface will not be installed 
  152.     # for these packages, if non-SVR4.2 OAM is installed.
  153.     # This will be done by excluding OAMadmin from CLASSES.
  154.     #
  155.     # This is done here, because CLASSES can only be reset
  156.     # in the request script and request script is not run in 
  157.     # AUTOMATIC mode.
  158.  
  159.     # $1 is the response in which CLASSES may have OAMadmin defined
  160.  
  161.     # return codes: 0 if  non-SVR4.2 OAM was not detected
  162.     #               1 if  non-SVR4.2 OAM was detected.
  163.     #               2 if  non-SVR4.2 was detected and CLASSES for reset
  164.     #                     in the response file to eliminate OAMadmin
  165.  
  166.     #        9 if a newer oam was detected than the version of 
  167.     #          this set, in which chkpkgrel shows warning screen
  168.     #          if CALLED_FROM_SET in not set.
  169.  
  170.     RESPFL=$1
  171.  
  172.     # Set CALLED_FROM_SET and export it. When chkpkgrel finds a newer 
  173.     # version of a package already installed, it will not do the warning
  174.     # screen to tell the user to pkgrm the pkg, before the older version is
  175.     # installed, if CALLED_FFROM_SET is set. In this case a single warning
  176.     # screen 'set.8' is done in this request screen for all such packages.
  177.  
  178.     CALLED_FROM_SET=YES
  179.     export CALLED_FROM_SET
  180.  
  181.     ${SCRIPTSDIR}/chkpkgrel oam
  182.     PKGVERSION=$?
  183.  
  184.     unset CALLED_FROM_SET
  185.  
  186.     # chkpkgrel returns 0: if pkg not installed
  187.     #                1: if pkg installed is neither SVR4.0 V4 nor SVR4.2
  188.     #            2: if SVR4.2 pkg installed
  189.     #                4: if SVR4.0 V4 pkg installed
  190.     #                9: if a newer version of SVR4.2 pkg is installed, 
  191.     #            in which case, tell'm to pkgrm it.
  192.  
  193.     [ "$UPDEBUG" = YES ] && goany
  194.  
  195.     [ $PKGVERSION -eq 0 -o $PKGVERSION -eq 2 ] && return 0
  196.  
  197.     grep  "^CLASSES=.*OAMadmin" $RESPFL >/tmp/$$.newresp 2>&1 || return 1
  198.  
  199.     . /tmp/$$.newresp
  200.  
  201.     for i in `echo $CLASSES`
  202.     do 
  203.         [ "$i" = OAMadmin ] && continue
  204.  
  205.         NCLASSES="$NCLASSES$i "
  206.     done
  207.  
  208.     grep  -v "^CLASSES=.*OAMadmin" $RESPFL >/tmp/$$.newresp
  209.  
  210.     echo CLASSES="\"$NCLASSES\"" >>/tmp/$$.newresp
  211.  
  212.     mv /tmp/$$.newresp $RESPFL
  213.  
  214.     [ "$UPDEBUG" = YES ] && goany
  215.  
  216.     return 2
  217. }
  218.  
  219. #####    End UPNOVER    ######
  220. #
  221. #  This routine creates the business end of the first menu, where the
  222. #  user selects Yes (install) ir No (don't install) for each pkg in set.
  223. #
  224. mk_pkgs_menu1() {
  225.  
  226.     exec 3<&0
  227.     #
  228.     #  Create the form section of the first set menu.
  229.     #
  230.     echo ".form"
  231.  
  232.     #
  233.     #  First, get the list of pkgs installed by default
  234.     #  The first one-choice ENUM TYPE fields are used as labels for
  235.     #  the form.  The variable FOO is just a dummy so that the line
  236.     #  parses correctly.
  237.     #
  238.     MSGBUF1=`pfmt -s nostd -g ${PKGMSG}:51 "Install?" 2>&1`
  239.     MSGBUF2=`pfmt -s nostd -g ${PKGMSG}:52 "Package Name" 2>&1`
  240.     echo "//6//${MSGBUF1}//${MSGBUF2}//FOO//"
  241.     echo "//  //"
  242.     echo "//6//--------//------------------------------------------//FOO//"
  243.     echo "//  //"
  244.     i=0
  245.     PKGS_PER_SCREEN=8
  246.     last=`expr $start + $PKGS_PER_SCREEN`
  247.     exec </tmp/name_dflt_y
  248.     while read PKGABBREV PKGNAME && [ "$i" -lt "$last" ]
  249.     do
  250.         if [ "$i" -ge $start ]
  251.         then
  252.             PKGNAME=`echo $PKGNAME | cut -c1-$MAX_MENU_FIELD_LEN`
  253.             #
  254.             #  Set up the choice field for this package.
  255.             #
  256.             MSGBUF1=`pfmt -s nostd -g ${PKGMSG}:53 "Right" 2>&1`
  257.             MSGBUF2=`pfmt -s nostd -g ${PKGMSG}:54 "Left arrow keys for new choice (2 choices)" 2>&1`
  258.             YES_MSG=`pfmt -s nostd -g ${PKGMSG}:57 "Yes" 2>&1`
  259.             NO_MSG=`pfmt -s nostd -g ${PKGMSG}:58 "No" 2>&1`
  260.  
  261.             # If PKGABBREV is "c++", we cannot construct environment variable name.
  262.             # Use cplusplus instead.
  263.             if [ "$PKGABBREV" = "c++" ]; then PKGABBREV=cplusplus; fi
  264.  
  265.             echo "//2 2//YES::${YES_MSG}//NO::${NO_MSG}//${PKGNAME}://TAG_${PKGABBREV}//"
  266.             echo "//${MSGBUF1}/${MSGBUF2}//"
  267.  
  268.             #
  269.             #  We're going to set the default for this package to
  270.             #  "Yes" (install), so we echo to a file and source it
  271.             #  in after this routine is finished, so the TAG_'s don't
  272.             #  vanish with this subshell.
  273.             #
  274.             echo eval TAG_${PKGABBREV}=\"YES\" export TAG_${PKGABBREV} >> ${MENU_OUT}
  275.         fi
  276.         i=`expr $i + 1`
  277.     done
  278.  
  279.  
  280.     #
  281.     #  Now, get the list of pkgs NOT installed by default
  282.     #  The first one-choice ENUM TYPE fields are used as labels for
  283.     #  the form.  The variable FOO is just a dummy so that the line
  284.     #  parses correctly.
  285.     #
  286.     exec </tmp/name_dflt_n
  287.     while read PKGABBREV PKGNAME && [ "$i" -lt "$last" ]
  288.     do
  289.         if [ "$PKGABBREV" = "base" ]
  290.         then 
  291.             # Do not list base in menu since it cannot be reinstalled.
  292.             echo eval TAG_${PKGABBREV}=\"NO\" export TAG_${PKGABBREV} >> ${MENU_OUT}
  293.             continue
  294.         fi
  295.  
  296.         if [ "$i" -ge $start ]
  297.         then
  298.             PKGNAME=`echo $PKGNAME | cut -c1-$MAX_MENU_FIELD_LEN`
  299.             #
  300.             #  Set up the choice field for this package.
  301.             #
  302.             MSGBUF1=`pfmt -s nostd -g ${PKGMSG}:53 "Right" 2>&1`
  303.             MSGBUF2=`pfmt -s nostd -g ${PKGMSG}:54 "Left arrow keys for new choice (2 choices)" 2>&1`
  304.             YES_MSG=`pfmt -s nostd -g ${PKGMSG}:57 "Yes" 2>&1`
  305.             NO_MSG=`pfmt -s nostd -g ${PKGMSG}:58 "No" 2>&1`
  306.  
  307.             # If PKGABBREV is "c++", we cannot construct environment variable name.
  308.             # Use cplusplus instead.
  309.             if [ "$PKGABBREV" = "c++" ]; then PKGABBREV=cplusplus; fi
  310.  
  311.             echo "//2 2//YES::${YES_MSG}//NO::${NO_MSG}//${PKGNAME}://TAG_${PKGABBREV}//"
  312.             echo "//${MSGBUF1}/${MSGBUF2}//"
  313.  
  314.             #
  315.             #  We're going to set the default for this package to
  316.             #  "No" (don't install), so we echo to a file and source it
  317.             #  in after this routine is finished, so the TAG_'s don't
  318.             #  vanish with this subshell.
  319.             #  Se
  320.             #
  321.             echo eval TAG_${PKGABBREV}=\"NO\" export TAG_${PKGABBREV} >> ${MENU_OUT}
  322.         fi
  323.         i=`expr $i + 1`
  324.     done
  325.     exec <&3
  326.     exec 3<&-
  327.     echo start=$i >> ${MENU_OUT}
  328.  
  329. }
  330.  
  331. #
  332. #  This routine creates the business end of the second menu, where the
  333. #  user selects Automatic or Custom installation for any package that
  334. #  has both a request script and a response file.
  335. #
  336. mk_pkgs_menu2()
  337. {
  338.     #
  339.     #  Create the form section of the first set menu.
  340.     #
  341.     echo ".form"
  342.  
  343.     #
  344.     #  First, get the list of pkgs installed by default
  345.     #  The first one-choice ENUM TYPE fields are used as labels for
  346.     #  the form.  The variable FOO is just a dummy so that the line
  347.     #  parses correctly.
  348.     #
  349.     MSGBUF1=`pfmt -s nostd -g ${PKGMSG}:55 "Options" 2>&1`
  350.     MSGBUF2=`pfmt -s nostd -g ${PKGMSG}:56 "Package Name" 2>&1`
  351.     echo "//6//${MSGBUF1}//${MSGBUF2}//FOO//"
  352.     echo "//  //"
  353.     echo "//6//--------//----------------------------------------//FOO//"
  354.     echo "//  //"
  355.     while read PKGABBREV PKGNAME
  356.     do
  357.  
  358.         #
  359.         #  If there are both a request and response file for this
  360.         #  pkg, give option of Auto or Custom install.
  361.         #
  362.         if [ -f ${REQDIR}/${PKGABBREV}/response -a -f ${REQDIR}/${PKGABBREV}/request ]
  363.         then
  364.             #####    Begin UPNOVER    ######
  365.             # chk_upnover returns 0 to skip AUTO/CUSTOM question
  366.  
  367.             chk_upnover ${REQDIR}/${PKGABBREV}/response $PKGABBREV
  368.             [ $? = 0 ] && continue
  369.  
  370.             #####    End UPNOVER    ######
  371.  
  372.             PKGNAME=`echo $PKGNAME | cut -c1-$MAX_MENU_FIELD_LEN`
  373.             #
  374.             #  Create the form field for this package.
  375.             #
  376.             MSGBUF1=`pfmt -s nostd -g ${PKGMSG}:53 "Right" 2>&1`
  377.             MSGBUF2=`pfmt -s nostd -g ${PKGMSG}:54 "Left arrow keys for new choice (2 choices)" 2>&1`
  378.             AUTO=`pfmt -s nostd -g ${PKGMSG}:59 "Automatic" 2>&1`
  379.             CUST=`pfmt -s nostd -g ${PKGMSG}:60 "Custom" 2>&1`
  380.  
  381.             # If PKGABBREV is "c++", we cannot construct environment variable name.
  382.             # Use cplusplus instead.
  383.             if [ "$PKGABBREV" = "c++" ]; then PKGABBREV=cplusplus; fi
  384.  
  385.             echo "//2 2//AUTO::${AUTO}//CUST::${CUST}//${PKGNAME}://TAG_${PKGABBREV}//"
  386.             echo "//${MSGBUF1}/${MSGBUF2}//"
  387.  
  388.             #
  389.             #  We're going to set the default for this package to
  390.             #  "Automatic", so we echo to a file and source it
  391.             #  in after this routine is finished, so the TAG_'s
  392.             #  don't vanish with this subshell.
  393.             #
  394.             echo eval TAG_${PKGABBREV}=\"AUTO\" export TAG_${PKGABBREV} >> ${MENU_OUT}
  395.         fi
  396.     done < /tmp/name_final_y
  397.  
  398. }
  399.  
  400. #
  401. #  This is where we actually run request scripts for each package,
  402. #  unless the user selected AUTO for this pkgs installation or
  403. #  there is no response file.
  404. #
  405. process_default_install () {
  406.  
  407.     [ "$UPDEBUG" = YES ] && set -x
  408.     #
  409.     #  If there's a request script...
  410.     #
  411.     if [ -f $REQDIR/${1}/request ]
  412.     then
  413.  
  414.         # If argument is "c++", environment variable is TAG_cplusplus.
  415.         if [ "$1" = "c++" ] 
  416.         then RANS=`eval echo $"TAG_cplusplus"`
  417.         else RANS=`eval echo $"TAG_${1}"`
  418.         fi
  419.  
  420.         #
  421.         #  ...and the user selected AUTOMATIC install, then...
  422.         #
  423.         if [ "$RANS" = "AUTO" ]
  424.         then
  425.  
  426.             #
  427.             #  ...if there's a response file, use that.
  428.             #
  429.             if [ -f $REQDIR/${1}/response ]
  430.             then
  431.                 cp $REQDIR/${1}/response $RESPDIR/${1} 
  432.  
  433.                 # delete OAMadmin from CLASSES in $RESPDIR/$1
  434.                 # if non-SVR4.2 OAM is installed
  435.  
  436.                 check_oam_version $RESPDIR/${1}
  437.  
  438.                 check_oam_rc=$?
  439.  
  440.                 [ "$UPDEBUG" = YES ] && {
  441.                     echo check_oam_rc=$check_oam_rc >/dev/console
  442.                     goany
  443.                 }
  444.             #
  445.             #  Otherwise, run the request script.
  446.             #
  447.             else
  448.                 # This section takes care of using the set member package's
  449.                    # pkginfo file to set up its own environment.  So that these
  450.                    # values are not used to overwrite the SIPs, we do this in
  451.                    # a subshell.
  452.                    (
  453.                    # Mark vars yet to be set to be automatically exported
  454.                    set -a
  455.                    pkgparam -v -f $REQDIR/${1}/pkginfo >/tmp/params.$$
  456.                    . /tmp/params.$$
  457.                    PKGINST=$PKG  # Reset PKGINST to set member PKG inst
  458.                    sh $REQDIR/${1}/request $RESPDIR/${1} </dev/tty >/dev/tty 2>/dev/tty
  459.  
  460.                 [ $? != 0 ] && {
  461.                     echo 1>/tmp/req.rc
  462.                     return 1
  463.                 }
  464.  
  465.                    )
  466.                    rm -f /tmp/params.$$
  467.                fi
  468.  
  469.         #
  470.         #  If the user selected CUSTOM, run the request script.
  471.         #
  472.         else
  473.             # This section takes care of using the set member package's
  474.                # pkginfo file to set up its own environment.  So that these
  475.                # values are not used to overwrite the SIPs, we do this in
  476.                # a subshell.
  477.                (
  478.                # Mark vars yet to be set to be automatically exported
  479.                set -a
  480.                pkgparam -v -f $REQDIR/${1}/pkginfo >/tmp/params.$$
  481.                . /tmp/params.$$
  482.                PKGINST=$PKG  # Reset PKGINST to set member PKG inst
  483.                sh $REQDIR/${1}/request $RESPDIR/${1} </dev/tty >/dev/tty 2>/dev/tty
  484.             [ $? != 0 ] && {
  485.                 echo 1 >/tmp/req.rc
  486.                 return 1
  487.             }
  488.                )
  489.                rm -f /tmp/params.$$
  490.         fi
  491.     #
  492.     #  If there's no request script and just a response file, use that.
  493.     #
  494.     else
  495.         if [ -f $REQDIR/${1}/response ]
  496.         then
  497.             cp $REQDIR/${1}/response $RESPDIR/${1} 
  498.         fi
  499.     fi
  500.  
  501.     #
  502.     # create an empty response file if one doesn't exist
  503.     # ul97-20008.
  504.     #
  505.     [ ! -f ${RESPDIR}/${1} ] && > ${RESPDIR}/${1}
  506.  
  507.     retcode=0
  508.     [ -f /tmp/req.rc ] && {
  509.         read retcode </tmp/req.rc
  510.         rm -f /tmp/req.rc
  511.     }
  512.     [ "$UPDEBUG" = YES ] && goany "retcode for process_default=$retcode"
  513.     return $retcode
  514.  
  515. }
  516.  
  517. #
  518. #  Read in initial information about the set.  Creates files for later
  519. #  use.
  520. #
  521. read_setinfo() {
  522.     # ALL_OFF is set to true if any packages from this
  523.     # set are already installed. If any packages are
  524.     # installed, then the default selections in the set's 
  525.     # package selection menu will be "all off".
  526.  
  527.     ALL_OFF=false
  528.     > /tmp/name_dflt_y
  529.     > /tmp/name_dflt_n
  530.     if [ -d /var/sadm/pkg/$SETINST ]
  531.     then
  532.         # A package was installed previously by installing
  533.         # this set?
  534.         ALL_OFF=true
  535.     else
  536.         # Check if at least one package from this set was 
  537.         # previously installed. In this case, the package 
  538.         # would have been installed directly, not via the set.
  539.  
  540.         ls /var/sadm/pkg >/tmp/avail_pkgs
  541.         cut -f1 $SETINFO|sed -e '/^[     ]*$/d' -e '/^#/d' >>/tmp/avail_pkgs
  542.         sort /tmp/avail_pkgs|uniq -d - /tmp/non_uniq_pkgs
  543.         [ -s /tmp/non_uniq_pkgs ] && ALL_OFF=true
  544.     fi 
  545.     while read pkginst parts default category package_name
  546.     do
  547.         [ "$ALL_OFF" = "true" ] && default="no"
  548.           case ${pkginst} in
  549.         '#'*) continue ;;
  550.         [a-zA-Z+]*)         
  551.             if [ "${default}" = "y" -o "${default}" = "yes" ]
  552.             then    echo $pkginst >>/tmp/dflt_y$$ 
  553.                 echo "${TAB}${pkginst}${TAB}${package_name}              " >>/tmp/name_dflt_y
  554.             else    echo $pkginst >>/tmp/dflt_n$$
  555.                 echo "${TAB}${pkginst}${TAB}${package_name}              " >>/tmp/name_dflt_n
  556.             fi
  557.             ;;
  558.         *)    continue ;;
  559.         esac 
  560.     done <$SETINFO
  561. }
  562.  
  563. #
  564. #  This recursive routine does dependency checking.  It doesn't let any
  565. #  dependency go unchecked, and if a dependency was already checked, it
  566. #  won't check it again (avoids multiple prompts for same packages).
  567. do_dependencies() {
  568.     PKG=$1
  569.  
  570.     #
  571.     #  If we've already succeeded, don't bother checking again
  572.     #
  573.     grep $PKG $DEP_SUCC > /dev/null 2>&1
  574.     if [ $? = 0 ]
  575.     then
  576.         return 0
  577.     fi
  578.  
  579.     #
  580.     #  If we've already failed, don't bother checking again
  581.     #
  582.     grep $PKG $DEP_FAIL > /dev/null 2>&1
  583.     if [ $? = 0 ]
  584.     then
  585.         return 1
  586.     fi
  587.  
  588.  
  589.     #
  590.     #  first make the list of dependencies
  591.     #  If there are none, return success.
  592.     #
  593.  
  594.     if [ ! -f ${REQDIR}/${PKG}/depend ]
  595.     then
  596.         return 0
  597.     fi
  598.     rm -rf /tmp/dependlist$$ 
  599.  
  600.     while read prerequisite abbreviation full_name
  601.     do
  602.         case ${prerequisite} in
  603.         '#'*) continue ;;
  604.         P) 
  605.             echo ${abbreviation} >> /tmp/dependlist$$
  606.             ;;
  607.         *)   continue;;
  608.         esac
  609.     done <${REQDIR}/${PKG}/depend
  610.  
  611.     #
  612.     #  For every dependency there is,
  613.     #
  614.     if [ ! -f /tmp/dependlist$$ ]
  615.     then
  616.         #  If only I's in depend file, then there will be no dependList
  617.         #  file, and that's okay:
  618.         return 0
  619.     else
  620.         LIST=`cat /tmp/dependlist$$`
  621.         for  DEPENDENCY  in ${LIST}
  622.         do
  623.             pkginfo -i ${DEPENDENCY} > /dev/null 2>&1
  624.             if [ $? -eq 0 ] 
  625.             then
  626.                 continue
  627.             fi
  628.             #
  629.             #  Check if we're installing it in this pkglist.
  630.             #
  631.             grep "^${DEPENDENCY}${TAB}" /tmp/name_selected_y > /dev/null 2>&1
  632.             INSTALLING=$?
  633.  
  634.             #
  635.             #  And check if it's in this set.
  636.             #
  637.             grep "\<${DEPENDENCY}\>" /tmp/name_dflt_y > /dev/null 2>&1
  638.             INSET=$?
  639.  
  640.             #
  641.             #  We haven't yet selected it, and it is in the set.
  642.             #  Give the option to install.
  643.             #
  644.             if [ $INSTALLING != 0 -a $INSET = 0 ]
  645.             then
  646.                 INST_DEP="YES"
  647.                 export PKG DEPENDENCY INST_DEP
  648.                 menu_colors warn
  649.                 menu -f ${MENU_DIR}/set.4 -o ${MENU_OUT} < /dev/tty >/dev/tty
  650.                 . ${MENU_OUT}
  651.  
  652.                 #
  653.                 #  If we chose to install a package we hadn't
  654.                 #  yet selected, we had better check IT'S 
  655.                 #  dependencies so we know if we can install 
  656.                 #  any of this.
  657.                 #
  658.                 if [ "${INST_DEP}" = "YES" ]
  659.                 then
  660.                     ( do_dependencies $DEPENDENCY )
  661.                     if [ $? = 0 ]
  662.                     then
  663.                         echo $DEPENDENCY >> ${PKGS_FILE}
  664.                         echo $DEPENDENCY$TAB$DEPENDENCY >> /tmp/name_selected_y
  665.                         echo $DEPENDENCY >> $DEP_SUCC
  666.                         continue 
  667.                     else
  668.                         echo $DEPENDENCY >> $DEP_FAIL
  669.                         return 1
  670.                     fi
  671.                 else
  672.                     echo $DEPENDENCY >> $DEP_FAIL
  673.                     return 1
  674.                 fi
  675.             else
  676.                 #
  677.                 #  It is not in this set.  If it is not 
  678.                 #  installed already, give the option.
  679.                 #
  680.                 if [ $INSET = 1 ]
  681.                 then
  682.                     #
  683.                     #  Check if it's installed already.
  684.                     #
  685.                     pkginfo -i ${DEPENDENCY} > /dev/null 2>&1
  686.                     if [ $? -ne 0 ] 
  687.                     then
  688.                         #
  689.                         #  If not, warn user.  Otherwise
  690.                         #  go on.
  691.                         #
  692.                         export PKG DEPENDENCY
  693.                         menu_colors warn
  694.                         menu -f ${MENU_DIR}/set.5 -o ${MENU_OUT} < /dev/tty >/dev/tty
  695.                         echo $DEPENDENCY >> $DEP_FAIL
  696.                         return 1;
  697.                     else
  698.                         echo $DEPENDENCY >> $DEP_SUCC
  699.                         continue ;
  700.                     fi
  701.                 fi
  702.             fi
  703.         done
  704.     fi
  705.  
  706.     #
  707.     #  The dependency was not a problem for the package we wanted to
  708.     #  install, so before we let ourselves out of here, we make sure
  709.     #  that this dependency is really installable, else we can;t install
  710.     #  the package we came here to check dependencies for.
  711.     #
  712.     return 0
  713. }
  714.  
  715. # MAIN starts here
  716.  
  717. #
  718. #  Zero out files we're going to use in this script.
  719. #
  720. > ${PKGS_FILE}
  721. > ${DEP_SUCC}
  722. > ${DEP_FAIL}
  723. > ${PKGS_FILE}
  724.  
  725. ############## Begin UPGRADE/OVERLAY Support ####################
  726.  
  727. #
  728. #  If the user is upgrading and this is the ADMIN set, then if they
  729. #  have the V4 OA&M package installed, we have to tell them to remove
  730. #  it, and then exit.
  731. #  
  732.  
  733. [ "${PKGINST}" = "admin" ] && {
  734.  
  735.     SCRIPTS=/usr/sbin/pkginst
  736.     ${SCRIPTS}/chkpkgrel oam
  737.     PKGVERSION=$?
  738.     [ $PKGVERSION != 2 -a $PKGVERSION != 0 ] && {
  739.  
  740.         #
  741.         #  Send the menus out to the correct directory
  742.         #
  743.         [ -d ${MENU_DIR} ] || mkdir -p ${MENU_DIR}
  744.         if [ ! -f ${MENU_DIR}/menu.remove ]
  745.         then
  746.            if [ -f ${REQDIR}/inst/locale/${LOCALE}/${PKG}/menu.remove ]
  747.            then
  748.                 cp ${REQDIR}/inst/locale/${LOCALE}/${PKG}/menu.remove ${MENU_DIR}
  749.            else
  750.                 cp ${REQDIR}/menu.remove ${MENU_DIR}
  751.            fi
  752.         fi
  753.  
  754.         menu -f ${MENU_DIR}/menu.remove -o /dev/null >/dev/tty 2>/dev/null < /dev/tty
  755.         exit 3
  756.     }
  757. }
  758.  
  759. #
  760. # We need to enforce the assumption that if they currently have nsu
  761. # and/or acp installed on their Version 4 box, they MUST upgrade them.
  762. #
  763. # If the Version 4 nsu and/or acp packages are installed and they
  764. # don't chose them.  We'll warn them and then install them anyhow.
  765. #
  766. # The file /tmp/upgrade.sh will only exist if we're installing via
  767. # the boot floppies.
  768. #
  769.  
  770. [ -f /tmp/upgrade.sh ] && . /tmp/upgrade.sh
  771.  
  772. [ "$PKGINSTALL_TYPE" = "UPGRADE" ] && {
  773.  
  774.     NSUNAME="Network Support Utilities"
  775.     ACPNAME="Enhanced Application Compatibility"
  776.  
  777.     $SCRIPTSDIR/chkpkgrel nsu
  778.     [ "$?" = "4" ] && NSU=Y
  779.  
  780.     $SCRIPTSDIR/chkpkgrel acp
  781.     [ "$?" = "4" ] && ACP=Y
  782.  
  783.     [ "$UPDEBUG" = "YES" ] && goany
  784.  
  785.     export NSU ACP NSUNAME ACPNAME
  786. }
  787.  
  788. read_setinfo
  789.  
  790. DFLT_Y=`cat /tmp/dflt_y$$ 2>/dev/null`
  791. DFLT_N=`cat /tmp/dflt_n$$ 2>/dev/null`
  792. ALL_PKGS="${DFLT_Y} ${DFLT_N}"
  793.  
  794. cp ${MENU_DIR}/set.1 ${MENU_FILE}
  795.  
  796. #
  797. #  $MENU_OUT is going to get a list of eval stmts in mk_pkgs_menu1
  798. #  about how to set defaults and will then be sourced back into this shell
  799. #  (There's a comment up in mk_pkgs_menu1 about this...)
  800. #
  801. start=0
  802. while :
  803. do
  804.     ostart=$start
  805.     > ${MENU_OUT}
  806.     mk_pkgs_menu1 >> ${MENU_FILE}
  807.     . ${MENU_OUT}
  808.  
  809.     #
  810.     # No more packages left
  811.     #
  812.     if [ "$ostart" = "$start" ]
  813.     then
  814.         break
  815.     fi
  816.     #
  817.     #  We actually run the first menu, where the user chooses what packages
  818.     #  to install, then source the answers back in.
  819.     #
  820.     menu_colors regular
  821.     menu -f ${MENU_FILE} -o ${MENU_OUT} 2> /dev/null </dev/tty >/dev/tty
  822.     . ${MENU_OUT}
  823. done
  824.  
  825. #
  826. #  Get all the package names into /tmp/name_dflt_y, and zero out
  827. #  the file of selected packages.
  828. #
  829. cat /tmp/name_dflt_n >> /tmp/name_dflt_y
  830. > /tmp/name_selected_y
  831. > /tmp/name_final_y
  832.  
  833. #
  834. #  For every package that was selected for installation, place
  835. #  the pkg abbreviation and the name into the selected file.
  836. #
  837. while read PKGABBREV PKGNAME
  838. do
  839.     # For "c++", the environment variable name is TAG_cplusplus.
  840.     if [ "$PKGABBREV" = "c++" ]
  841.     then eval [ $"TAG_cplusplus" = "YES" ]
  842.     else eval [ $"TAG_${PKGABBREV}" = "YES" ]
  843.     fi
  844.     if [ $? = 0 ]
  845.     then
  846.         echo "${PKGABBREV}    ${PKGNAME}" >> /tmp/name_selected_y
  847.     fi
  848. done < /tmp/name_dflt_y
  849.  
  850. #
  851. # If the user is upgrading and they have either nsu and/or acp installed
  852. # on there system AND they failed to select these packages to be upgrades,
  853. # we're going to warn them and add them to the list of packages to
  854. # upgrade anyhow.
  855. #
  856.  
  857. [ "$PKGINSTALL_TYPE" = "UPGRADE" ] && {
  858.  
  859.     TAB='    '
  860.     SPACE=' '
  861.     unset WARNEM
  862.     grep "^nsu[${TAB}${SPACE}]*" /tmp/name_selected_y >/dev/null 2>&1
  863.     rc=$?
  864.  
  865.     [ $rc != 0 -a "$NSU" = "Y" ] && {
  866.  
  867.         echo "nsu    ${NSUNAME}" >> /tmp/name_selected_y
  868.         WARNEM=Y
  869.     }
  870.  
  871.     [ $rc = 0 ] && NSU=N        # Eliminate it from warning message
  872.  
  873.     grep "^acp[${TAB}${SPACE}]*" /tmp/name_selected_y >/dev/null 2>&1
  874.     rc=$?
  875.  
  876.     [ $rc != 0 -a "$ACP" = "Y" ] && {
  877.  
  878.         echo "acp    ${ACPNAME}" >> /tmp/name_selected_y
  879.         WARNEM=Y
  880.     }
  881.  
  882.     [ $rc = 0 ] && ACP=N        # Eliminate it from warning message
  883.  
  884.     [ "$WARNEM" ] && menu -f ${MENU_DIR}/set.7 -o ${MENU_OUT} < /dev/tty >/dev/tty
  885. }
  886.  
  887. #
  888. #  If no package was selected, then let the user know and exit.
  889. #
  890. if [ ! -s /tmp/name_selected_y ]
  891. then
  892.     menu_colors regular
  893.     menu -f ${MENU_DIR}/set.3 -o ${MENU_OUT} 2>/dev/null < /dev/tty > /dev/tty
  894.     EXITCODE=77; export EXITCODE
  895.     exit 77
  896. fi
  897.  
  898.  
  899. #
  900. #  For each package selected, check dependencies until there are none left
  901. #
  902. while read PKGABBREV PKGNAME
  903. do
  904.     do_dependencies $PKGABBREV
  905.     if [ $? = 0 ] 
  906.     then
  907.         echo $PKGABBREV >> ${PKGS_FILE}
  908.         echo $PKGABBREV $PKGNAME >> /tmp/name_final_y
  909.     fi
  910. done < /tmp/name_selected_y
  911.  
  912. #
  913. #  Reorder PKGLIST so that it accurately reflects the order of the
  914. #  packages as listed in the setinfo file. Create two versions:
  915. #  one where entries are separated by new-lines (this will be used
  916. #  internally to this script and is called PKGLIST), and one
  917. #  where entries are separated by spaces called NPKG_LIST.
  918. #  PKGLIST will ultimately be set to NPKG_LIST for preinstall and
  919. #  postinstall scripts since they "." the response file, and hence
  920. #  a PKGLIST in the format below will not be viable:
  921. #  PKGLIST=pkg1
  922. #  pkg2
  923. #  pkg3
  924. #
  925. #  Rather, PKGLIST should be set PKGLIST=pkg1 pkg2 pkg3.
  926. #  This code should be cleaned up for the next load and
  927. #  was implemented this way to reduce the amt of change.
  928.  
  929.  
  930. PKGLIST=`cat ${PKGS_FILE}`
  931. export PKGLIST
  932. > ${PKGS_FILE}
  933. NPKG_FILE=/tmp/npkglist.$$
  934. > ${NPKG_FILE}
  935.  
  936. NPKG_SEP=""    # 1st entry in NPKGFILE should not have space 
  937.         # in front of it.
  938. NPKG_SPACE=" "
  939.  
  940. > /tmp/name_final_y
  941.  
  942. while read pkginst parts default category package_name
  943. do
  944.     case ${pkginst} in
  945.     '#'*) continue ;;
  946.     [a-zA-Z+]*)         
  947.         echo ${PKGLIST} | grep "\<${pkginst}\>" > /dev/null 2>&1
  948.         if [ $? -eq 0 ]
  949.         then
  950.             echo "${pkginst}${TAB}${package_name}" >> /tmp/name_final_y
  951.             echo "${pkginst}" >> ${PKGS_FILE}
  952.             echo -n "${NPKG_SEP}${pkginst}" >> ${NPKG_FILE}
  953.             # after 1st time through, make sure NPKG_SEP is " "
  954.             NPKG_SEP="${NPKG_SPACE}"
  955.         fi
  956.         ;;
  957.     *)    continue ;;
  958.     esac 
  959. done < ${SETINFO}
  960.  
  961. #
  962. #  $MENU_OUT is going to get a list of eval stmts in mk_pkgs_menu2
  963. #  about how to set defaults and will then be sourced back into this shell
  964. #  (There's a comment up in mk_pkgs_menu1 about this...)
  965. #
  966. cp ${MENU_DIR}/set.2 ${MENU_FILE}
  967. mk_pkgs_menu2 >> ${MENU_FILE}
  968. . ${MENU_OUT}
  969.  
  970.  
  971. # Delete pkgs that are listed in the file $PKG_RM from the list
  972. # of the selected packages in the file $PKGS_FILE. Newer version of the packages
  973. # listed in $PKG_RM is already installed. The user must pkgrm these packages.
  974.  
  975. [ -f "$PKG_RM" ] && {
  976.     TMP_PKGS_FILE=/tmp/pkg.$$
  977.     while read P
  978.     do
  979.         grep $P $PKG_RM >/dev/null 2>&1
  980.         [ $? -eq 0 ] || {
  981.             echo $P >>$TMP_PKGS_FILE #temp file with selected pkgs
  982.         } 
  983.     done <$PKGS_FILE
  984.     [ -f $TMP_PKGS_FILE ] && cp $TMP_PKGS_FILE $PKGS_FILE
  985.  
  986.     # Warn the user that some or all packages have newer versions already
  987.     # installed. These pkgs must be pkgrm'ed to install older version.
  988.  
  989.     [ -f $TMP_PKGS_FILE ] || {
  990.         ALL_NEW=YES        # ALL_NEW is set when all pkgs selected
  991.         export ALL_NEW        # have older versions installed.
  992.     }
  993.     export PKG_RM
  994.     menu_colors warn
  995.     menu -f ${MENU_DIR}/set.8 -o /dev/null 2>/dev/null </dev/tty >/dev/tty
  996.     
  997.     # If ALL_NEW is set, there is nothing to install. Exit with code 77
  998.  
  999.     [ "$ALL_NEW" ] && {
  1000.         EXITCODE=77; export EXITCODE
  1001.         rm -f $PKG_RM $TMP_PKGS_FILE
  1002.         exit 77
  1003.     }
  1004.  
  1005.     rm -f $PKG_RM $TMP_PKGS_FILE
  1006. }
  1007.  
  1008. #
  1009. #  Check to see if we actually created a menu for selecting Custom vs
  1010. #  Automatic installation.  There may be no response files in this
  1011. #  whole set, thus no possibility for Auto install.
  1012. #  If we did create a menu, execute it.
  1013. #
  1014. grep TAG_ ${MENU_FILE} > /dev/null 2>&1
  1015. if [ $? = 0 ]
  1016. then
  1017.     menu_colors regular
  1018.     menu -f ${MENU_FILE} -o ${MENU_OUT} 2> /dev/null </dev/tty >/dev/tty
  1019.     . ${MENU_OUT}
  1020. fi
  1021.  
  1022. PKGLIST=`cat ${PKGS_FILE}`
  1023. export PKGLIST
  1024.  
  1025.  
  1026. ############################################
  1027. # Display copyright messages for the selected packages 
  1028. # up front and all at once. Also, eliminate duplicate copyrights 
  1029. # being displayed. 
  1030. # Advanced tools like (n)awk cannot be used as they
  1031. # will not be available yet for installing the foundation set.
  1032. # We like to keep set/request scripts identical for all sets. 
  1033.  
  1034. if [ -f ${REQDIR}/copyright ] 
  1035. then
  1036.     cp ${REQDIR}/copyright /tmp/setcopyright
  1037. else
  1038.     > /tmp/setcopyright
  1039. fi
  1040. for i in ${PKGLIST}
  1041. do 
  1042.     while read LINE 
  1043.     do
  1044.         case ${LINE} in
  1045.         '#'*) continue ;;
  1046.         [a-zA-Z]*) 
  1047.             grep "${LINE}" /tmp/setcopyright > /dev/null 2>&1
  1048.             if [ ${?} -ne 0 ]
  1049.             then 
  1050.                 echo ${LINE} >> /tmp/setcopyright 2> /dev/null
  1051.             fi
  1052.             ;;
  1053.         *) continue ;;
  1054.         esac
  1055.     done < ${REQDIR}/${i}/copyright
  1056. done
  1057. ############################################
  1058. #
  1059. #  If no package was selected, then let the user know and exit.
  1060. #
  1061. if [ -z "${PKGLIST}" ]
  1062. then
  1063.     menu_colors regular
  1064.     menu -f ${MENU_DIR}/set.3 -o ${MENU_OUT} 2>/dev/null </dev/tty >/dev/tty
  1065.     EXITCODE=77; export EXITCODE
  1066.     exit 77
  1067. fi
  1068.  
  1069. #
  1070. #  Now that we have a complete list of packages to install, and all
  1071. #  the dependencies have been weeded out, go ahead and do the request
  1072. #  scripts if appropriate.
  1073. #
  1074. [ "$UPDEBUG" = YES ] && set -x
  1075. for PKG in ${PKGLIST}
  1076. do
  1077.     # If !I-Lock! exists for a pkg, it is partially installed.
  1078.     # Create a lock file  in /tmp to indicate this fact.
  1079.     # chkpkgrel, an upnover tool, will return the code for
  1080.     # newinstall, if the lock file /tmp is detected.
  1081.     # The lock file in /tmp is needed, because in automatic
  1082.     # install mode, by the time chkpkgrel looks for the lock
  1083.     # file in /var/sadm/pkg/$PKG, pkgadd has already dropped
  1084.     # one for the current installation.
  1085.     # chkpkgrel will clean the lock file in /tmp. 
  1086.     # Oherwise, for pkgs for which chkpkgrel is not run, this
  1087.     # file will be blown away when the system is rebooted.
  1088.  
  1089.     [ -f /var/sadm/pkg/$PKG/!I-Lock! ] && >/tmp/$PKG.Lock
  1090.  
  1091.     # Remove the file /var/sadm/upgrade/$PKG.env, which is around
  1092.     # if the user del'ed out before a pkg installation completed. 
  1093.     # This file should not exist when pkg. installation begins.
  1094.  
  1095.     rm -f /var/sadm/upgrade/$PKG.env
  1096.  
  1097.     process_default_install ${PKG}
  1098.  
  1099.     ## if rtn code is non-zero, remove that pkg from PKGLIST
  1100.      ## we do this by creating another pkglist.
  1101.     ## (if sed is available this would be simpr)
  1102.  
  1103.     [ "$?" = "0" ] && {
  1104.  
  1105.         NEWPKGLIST="${NEWPKGLIST}${PKG} "
  1106.  
  1107.     }
  1108. done
  1109. [ "$UPDEBUG" = YES ] && goany
  1110. [ "$NEWPKGLIST" ] || {
  1111.     exit 77
  1112. }
  1113. PKGLIST=${NEWPKGLIST}
  1114. echo $PKGLIST >$NPKG_FILE
  1115. unset NEWPKGLIST
  1116.  
  1117. # update /tmp/name_final_y to match updated PKGLIST. Grep for 
  1118. # "^${PKG}[<space><TAB>]" in /tmp/name_final_y  to remove any pkg from
  1119. # /tmp/name_final_y for which request script returned a non-zero code. 
  1120.  
  1121. rm -f /tmp/$$.y
  1122. for PKG in ${PKGLIST}
  1123. do
  1124.     grep "^${PKG}[     ]" /tmp/name_final_y >>/tmp/$$.y
  1125. done
  1126. mv /tmp/$$.y /tmp/name_final_y
  1127.  
  1128. #
  1129. #  Make sure correctly ordered PKGLIST is exported to the environment,
  1130. #  the shell statment to assign the PKGLIST is written to the response
  1131. #  file, and setsizecvt is run, which creates a file of the format of
  1132. #  a pkg's space(4) file, so the packaging tools can take care of 
  1133. #  space checking for us.
  1134. #
  1135. #  Exit cleanly when we're done.
  1136. #
  1137. NPKG_LIST=`cat ${NPKG_FILE}`
  1138. export PKGLIST NPKG_LIST
  1139. echo "PKGLIST=${NPKG_LIST}" >> $1 
  1140. [ ! -f /etc/inst/scripts/sgauge.sh ] || . /etc/inst/scripts/sgauge.sh
  1141. /usr/sadm/install/bin/setsizecvt
  1142. exit 0
  1143.