#!/bin/sh # # Copyright 1993, 1994 Patrick Volkerding, Moorhead, Minnesota USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Wed, 27 Apr 1994 00:06:50 -0700 (PDT) # Optimization by David Hinds. SOURCE_DIR=/var/adm/mount umask 000 ASK="tagfiles" if [ ! -d /usr/sbin ]; then # we must be on the bootdisk TARGET_DIR=/mnt TMP=/mnt/tmp if mount | fgrep "on /mnt" 1> /dev/null 2>&1 ; then # good echo > /dev/null else # bad echo echo echo "You can't run pkgtool from the rootdisk until you've mounted your Linux" echo "partitions beneath /mnt. Here are some examples of this:" echo echo "If your root partition is /dev/hda1, and is using ext2fs, you would type:" echo "mount /dev/hda1 /mnt -t ext2" echo echo "Then, supposing your /usr partition is /dev/hda2, you must do this:" echo "mount /dev/hda2 /mnt/usr -t ext2" echo echo "Please mount your Linux partitions and then run pkgtool again." echo exit fi if [ ! -d $TMP ]; then mkdir -p $TMP chmod 1777 $TMP fi else TARGET_DIR=/ TMP=/tmp fi ADM_DIR=$TARGET_DIR/var/adm LOG=$TMP/PKGTOOL.REMOVED keep_files() { while read FILE ; do if [ -f "$TARGET_DIR/$FILE" ]; then echo " --> $FILE was found in another package. Skipping." >> $LOG fi done } keep_links() { while read LINK ; do echo "Duplicate link. Not executing: $LINK" >> $LOG done } delete_files() { while read FILE ; do if [ -f "$TARGET_DIR/$FILE" ]; then echo " --> Deleting $FILE" >> $LOG rm -f $TARGET_DIR/$FILE fi done } delete_links() { while read LINK ; do echo "Unique link. Executing: $LINK" >> $LOG done } # Conversion to 'comm' utility by Mark Wisdom. remove_packages() { for package_name in $* do if [ -r $ADM_DIR/packages/$package_name ]; then dialog --title "PACKAGE REMOVAL IN PROGRESS" --infobox "Removing \ package $package_name. Since each file must be checked \ against the contents of every other installed package to avoid wiping out \ areas of overlap, this process can take quite some time. If you'd like to \ watch the progress, flip over to another virtual console and type 'tail -f \ /tmp/PKGTOOL.REMOVED'." 9 60 echo "Removing package $package_name:" >> $LOG if fgrep "./" $ADM_DIR/packages/$package_name 1> /dev/null 2>&1; then TRIGGER=".\/" else TRIGGER="FILE LIST:" fi echo "Removing files:" >> $LOG sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$package_name | sort -u > $TMP/delete_list # Pat's new-new && improved pre-removal routine. for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi done mv $ADM_DIR/packages/$package_name $ADM_DIR/removed_packages 1> /dev/null 2>&1 # Look for duplicated links and leave them in place. if [ -r $ADM_DIR/scripts/$package_name ]; then cat $ADM_DIR/scripts/$package_name | fgrep 'rm -rf' | sort -u > $TMP/del_link_list mv $ADM_DIR/scripts/$package_name $ADM_DIR/removed_scripts 1> /dev/null 2>&1 cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links comm -12 $TMP/del_link_list $TMP/required_links | keep_links comm -23 $TMP/del_link_list $TMP/required_links | delete_links comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript ( cd $TARGET_DIR ; sh $TMP/delscript ) rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript fi cat $ADM_DIR/packages/* | sort -u > $TMP/required_files comm -12 $TMP/delete_list $TMP/required_files | keep_files comm -23 $TMP/delete_list $TMP/required_files | delete_files rm -f $TMP/delete_list rm -f $TMP/required_files else echo "No such package: $package_name. Can't remove." >> $LOG fi done } # Here, we read the list of arguments passed to the pkgtool script. if [ $# -gt 0 ]; then # there are arguments to the command while [ $# -gt 0 ]; do case "$1" in "-sets") DISK_SETS=`echo $2 | tr "[A-Z]" "[a-z]"` ; shift 2 ;; "-source_mounted") SOURCE_MOUNTED="always" ; shift 1 ;; "-ignore_tagfiles") ASK="never" ; shift 1 ;; "-source_dir") SOURCE_DIR=$2 ; shift 2 ;; "-target_dir") TARGET_DIR=$2 ADM_DIR=$TARGET_DIR/var/adm shift 2 ;; "-source_device") SOURCE_DEVICE=$2 ; shift 2 ;; esac done else # there were no arguments, so we'll get the needed information from the # user and then go on. CMD_START="true" rm -f /tmp/SeT* while [ 0 ]; do dialog --title "Slackware Package Tool (pkgtool version 2.1.0)" \ --menu "\nWelcome to the Slackware package tool.\n\ \nWhich option would you like?\n" 17 74 6 \ "Current" "Install packages from the current directory" \ "Other" "Install packages from some other directory" \ "Floppy" "Install packages from floppy disks" \ "Remove" "Remove packages that are currently installed" \ "View" "View the list of files contained in a package" \ "Exit" "Exit Pkgtool" 2> /tmp/reply if [ $? = 1 -o $? = 255 ]; then rm -f /tmp/reply reset exit fi REPLY="`cat /tmp/reply`" rm -f /tmp/reply if [ "$REPLY" = "Exit" ]; then reset exit fi if [ "$REPLY" = "View" ]; then dialog --title "SCANNING" --infobox "Please wait while \ Pkgtool scans your system to determine which packages you have \ installed and prepares a list for you. This will take \ 1.`date +"%S"`E+`date +"%M"` BogoMipSeconds." 7 40 echo 'dialog --menu "Please select the package you wish to view." 15 55 8 \' > /tmp/viewscr ls $ADM_DIR/packages | sed -e 's/.*/"&" "" \\/' >> /tmp/viewscr echo "2> /tmp/return" >> /tmp/viewscr while [ 0 ]; do . /tmp/viewscr if [ ! "`cat /tmp/return`" = "" ]; then dialog --title "CONTENTS OF PACKAGE: `cat /tmp/return`" --textbox "$ADM_DIR/packages/`cat /tmp/return`" \ 22 74 2> /dev/null else break fi done rm -f /tmp/return /tmp/viewscr /tmp/tmpmsg chmod 755 / chmod 1777 /tmp continue fi if [ "$REPLY" = "Remove" ]; then dialog --title "SCANNING" --infobox "Please wait while Pkgtool scans \ your system to determine which packages you have installed and prepares \ a list for you. This will take 3.`date +"%S"`E+`date +"%M"` \ BogoMipSeconds." 7 40 cat << EOF > $TMP/rmscript dialog --title "SELECT PACKAGES TO REMOVE" --checklist "Please select the \ packages you wish to Remove. Use the \ spacebar to select packages to delete, and the UP/DOWN arrow keys to \ scroll up and down through the entire list." 22 75 13 \\ EOF for name in `ls $ADM_DIR/packages` ; do BLURB="`sed -n \"/$name:/{s/\\"//g;p;q;}\" $ADM_DIR/packages/$name | cut -b10-45`" echo " \"$name\" \"$BLURB\" off \\" >> $TMP/rmscript done echo "2> /tmp/return" >> $TMP/rmscript cat /dev/null > $LOG chmod 700 $TMP/rmscript export ADM_DIR; $TMP/rmscript remove_packages `cat /tmp/return | tr -d "\042"` if [ "`cat /tmp/PKGTOOL.REMOVED`" = "" ]; then rm -f /tmp/PKGTOOL.REMOVED else dialog --title "PACKAGE REMOVAL COMPLETE" --msgbox "The packages have been \ removed. A complete log of the files that were removed has been created \ in $TMP: PKGTOOL.REMOVED. Pkgtool does not remove empty directories, so you may \ want to do that yourself." 8 63 fi rm -f $TMP/rmscript /tmp/return /tmp/tmpmsg /tmp/SeT* chmod 755 / chmod 1777 /tmp dialog --clear exit elif [ "$REPLY" = "Floppy" ]; then dialog --title "SELECT FLOPPY DRIVE" --menu "Which floppy drive would \ you like to install from?" \ 11 70 4 \ "/dev/fd0H1440" "1.44 MB first floppy drive" \ "/dev/fd1H1440" "1.44 MB second floppy drive" \ "/dev/fd0h1200" "1.2 MB first floppy drive" \ "/dev/fd1h1200" "1.2 MB second floppy drive" 2> /tmp/wdrive if [ $? = 1 ]; then dialog --clear exit fi SOURCE_DEVICE="`cat /tmp/wdrive`" rm -f /tmp/wdrive cat << EOF > /tmp/tmpmsg Enter the names of any disk sets you would like to install. Seperate the sets with a space, like this: a b oi x To install packages from one disk, hit [enter] without typing anything. EOF dialog --title "SOFTWARE SELECTION" --inputbox "`cat /tmp/tmpmsg`" 13 70 2> /tmp/sets DISK_SETS="`cat /tmp/sets`" rm -f /tmp/sets if [ "$DISK_SETS" = "" ]; then DISK_SETS="disk" else DISK_SETS=`echo $DISK_SETS | sed 's/ /#/g'` DISK_SETS="#$DISK_SETS" fi break; elif [ "$REPLY" = "Other" ]; then dialog --title "SELECT SOURCE DIRECTORY" --inputbox "Please enter the name of the directory that you wish to \ install packages from:" 10 50 2> /tmp/pkgdir if [ $? = 1 ]; then rm -f /tmp/pkgdir /tmp/SeT* reset exit fi SOURCE_DIR="`cat /tmp/pkgdir`" SOURCE_MOUNTED="always" DISK_SETS="disk" chmod 755 $TARGET_DIR chmod 1777 $TARGET_DIR/tmp rm -f /tmp/pkgdir if [ ! -d $SOURCE_DIR ]; then dialog --title "DIRECTORY NOT FOUND" --msgbox "The directory you want to \ install from ($SOURCE_DIR) \ does not seem to exist. Please check the directory and then try again." \ 10 50 reset exit fi break; else # installing from current directory SOURCE_MOUNTED="always" SOURCE_DIR="$PWD" DISK_SETS="disk" chmod 755 $TARGET_DIR chmod 1777 $TARGET_DIR/tmp break; fi done fi if [ "$DISK_SETS" = "disk" ]; then ASK="always" fi for DIR in $ADM_DIR $ADM_DIR/packages $ADM_DIR/scripts $ADM_DIR/disk_contents do if [ ! -d $DIR ]; then mkdir -p $DIR ; chmod 755 $DIR ; fi done if [ ! -d $ADM_DIR/mount -a ! -L $ADM_DIR/mount ]; then mkdir -p $ADM_DIR/mount ; chmod 755 $ADM_DIR/mount fi mount_the_source() { # is the source supposed to be mounted already? if [ "$SOURCE_MOUNTED" = "always" ]; then # The source should already be mounted, so we test it if [ ! -d $SOURCE_DIR ]; then # the directory is missing cat << EOF > /tmp/tmpmsg Your source device cannot be accessed properly. Please be sure that it is mounted on /var/adm/mount, and that the Slackware disks are found in subdirectories of $SOURCE_DIR like specified. EOF dialog --title "MOUNT ERROR" --msgbox "`cat /tmp/tmpmsg`" 11 67 rm -f /tmp/tmpmsg exit 1; fi return 0; fi dialog --title "INSERT DISK" --menu "Please insert disk $1 and \ press ENTER to continue." \ 11 50 3 \ "Continue" "Continue with the installation" \ "Skip" "Skip the current disk series" \ "Quit" "Abort the installation process" 2> /tmp/reply if [ $? = 1 -o $? = 255 ]; then REPLY="Quit" else REPLY="`cat /tmp/reply`" fi rm -f /tmp/reply if [ "$REPLY" = "Skip" ]; then return 1; fi if [ "$REPLY" = "Quit" ]; then dialog --title "ABORTING" --msgbox "Aborting software installation." 5 50 chmod 755 $TARGET_DIR chmod 1777 $TARGET_DIR/tmp exit 1; fi; # Old line: # mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR # New ones: (thanks to Andy Schwierskott!) go_on=y not_successfull_mounted=1 while [ "$go_on" = y -a "$not_successfull_mounted" = 1 ]; do mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR not_successfull_mounted=$? if [ "$not_successfull_mounted" = 1 ]; then mount_answer=x while [ "$mount_answer" != "y" -a "$mount_answer" != "q" ] ; do dialog --title "MOUNT PROBLEM" --menu "Media was not successfully \ mounted! Do you want to \ retry, or quit?" 10 60 2 \ "Yes" "Try to mount the disk again" \ "No" "No, abort." 2> /tmp/mntans mount_answer="`cat /tmp/mntans`" rm -f /tmp/mntans if [ "$mount_answer" = "Yes" ]; then mount_answer="y" else mount_answer="q" fi done go_on=$mount_answer fi done test $not_successfull_mounted = 0 } umount_the_source() { if [ ! "$SOURCE_MOUNTED" = "always" ]; then umount $SOURCE_DEVICE 1> /dev/null 2>&1 fi; } # The function below installs the package with the name $CURRENT_PACKAGE_NAME # and with the DOS file extension .tgz install_the_current_package() { rm -f $ADM_DIR/removed_packages/$CURRENT_PACKAGE_NAME rm -f $ADM_DIR/removed_scripts/$CURRENT_PACKAGE_NAME echo "PACKAGE NAME: $CURRENT_PACKAGE_NAME" > $ADM_DIR/packages/$CURRENT_PACKAGE_NAME echo "COMPRESSED PACKAGE SIZE: $COMPRESSED" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME echo "UNCOMPRESSED PACKAGE SIZE: $UNCOMPRESSED" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*` echo "PACKAGE LOCATION: $BASE_DISK_NAME" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME # echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME # if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then # fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$BASE_DISK_NAME | uniq >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME # fi for index_file in $PACKAGE_DIR/disk* $PACKAGE_DIR/package_descriptions ; do if [ ! "$index_file" = "$PACKAGE_DIR/disk??*" ]; then if [ -r "$index_file" ]; then echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME if cat $index_file | strings | uniq | fgrep "$CURRENT_PACKAGE_NAME:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null ; then break; fi fi fi done echo "FILE LIST:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME # Pat's new-new pre-install cleanup routine. if [ -r $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME -a ! -d $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME ]; then cat $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME | fgrep 'rm -rf' | sort -u > $TMP/del_link_list if [ ! -d $ADM_DIR/removed_scripts ]; then mkdir $ADM_DIR/removed_scripts fi mv $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_scripts 1> /dev/null 2>&1 cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links comm -12 $TMP/del_link_list $TMP/required_links | keep_links comm -23 $TMP/del_link_list $TMP/required_links | delete_links comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript ( cd $TARGET_DIR ; sh $TMP/delscript ) rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME fi # Install the package: (cd $TARGET_DIR; tar -xzlpvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null chmod 644 $ADM_DIR/packages/$CURRENT_PACKAGE_NAME if [ -f $TARGET_DIR/install/doinst.sh ]; then # Executing installation script for package $CURRENT_PACKAGE_NAME... (cd $TARGET_DIR; sh $TARGET_DIR/install/doinst.sh -install; ) cp $TARGET_DIR/install/doinst.sh $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME chmod 755 $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME # Clean up the mess... if [ -d $TARGET_DIR/install ]; then (cd $TARGET_DIR/install ; rm -r -f doin* 1> /dev/null 2>&1 ) rmdir $TARGET_DIR/install 1> /dev/null 2>&1 fi fi # Now we reload the shell hash table in case we've added something useful # to the command path: hash -r # Done installing package $CURRENT_PACKAGE_NAME. } install_disk() { mount_the_source $1 if [ $? = 1 ]; then umount_the_source; return 1; fi CURRENT_DISK_NAME="$1" PACKAGE_DIR=$SOURCE_DIR if [ "$SOURCE_MOUNTED" = "always" -a ! "$DISK_SETS" = "disk" ]; then PACKAGE_DIR=$PACKAGE_DIR/$1 fi touch $TMP/tagfile if [ ! "$DISK_SETS" = "disk" ]; then if [ -r /tmp/SeTtagext ]; then if [ -r $PACKAGE_DIR/tagfile`cat /tmp/SeTtagext` ]; then cat $PACKAGE_DIR/tagfile`cat /tmp/SeTtagext` >> $TMP/tagfile else if [ -r $PACKAGE_DIR/tagfile ]; then cat $PACKAGE_DIR/tagfile >> $TMP/tagfile fi fi elif [ -r /tmp/SeTtagpath ]; then custom_path=`cat /tmp/SeTtagpath` short_path=`basename $PACKAGE_DIR` if [ -r $custom_path/$short_path/tagfile ]; then cat $custom_path/$short_path/tagfile >> $TMP/tagfile else if [ -r $PACKAGE_DIR/tagfile ]; then cat $PACKAGE_DIR/tagfile >> $TMP/tagfile fi fi elif [ -r $PACKAGE_DIR/tagfile ]; then cat $PACKAGE_DIR/tagfile >> $TMP/tagfile fi # # Execute menus if in QUICK mode: # if [ -r /tmp/SeTQUICK -a -r $PACKAGE_DIR/maketag ]; then sh $PACKAGE_DIR/maketag if [ -r /tmp/SeTnewtag ]; then mv /tmp/SeTnewtag $TMP/tagfile fi fi if [ -r $TMP/tagfile ]; then chmod 600 $TMP/tagfile fi fi if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 ]; then CATALOG_FILE=`basename $PACKAGE_DIR/disk*`; if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then if fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2>&1 ; then # First we check for missing packages... for PKGTEST in `fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null` ; do if [ ! -r $PACKAGE_DIR/$PKGTEST.tgz ]; then cat << EOF > /tmp/tmpmsg WARNING!!! While looking through your index file ($CATALOG_FILE), I noticed that you might be missing a package ($PKGTEST.tgz) that is supposed to be on this disk (disk $1). You may go on with the installation if you wish, but if this is a crucial file I'm making no promises that your machine will boot. EOF dialog --title "FILE MISSING FROM YOUR DISK" --msgbox \ "`cat /tmp/tmpmsg`" 15 73 fi done # checking for missing packages # Now we test for extra packages ALLOWED="`fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null`" for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do BASE="`basename $PACKAGE_FILENAME .tgz`" if echo $ALLOWED | fgrep $BASE 1> /dev/null 2>&1 ; then GOOD="yup yup" else cat << EOF > /tmp/tmpmsg WARNING!!! While looking through your index file ($CATALOG_FILE), I noticed that you have this extra package ($BASE.tgz) that I don't recongnize. Please be sure this package is really supposed to be here, and is not left over from an old version of Slackware. Sometimes this can happen at the archive sites. EOF dialog --title "EXTRA FILE FOUND ON YOUR DISK" \ --msgbox "`cat /tmp/tmpmsg`" 15 67 rm -f /tmp/tmpmsg fi done fi cat $PACKAGE_DIR/$CATALOG_FILE > $ADM_DIR/disk_contents/$CATALOG_FILE chmod 644 $ADM_DIR/disk_contents/$CATALOG_FILE fi for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*.tgz" ]; then continue; fi CURRENT_PACKAGE_NAME=`basename $PACKAGE_FILENAME .tgz` AddKey="" SkipKey="" if [ "$ASK" = "tagfiles" ]; then # -a ! "$DISK_SETS" = "disk" ]; then if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD 1> /dev/null 2>&1 ; then AddKey="ADD" fi if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP 1> /dev/null 2>&1 ; then SkipKey="SKIP" fi elif [ "$ASK" = "never" ]; then AddKey="ADD" else # ASK must equal always ASK="always" fi if [ ! "$DISK_SETS" = "disk" ]; then if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD > /dev/null 2> /dev/null ; then PRIORITY="[required]" elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep REC > /dev/null 2> /dev/null ; then PRIORITY="[recommended]" elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep OPT > /dev/null 2> /dev/null ; then PRIORITY="[optional]" elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP > /dev/null 2> /dev/null ; then PRIORITY="[skip]" else PRIORITY="[unknown]" fi fi PACKAGE_SIZE=`filesize $PACKAGE_FILENAME` if [ "$AddKey" = "ADD" ]; then # echo "Auto-installing package ==>$CURRENT_PACKAGE_NAME<== Priority: $PRIORITY" > /tmp/tmpmsg echo > /tmp/tmpmsg # Print out the description text: CATALOG_FILE=`basename $PACKAGE_DIR/disk*`; # if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then # fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$CATALOG_FILE | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null ; # else for index_file in $PACKAGE_DIR/disk* $PACKAGE_DIR/package_descriptions ; do if [ ! "$index_file" = "$PACKAGE_DIR/disk??*" ]; then if [ -r "$index_file" ]; then cat $index_file | strings | fgrep "$CURRENT_PACKAGE_NAME:" | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null fi fi done # fi COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`" UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`" COMPRESSED="`expr $COMPBYTES / 1024` K" UNCOMPRESSED="`expr $UNCOMPBYTES / 1024` K" echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED." >> /tmp/tmpmsg if [ ! "$PRIORITY" = "" ]; then PMSG=" Priority: $PRIORITY" else PMSG="" fi dialog --title "Auto-installing package ==>$CURRENT_PACKAGE_NAME<==$PMSG" --infobox "`cat /tmp/tmpmsg`" 15 75 rm -f /tmp/tmpmsg install_the_current_package; elif [ "$SkipKey" != "SKIP" ]; then # echo "Package Name: ==>$CURRENT_PACKAGE_NAME<== Priority: $PRIORITY" > /tmp/tmpmsg echo > /tmp/tmpmsg CATALOG_FILE=`basename $PACKAGE_DIR/disk*`; if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$CATALOG_FILE | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null ; fi COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`" UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`" COMPRESSED="`expr $COMPBYTES / 1024` K" UNCOMPRESSED="`expr $UNCOMPBYTES / 1024` K" echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED." >> /tmp/tmpmsg echo >> /tmp/tmpmsg echo "Install package $CURRENT_PACKAGE_NAME? " >> /tmp/tmpmsg if [ ! "$PRIORITY" = "" ]; then PMSG=" Priority: $PRIORITY" else PMSG="" fi dialog --title "Package Name: ==>$CURRENT_PACKAGE_NAME<==$PMSG" --menu "`cat /tmp/tmpmsg`" 22 75 1 \ "Yes" "Install package $CURRENT_PACKAGE_NAME" \ "No" "Do not install package $CURRENT_PACKAGE_NAME" \ "Quit" "Abort software installation completely" 2> /tmp/reply if [ $? = 1 -o $? = 255 ]; then echo "No " > /tmp/reply fi REPLY="`cat /tmp/reply`" rm -f /tmp/reply /tmp/tmpmsg if [ "$REPLY" = "Yes" ]; then dialog --title "INSTALLING" --infobox "Installing package $CURRENT_PACKAGE_NAME" 3 50 install_the_current_package; elif [ "$REPLY" = "Quit" ]; then umount_the_source; chmod 755 $TARGET_DIR chmod 1777 $TARGET_DIR/tmp exit 1; elif [ "$REPLY" = "No" ]; then dialog --title "SKIPPING PACKAGE" --infobox "Skipping package $CURRENT_PACKAGE_NAME" 3 50 fi fi done OUTTAHERE="false" if [ -r $PACKAGE_DIR/install.end ]; then OUTTAHERE="true" fi umount_the_source; if [ "$OUTTAHERE" = "true" ]; then return 1; fi else umount_the_source; if [ ! "$SOURCE_MOUNTED" = "always" ]; then cat << EOF > /tmp/tmpmsg This does not look like the correct disk. You may either check to see if you've got the right disk in there ($1) and try again, or you may skip the current disk series. EOF dialog --title "INCORRECT DISK INSERTED" --menu "`cat /tmp/tmpmsg`" 15 70 2 \ "Retry" "Try to mount disk $1 again" \ "Skip" "Skip this disk series" 2> /tmp/reply if [ $? = 1 -o $? = 255 ]; then rm -f /tmp/reply /tmp/tmpmsg exit fi REPLY="`cat /tmp/reply`" rm -f /tmp/reply /tmp/tmpmsg if [ "$REPLY" = "Skip" ]; then return 1; else install_disk $1; fi else cat << EOF > /tmp/tmpmsg WARNING: Can't find a disk series $SERIES_NAME in the source directory. Skipping it... EOF dialog --title "SELECTED SERIES NOT PRESENT" --msgbox "`cat /tmp/tmpmsg`" 10 65 rm -f /tmp/tmpmsg return 1; fi fi; } install_disk_set() { # accepts one argument: the series name in lowercase. SERIES_NAME=$1 CURRENT_DISK_NUMBER="1"; while [ 0 ]; do install_disk $SERIES_NAME$CURRENT_DISK_NUMBER; if [ $? = 1 -o $? = 255 ]; then # install.end was found, or the user chose # to quit installing packages. return 0; fi CURRENT_DISK_NUMBER=`expr $CURRENT_DISK_NUMBER + 1` done; } if [ "$DISK_SETS" = "disk" ]; then install_disk single_disk; ASK="always" else touch $TMP/tagfile chmod 600 $TMP/tagfile if echo $DISK_SETS | fgrep "#a#" 1> /dev/null 2>&1; then A_IS_NEEDED="true" else A_IS_NEEDED="false" fi while [ 0 ]; do while [ 0 ]; # strip leading '#'s do if [ "`echo $DISK_SETS | cut -b1`" = "#" ]; then DISK_SETS="`echo $DISK_SETS | cut -b2-`" else break; fi done if [ "$A_IS_NEEDED" = "true" ]; then if [ "$TARGET_DIR" = "/" ]; then dialog --title "WARNING: BIG TROUBLE DETECTED" \ --menu " *** WARNING! Reinstalling your A series to a running system \ is not (yet) a good idea. It is suggested that you do not do this." \ 11 70 3 \ "Abort" "Abort software installation." \ "Ignore" "Ignore warning and reinstall the A series anyway." \ "Skip" "Skip the A series, but continue installing software." 2> /tmp/skip if [ $? = 1 -o $? = 255 ]; then exit fi WHATDO="`cat /tmp/skip`" rm -f /tmp/skip if [ "$WHATDO" = "Abort" ]; then dialog --msgbox "Aborting..." 5 30 A_IS_NEEDED="false" DISK_SETS="" continue; elif [ "$WHATDO" = "Skip" ]; then dialog --msgbox "Skipping A series..." 5 30 A_IS_NEEDED="false" continue; elif [ ! "$WHATDO" = "Ignore" ]; then continue; # unknown response fi fi cat << EOF > /tmp/tmpmsg --- Installing disk series ==>a<== EOF dialog --infobox "`cat /tmp/tmpmsg`" 5 45 sleep 1 rm -f /tmp/tmpmsg install_disk_set a; A_IS_NEEDED="false" fi count="1" if [ "`echo $DISK_SETS | cut -b$count`" = "" ]; then break; # we be done here :^) else count="2" while [ 0 ]; do if [ "`echo $DISK_SETS | cut -b$count`" = "" -o "`echo $DISK_SETS | cut -b$count`" = "#" ]; then count="`expr $count - 1`" break; else count="`expr $count + 1`" fi done fi diskset="`echo $DISK_SETS | cut -b1-$count`" count="`expr $count + 1`" DISK_SETS="`echo $DISK_SETS | cut -b$count-`" if [ "$diskset" = "a" ]; then continue; # we expect this to be done elsewhere fi cat << EOF > /tmp/tmpmsg Installing disk series ==>$diskset<== EOF dialog --infobox "`cat /tmp/tmpmsg`" 5 45 sleep 1 rm -f /tmp/tmpmsg install_disk_set $diskset; done fi if [ "$DISK_SETS" = "disk" -o "$CMD_START" = "true" ]; then if [ -r $TMP/tagfile ]; then rm $TMP/tagfile fi reset fi chmod 755 $TARGET_DIR $TARGET_DIR/var $TARGET_DIR/usr chmod 1777 $TARGET_DIR/tmp