home *** CD-ROM | disk | FTP | other *** search
/ BUG 1 / BUGCD1996_0708.ISO / pc / util / minilin / minilin.exe / SBIN / PKGTOOL.TTY < prev    next >
Text File  |  1994-05-19  |  22KB  |  683 lines

  1. #!/bin/sh
  2. #
  3. # Copyright 1993, 1994 Patrick Volkerding, Moorhead, Minnesota USA
  4. # All rights reserved.
  5. #
  6. # Redistribution and use of this script, with or without modification, is 
  7. # permitted provided that the following conditions are met:
  8. #
  9. # 1. Redistributions of this script must retain the above copyright
  10. #    notice, this list of conditions and the following disclaimer.
  11. #
  12. #  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  13. #  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  14. #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
  15. #  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  16. #  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  17. #  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  18. #  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  19. #  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  20. #  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  21. #  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  22. #
  23.  
  24. # Wed, 27 Apr 1994 00:06:50 -0700 (PDT)
  25. # Optimization by David Hinds.
  26.  
  27. CUSTOM=""
  28. if [ -r /tmp/custom ]; then
  29.  CUSTOM="`cat /tmp/custom`"
  30. fi
  31. SOURCE_DIR=/var/adm/mount
  32. umask 000
  33. ASK="tagfiles"
  34. if [ ! -d /usr/sbin ]; then # we must be on the bootdisk
  35.  TARGET_DIR=/mnt
  36.  TMP=/mnt/tmp
  37.  if mount | fgrep "on /mnt" 1> /dev/null 2> /dev/null ; then # good
  38.   echo > /dev/null
  39.  else # bad
  40.   echo
  41.   echo
  42.   echo "You can't run pkgtool from the rootdisk until you've mounted your Linux"
  43.   echo "partitions beneath /mnt. Here are some examples of this:"
  44.   echo
  45.   echo "If your root partition is /dev/hda1, and is using ext2fs, you would type:"
  46.   echo "mount /dev/hda1 /mnt -t ext2"
  47.   echo
  48.   echo "Then, supposing your /usr partition is /dev/hda2, you must do this:"
  49.   echo "mount /dev/hda2 /mnt/usr -t ext2"
  50.   echo
  51.   echo "Please mount your Linux partitions and then run pkgtool again."
  52.   echo
  53.   exit
  54.  fi
  55.  if [ ! -d $TMP ]; then
  56.   mkdir -p $TMP
  57.   chmod 1777 $TMP
  58.  fi
  59. else
  60.  TARGET_DIR=/
  61.  TMP=/tmp
  62. fi
  63. ADM_DIR=$TARGET_DIR/var/adm
  64.  
  65. keep_files() {
  66.  while read FILE ; do
  67.   if [ -f "$TARGET_DIR/$FILE" ]; then
  68.     echo "  --> $FILE was found in another package. Skipping."
  69.   fi
  70.  done
  71. }
  72.  
  73. keep_links() {
  74.  while read LINK ; do
  75.   echo "Duplicate link. Not executing: $LINK"
  76.  done
  77. }
  78.  
  79. delete_files() {
  80.  while read FILE ; do
  81.   if [ -f "$TARGET_DIR/$FILE" ]; then
  82.     echo "  --> Deleting $FILE"
  83.     rm -f $TARGET_DIR/$FILE
  84.   fi
  85.  done
  86. }
  87.  
  88. delete_links() {
  89.  while read LINK ; do
  90.   echo "Unique link. Executing: $LINK"
  91.  done
  92. }
  93.  
  94. # Conversion to 'comm' utility by Mark Wisdom.
  95. # is pretty nifty! :^)
  96. remove_packages() {
  97.  for package_name in $1 
  98.  do
  99.   echo
  100.   if [ -r $ADM_DIR/packages/$package_name ]; then
  101.    echo "Removing package $package_name..."
  102.    echo
  103.    if fgrep "./" $ADM_DIR/packages/$package_name 1> /dev/null 2>&1; then
  104.     TRIGGER=".\/"
  105.    else
  106.     TRIGGER="FILE LIST:"
  107.    fi
  108.    echo "Removing files:"
  109.    sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$package_name | sort -u > $TMP/delete_list
  110.    # Pat's new-new && improved pre-removal routine.
  111.    for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do
  112.     if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  113.    done
  114.    mv $ADM_DIR/packages/$package_name $ADM_DIR/removed_packages 1> /dev/null 2>&1
  115.    if [ -r $ADM_DIR/scripts/$package_name ]; then
  116.     cat $ADM_DIR/scripts/$package_name | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
  117.     mv $ADM_DIR/scripts/$package_name $ADM_DIR/removed_scripts 1> /dev/null 2>&1
  118.     cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links
  119.     comm -12 $TMP/del_link_list $TMP/required_links | keep_links
  120.     comm -23 $TMP/del_link_list $TMP/required_links | delete_links
  121.     comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
  122.     ( cd $TARGET_DIR ; sh $TMP/delscript )
  123.     rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
  124.    fi
  125.    cat $ADM_DIR/packages/* | sort -u > $TMP/required_files
  126.    comm -12 $TMP/delete_list $TMP/required_files | keep_files
  127.    comm -23 $TMP/delete_list $TMP/required_files | delete_files
  128.    rm -f $TMP/delete_list $TMP/required_files
  129.   else
  130.    echo "No such package: $package_name. Can't remove."
  131.   fi
  132.  done
  133. }
  134.  
  135. # Here, we read the list of arguments passed to the pkgtool script.
  136. if [ $# -gt 0 ]; then # there are arguments to the command
  137.  while [ $# -gt 0 ]; do
  138.   case "$1" in
  139.   "-sets")
  140.    DISK_SETS=`echo $2 | tr "[A-Z]" "[a-z]"` ; shift 2 ;;
  141.   "-source_mounted")
  142.    SOURCE_MOUNTED="always" ; shift 1 ;;
  143.   "-ignore_tagfiles")
  144.    ASK="never" ; shift 1 ;;
  145.   "-source_dir")
  146.    SOURCE_DIR=$2 ; shift 2 ;;
  147.   "-target_dir")
  148.    TARGET_DIR=$2
  149.    ADM_DIR=$TARGET_DIR/var/adm
  150.    shift 2 ;;
  151.   "-source_device")
  152.    SOURCE_DEVICE=$2 ; shift 2 ;;
  153.   esac
  154.  done
  155. else  # there were no arguments, so we'll get the needed information from the
  156.       # user and then go on.
  157.  CMD_START="true"
  158.  cat << EOF
  159.  
  160. Welcome to the Slackware package tool (pkgtool v. 2.0.0-tty).
  161.  
  162. EOF
  163.  while [ 0 ]; do
  164.   echo -n "Would you like to [i]nstall or [r]emove packages? "
  165.   read REPLY;
  166.   if [ "$REPLY" = "r" -o "$REPLY" = "R" ]; then
  167.    echo 
  168.    echo "You have installed these packages:"
  169.    ls $ADM_DIR/packages
  170.    echo 
  171.    echo -n "Remove which packages? "
  172.    read REMOVAL_LIST;
  173.    remove_packages "$REMOVAL_LIST"
  174.    echo 
  175.    echo "Packages removed."
  176.    chmod 755 /
  177.    chmod 1777 /tmp
  178.    exit
  179.   elif [ "$REPLY" = "i" -o "$REPLY" = "I" ]; then
  180.     echo
  181.    echo -n "Install from [c]urrent directory, [o]ther directory, or [f]loppy? " 
  182.    read REPLY;
  183.    echo
  184.    if [ "$REPLY" = "f" -o "$REPLY" = "F" ]; then
  185.     cat << EOF
  186. Install from:
  187.  
  188.   1 -- /dev/fd0 (drive 1)
  189.   2 -- /dev/fd1 (drive 2)
  190.  
  191. EOF
  192.     echo -n "Source drive? "
  193.     read REPLY;
  194.     if [ "$REPLY" = "1" ]; then
  195.      SOURCE_DEVICE="/dev/fd0"
  196.     elif [ "$REPLY" = "2" ]; then
  197.      SOURCE_DEVICE="/dev/fd1"
  198.     else
  199.      echo "Not a proper choice. Bye bye!"
  200.      exit 
  201.     fi
  202.     cat << EOF
  203.  
  204. Enter the names of any disk sets you would like to install.
  205. Seperate the sets with a space, like this: a b oi x
  206.  
  207. To install packages from one disk, hit [enter] without typing
  208. anything.
  209.  
  210. EOF
  211.     echo -n "Disk sets ==> "
  212.     read DISK_SETS;
  213.     if [ "$DISK_SETS" = "" ]; then
  214.      DISK_SETS="disk"
  215.     else
  216.      DISK_SETS=`echo $DISK_SETS | sed 's/ /#/g'`
  217.      DISK_SETS="#$DISK_SETS"
  218.     fi
  219.     break;
  220.    elif [ "$REPLY" = "o" -o "$REPLY" = "O" ]; then
  221.     echo
  222.     echo "What directory would you like to install"
  223.     echo -n "packages from? " 
  224.     read SOURCE_DIR;
  225.     SOURCE_MOUNTED="always"
  226.     DISK_SETS="disk"
  227.     chmod 755 $TARGET_DIR
  228.     chmod 1777 $TARGET_DIR/tmp
  229.     break;
  230.    elif [ "$REPLY" = "c" -o "$REPLY" = "C" ]; then # installing from current directory
  231.     SOURCE_MOUNTED="always"
  232.     SOURCE_DIR="$PWD"
  233.     DISK_SETS="disk" 
  234.     chmod 755 $TARGET_DIR
  235.     chmod 1777 $TARGET_DIR/tmp
  236.     break;
  237.    fi
  238.   fi 
  239.  done
  240. fi
  241. if [ "$DISK_SETS" = "disk" ]; then
  242.  ASK="always"
  243. fi
  244.  
  245. for DIR in $ADM_DIR $ADM_DIR/packages $ADM_DIR/scripts $ADM_DIR/disk_contents
  246. do
  247.  if [ ! -d $DIR ]; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  248. done
  249.  
  250. if [ ! -d $ADM_DIR/mount -a ! -L $ADM_DIR/mount ]; then
  251.  mkdir -p $ADM_DIR/mount ; chmod 755 $ADM_DIR/mount
  252. fi
  253.  
  254. mount_the_source() {
  255.  # is the source supposed to be mounted already?
  256.  if [ "$SOURCE_MOUNTED" = "always" ]; then
  257.   # The source should already be mounted, so we test it
  258.   if [ ! -d $SOURCE_DIR ]; then # the directory is missing
  259.    cat << EOF
  260.  
  261. Your source device cannot be accessed properly.
  262.  
  263. Please be sure that it is mounted on /var/adm/mount, and that
  264. the Slackware disks are found in subdirectories of
  265. $SOURCE_DIR like specified.
  266. EOF
  267.    exit 1;
  268.   fi
  269.   return 0;
  270.  fi
  271.  echo 
  272.  if [ ! "$1" = "single_disk" ]; then
  273.   echo "Please insert disk $1 and press [enter] to continue, [s] to skip this"
  274.   echo -n "series, or [q] to quit installing software altogether. " 
  275.  else
  276.   echo "Please insert disk to install packages from and press [enter], or"
  277.   echo -n "type [q] to abort. "
  278.  fi
  279.  read REPLY;
  280.  echo 
  281.  if [ "$REPLY" = "s" ]; then
  282.   return 1;
  283.  fi
  284.  if [ "$REPLY" = "q" ]; then
  285.   if [ "$DISK_SETS" = "disk" ]; then
  286.    echo "Aborting..."
  287.    echo 
  288.   else
  289.    cat << EOF
  290. Aborting software installation and skipping ahead
  291. to boot disk creation. Press control-c if you want
  292. to exit the installation program completely.
  293.  
  294. EOF
  295.   fi
  296.   chmod 755 $TARGET_DIR
  297.   chmod 1777 $TARGET_DIR/tmp
  298.   exit 1;
  299.  fi;
  300.  # Old line:
  301.  # mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
  302.  # New ones: (thanks to Andy Schwierskott!)
  303.  go_on=y
  304.  not_successfull_mounted=1
  305.  while [ "$go_on" = y -a "$not_successfull_mounted" = 1 ]; do
  306.     mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
  307.     not_successfull_mounted=$?
  308.     if [ "$not_successfull_mounted" = 1 ]; then
  309.        mount_answer=x
  310.        while [ "$mount_answer" != "y" -a "$mount_answer" != "q" ] ; do
  311.           echo -n "Media couldn't be mounted. Retry [y] or quit [q]? "
  312.           read mount_answer
  313.        done
  314.        go_on=$mount_answer
  315.     fi
  316.  done
  317.  test $not_successfull_mounted = 0
  318. }
  319. umount_the_source() {
  320.  if [ ! "$SOURCE_MOUNTED" = "always" ]; then
  321.   umount $SOURCE_DEVICE 1> /dev/null 2>&1
  322.  fi;
  323. }
  324. # The function below installs the package with the name $CURRENT_PACKAGE_NAME
  325. # and with the DOS file extension $CURRENT_PACKAGE_EXTENSION.
  326. install_the_current_package() {
  327. # we probably want to use thes  next 2 to delete the old package correctly, i
  328. # but we'll leave implementing that for later...
  329.  rm -f $ADM_DIR/removed_packages/$CURRENT_PACKAGE_NAME
  330.  rm -f $ADM_DIR/removed_scripts/$CURRENT_PACKAGE_NAME
  331.  echo "PACKAGE NAME:     $CURRENT_PACKAGE_NAME" > $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  332.  KSIZE=`expr $PACKAGE_SIZE / 1024`
  333.  echo "PACKAGE SIZE:     $KSIZE K" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  334.  BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*`
  335.  echo "PACKAGE LOCATION: $BASE_DISK_NAME" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  336.  echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  337.  if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  338.   fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$BASE_DISK_NAME >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null
  339.  fi
  340.  echo "FILE LIST:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  341.  # Pat's new-new pre-install cleanup routine.
  342.  for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do
  343.   if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  344.  done
  345.  mv $ADM_DIR/packages/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_packages 1> /dev/null 2>/dev/null
  346.  if [ -r $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME ]; then
  347.   cat $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
  348.   mv $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_scripts 1> /dev/null 2>&1
  349.   cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links
  350.   comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
  351.   ( cd $TARGET_DIR ; sh $TMP/delscript )
  352.   rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
  353.  fi
  354.  echo "Installing package $CURRENT_PACKAGE_NAME... "
  355.  if [ "$CURRENT_PACKAGE_EXTENSION" = ".tar" ]; then
  356.   (cd $TARGET_DIR; tar -xlpvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME$CURRENT_PACKAGE_EXTENSION >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 
  357.  else
  358.   (cd $TARGET_DIR; gzip -cd | tar -xlpvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME$CURRENT_PACKAGE_EXTENSION >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  359.  fi
  360.  chmod 644 $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  361.  if [ -f $TARGET_DIR/install/doinst.sh ]; then
  362.   echo "Executing installation script for package $CURRENT_PACKAGE_NAME... "
  363.   (cd $TARGET_DIR; sh $TARGET_DIR/install/doinst.sh -install; )
  364.   cp $TARGET_DIR/install/doinst.sh $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  365.   chmod 755 $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  366.   # Clean up the mess...
  367.   if [ -d $TARGET_DIR/install ]; then
  368.    (cd $TARGET_DIR/install ; rm -r -f doin* 1> /dev/null 2>&1 )
  369.    rmdir $TARGET_DIR/install 1> /dev/null 2>&1
  370.   fi
  371.  fi
  372.  # Now we reload the shell hash table in case we've added something useful
  373.  # to the command path:
  374.  hash -r
  375.  echo "Done installing package $CURRENT_PACKAGE_NAME."
  376. }
  377. install_disk() {
  378.  mount_the_source $1
  379.  if [ $? = 1 ]; then
  380.   umount_the_source;
  381.   return 1;
  382.  fi
  383.  CURRENT_DISK_NAME="$1"
  384.  PACKAGE_DIR=$SOURCE_DIR
  385.  if [ "$SOURCE_MOUNTED" = "always" -a ! "$DISK_SETS" = "disk" ]; then
  386.    PACKAGE_DIR=$PACKAGE_DIR/$1
  387.  fi
  388.  if [ ! "DISK_SETS" = "disk" ]; then
  389.   if [ -r $PACKAGE_DIR/tagfile$CUSTOM ]; then
  390.    cat $PACKAGE_DIR/tagfile$CUSTOM >> $TMP/tagfile
  391.    chmod 600 $TMP/tagfile
  392.   elif [ -r $PACKAGE_DIR/tagfile ]; then
  393.    cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
  394.    chmod 600 $TMP/tagfile
  395.   fi
  396.  fi
  397.  if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 ]; then
  398.   CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
  399.   if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
  400.    if fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2>&1 ; then
  401.     # First we check for missing packages...
  402.     for PKGTEST in `fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10-` ; do
  403.      if [ ! -r $PACKAGE_DIR/$PKGTEST.tgz ]; then
  404.       cat << EOF
  405.  
  406. WARNING!!!
  407.  
  408. While looking through your index file ($CATALOG_FILE), I noticed that you
  409. might be missing a package ($PKGTEST.tgz) that is supposed to be on this
  410. disk (disk $1). You may go on with the installation if you wish, but if this
  411. is a crucial file I'm making no promises that your machine will boot.
  412.  
  413. Press [enter] to continue...
  414. EOF
  415.       read JUNK_INPUT;
  416.      fi
  417.     done # checking for missing packages
  418.     # Now we test for extra packages
  419.     ALLOWED="`fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10-`" 
  420.     for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
  421.      BASE="`basename $PACKAGE_FILENAME .tgz`"
  422.      if echo $ALLOWED | fgrep $BASE 1> /dev/null 2>&1 ; then
  423.       GOOD="yup yup"
  424.      else
  425.       cat << EOF
  426.  
  427. WARNING!!!
  428.  
  429. While looking through your index file ($CATALOG_FILE), I noticed that you
  430. have this extra package ($BASE.tgz) that I don't recongnize. Please be sure
  431. this package is really supposed to be here, and is not left over from an old
  432. version of Slackware. Sometimes this can happen at the archive sites.
  433.  
  434. Press [enter] to continue...
  435.  
  436. EOF
  437.       read JUNK_INPUT;
  438.      fi
  439.     done 
  440.    fi
  441.    cat $PACKAGE_DIR/$CATALOG_FILE > $ADM_DIR/disk_contents/$CATALOG_FILE
  442.    chmod 644 $ADM_DIR/disk_contents/$CATALOG_FILE
  443.   fi
  444.   for TEST_EXTENSION in .tgz .tar; do
  445.    for PACKAGE_FILENAME in $PACKAGE_DIR/*$TEST_EXTENSION; do
  446.     if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*$TEST_EXTENSION" ]; then
  447.      continue;
  448.     fi
  449.     CURRENT_PACKAGE_NAME=`basename $PACKAGE_FILENAME $TEST_EXTENSION`
  450.     CURRENT_PACKAGE_EXTENSION=$TEST_EXTENSION
  451.     AddKey=""
  452.     SkipKey=""
  453.     if [ "$ASK" = "tagfiles" -a ! "$DISK_SETS" = "disk" ]; then
  454.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD > /dev/null 2> /dev/null ; then
  455.       AddKey="ADD"
  456.      fi
  457.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP > /dev/null 2> /dev/null ; then
  458.       SkipKey="SKIP"
  459.      fi
  460.     elif [ "$ASK" = "never" ]; then
  461.      AddKey="ADD"
  462.     else # ASK must equal always
  463.      ASK="always"
  464.      fi  
  465.     if [ ! "$DISK_SETS" = "disk" ]; then
  466.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD > /dev/null 2> /dev/null ; then
  467.       PRIORITY="[required]"
  468.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep REC > /dev/null 2> /dev/null ; then
  469.       PRIORITY="[recommended]"
  470.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep OPT > /dev/null 2> /dev/null ; then
  471.       PRIORITY="[optional]"
  472.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP > /dev/null 2> /dev/null ; then
  473.       PRIORITY="[skip]"
  474.      else
  475.       PRIORITY="[unknown]"
  476.      fi
  477.     fi
  478.     echo
  479.     PACKAGE_SIZE=`filesize $PACKAGE_FILENAME`
  480.     if [ "$AddKey" = "ADD" ]; then
  481.      echo "Auto-installing package ==>$CURRENT_PACKAGE_NAME<==        Priority: $PRIORITY"
  482.      # Print out the description text:
  483.      BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*`
  484.      if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  485.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  486.      fi
  487.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tgz" ]; then
  488.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  489.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  490.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  491.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  492.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  493.      else # uncompressed
  494.       echo "Size: This tar archive will use `expr $PACKAGE_SIZE / 1024`K of drive space."
  495.      fi
  496.      install_the_current_package;
  497.     elif [ "$SkipKey" != "SKIP" ]; then
  498.      echo "Package Name: ==>$CURRENT_PACKAGE_NAME<==        Priority: $PRIORITY"
  499.      if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  500.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  501.      fi
  502.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tgz" ]; then
  503.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  504.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  505.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  506.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  507.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  508.      else # uncompressed
  509.       echo "Size: This tar archive will use `expr $PACKAGE_SIZE / 1024`K of drive space."
  510.      fi
  511.      while [ 0 ]; do
  512.       echo -n "Install package ==>$CURRENT_PACKAGE_NAME<== ([y]es, [n]o, [q]uit adding software)? "
  513.       read REPLY;
  514.       if [ "$REPLY" = "y" ]; then
  515.        install_the_current_package;
  516.        break;
  517.       elif [ "$REPLY" = "n" ]; then
  518.        break;
  519.       elif [ "$REPLY" = "q" ]; then
  520.        umount_the_source;
  521.        chmod 755 $TARGET_DIR
  522.        chmod 1777 $TARGET_DIR/tmp
  523.        exit 1;
  524.       fi
  525.        echo
  526.       echo "Not a valid choice."
  527.       echo 
  528.      done
  529.     else
  530.      echo "Auto-skipping package ==>$CURRENT_PACKAGE_NAME<==       Priority: $PRIORITY" 
  531.      if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  532.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  533.      fi
  534.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tar" ]; then
  535.       echo "Size: This tar archive would have used `expr $PACKAGE_SIZE / 1024`K of drive space."
  536.      else
  537.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  538.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  539.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  540.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  541.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  542.      fi
  543.     fi
  544.    done
  545.   done
  546.   OUTTAHERE="false"
  547.   if [ -r $PACKAGE_DIR/install.end ]; then
  548.    OUTTAHERE="true"
  549.   fi
  550.   umount_the_source;
  551.   if [ "$OUTTAHERE" = "true" ]; then
  552.    return 1;
  553.   fi
  554.  else
  555.   umount_the_source;
  556.   if [ ! "$SOURCE_MOUNTED" = "always" ]; then
  557.    echo
  558.    echo -n "Incorrect disk, insert disk $1 and hit [enter], or [s] to skip series: "
  559.    read REPLY;
  560.    if [ "$REPLY" = "s" ]; then
  561.     return 1;
  562.    else
  563.     install_disk $1;
  564.    fi
  565.   else
  566.    cat << EOF
  567.  
  568. Can't find a disk series $SERIES_NAME in the source directory.
  569. Skipping it...
  570.  
  571. EOF
  572.    return 1; 
  573.   fi 
  574.  fi;
  575. }
  576. install_disk_set() { # accepts one argument: the series name in lowercase.
  577.  SERIES_NAME=$1
  578.  CURRENT_DISK_NUMBER="1";
  579.  while [ 0 ]; do
  580.   install_disk $SERIES_NAME$CURRENT_DISK_NUMBER;
  581.   if [ $? = 1 ]; then # install.end was found, or the user chose
  582.         # to quit installing packages.
  583.    return 0;
  584.   fi
  585.   CURRENT_DISK_NUMBER=`expr $CURRENT_DISK_NUMBER + 1`
  586.  done;
  587. }
  588. if [ "$DISK_SETS" = "disk" ]; then
  589.  install_disk single_disk;
  590.  ASK="always"
  591. else
  592.  touch $TMP/tagfile
  593.  chmod 600 $TMP/tagfile
  594.  if echo $DISK_SETS | fgrep "#a#" 1> /dev/null 2>&1; then
  595.   A_IS_NEEDED="true"
  596.  else
  597.   A_IS_NEEDED="false"
  598.  fi
  599.  while [ 0 ];
  600.  do
  601.   while [ 0 ]; # strip leading '#'s
  602.   do
  603.    if [ "`echo $DISK_SETS | cut -b1`" = "#" ]; then
  604.     DISK_SETS="`echo $DISK_SETS | cut -b2-`"
  605.    else
  606.     break;
  607.    fi
  608.   done
  609.   if [ "$A_IS_NEEDED" = "true" ]; then
  610.    if [ "$TARGET_DIR" = "/" ]; then
  611.     cat << EOF
  612.  
  613. *** WARNING!
  614.   Reinstalling your A series from the running system is not
  615.   a good idea. It is suggested that you use the bootdisk
  616.   instead. You may:
  617.   [a] - Abort software installation.
  618.   [i] - Ignore this warning and reinstall the A series anyway.
  619.         (at your own risk)!
  620.   [s] - skip the A series, but continue installing software.
  621.  
  622. EOF
  623.     echo -n "[a]bort, [i]gnore, or [s]kip? "
  624.     read WHATDO;
  625.     echo
  626.     if [ "$WHATDO" = "a" ]; then
  627.      echo "Aborting..."
  628.      echo
  629.      A_IS_NEEDED="false"
  630.      DISK_SETS=""
  631.      continue;
  632.     elif [ "$WHATDO" = "s" ]; then
  633.      echo "Skipping A series..."
  634.      echo
  635.      A_IS_NEEDED="false"
  636.      continue;
  637.     elif [ ! "$WHATDO" = "i" ]; then
  638.      continue; # unknown response
  639.     fi
  640.    fi
  641.    cat << EOF
  642.  
  643. --- Installing disk series ==>a<==
  644. EOF
  645.    install_disk_set a;
  646.    A_IS_NEEDED="false"
  647.   fi
  648.   count="1"
  649.   if [ "`echo $DISK_SETS | cut -b$count`" = "" ]; then
  650.    break; # we be done here :^)
  651.   else
  652.    count="2"
  653.    while [ 0 ]; do
  654.     if [ "`echo $DISK_SETS | cut -b$count`" = "" -o "`echo $DISK_SETS | cut -b$count`" = "#" ]; then
  655.      count="`expr $count - 1`"
  656.      break;
  657.     else
  658.      count="`expr $count + 1`"
  659.     fi
  660.    done
  661.   fi
  662.   diskset="`echo $DISK_SETS | cut -b1-$count`"
  663.   count="`expr $count + 1`"
  664.   DISK_SETS="`echo $DISK_SETS | cut -b$count-`"
  665.   if [ "$diskset" = "a" ]; then
  666.    continue; # we expect this to be done elsewhere
  667.   fi
  668.   cat << EOF
  669.  
  670. --- Installing disk series ==>$diskset<==
  671. EOF
  672.   install_disk_set $diskset; 
  673.  done
  674. fi
  675. if [ "$DISK_SETS" = "disk" -o "$CMD_START" = "true" ]; then
  676.  if [ -r $TMP/tagfile ]; then
  677.   rm $TMP/tagfile
  678.  fi
  679. fi
  680. chmod 755 $TARGET_DIR
  681. chmod 755 $TARGET_DIR/var
  682. chmod 1777 $TMP
  683.