|
楼主 |
发表于 2003-9-3 17:25:01
|
显示全部楼层
Dialog经典--Slackware软件包管理程序
推荐者:Sandy- #!/bin/sh
- #
- # Copyright 1993, 1994, 1995, 1996, 1997,
- # 1998, 1999 Patrick Volkerding, Moorhead, MN USA
- # Copyright 2001 Slackware Linux, Inc., Concord, CA 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/log/mount
- ASK="tagfiles"
- if [ -L /bin/chmod -a -L /bin/chown ]; then # probably on the bootdisk using busybox
- TARGET_DIR=/mnt
- TMP=/mnt/var/log/setup/tmp
- if mount | grep "on /mnt" 1> /dev/null 2>&1 ; then # good
- true
- 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
- else
- TARGET_DIR=/
- TMP=/var/log/setup/tmp
- fi
- if [ ! -d $TMP ]; then
- mkdir -p $TMP
- chmod 700 $TMP
- fi
- ADM_DIR=$TARGET_DIR/var/log
- LOG=$TMP/PKGTOOL.REMOVED
- # remove whitespace
- crunch() {
- while read FOO ; do
- echo $FOO
- done
- }
- package_name() {
- STRING=`basename $1 .tgz`
- # Check for old style package name with one segment:
- if [ "`echo $STRING | cut -f 1 -d -`" = "`echo $STRING | cut -f 2 -d -`" ]; then
- echo $STRING
- else # has more than one dash delimited segment
- # Count number of segments:
- INDEX=1
- while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do
- INDEX=`expr $INDEX + 1`
- done
- INDEX=`expr $INDEX - 1` # don't include the null value
- # If we don't have four segments, return the old-style (or out of spec) package name:
- if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
- echo $STRING
- else # we have four or more segments, so we'll consider this a new-style name:
- NAME=`expr $INDEX - 3`
- NAME="`echo $STRING | cut -f 1-$NAME -d -`"
- echo $NAME
- # cruft for later
- #VER=`expr $INDEX - 2`
- #VER="`echo $STRING | cut -f $VER -d -`"
- #ARCH=`expr $INDEX - 1`
- #ARCH="`echo $STRING | cut -f $ARCH -d -`"
- #BUILD="`echo $STRING | cut -f $INDEX -d -`"
- fi
- fi
- }
- remove_packages() {
- for pkg_name in $*
- do
- if [ -r $ADM_DIR/packages/$pkg_name ]; then
- dialog --title "PACKAGE REMOVAL IN PROGRESS" --cr-wrap --infobox \
- "\nRemoving package $pkg_name.\n\
- \n\
- 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:\n\
- \n\
- tail -f $TMP/PKGTOOL.REMOVED\n" 13 60
- export ROOT=$TARGET_DIR
- removepkg $pkg_name >> $LOG 2> /dev/null
- else
- echo "No such package: $pkg_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 ;;
- "-tagfile")
- USETAG=$2 ; shift 2 ;;
- "-source_dir")
- SOURCE_DIR=$2 ; shift 2 ;;
- "-target_dir")
- TARGET_DIR=$2
- ADM_DIR=$TARGET_DIR/var/log
- 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 9.0.0)" \
- --menu "\nWelcome to the Slackware package tool.\n\
- \nWhich option would you like?\n" 17 75 7 \
- "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" \
- "Setup" "Choose Slackware installation scripts to run again" \
- "Exit" "Exit Pkgtool" 2> $TMP/reply
- if [ ! $? = 0 ]; then
- rm -f $TMP/reply
- dialog --clear
- exit
- fi
- REPLY="`cat $TMP/reply`"
- rm -f $TMP/reply
- if [ "$REPLY" = "Exit" ]; then
- dialog --clear
- exit
- fi
- if [ "$REPLY" = "Setup" ]; then
- echo 'dialog --title "SELECT SYSTEM SETUP SCRIPTS" --item-help --checklist \
- "Please use the spacebar to select the setup scripts to run. Hit enter when you \
- are done selecting to run the scripts." 17 70 9 ' > $TMP/setupscr
- for script in $ADM_DIR/setup/setup.* ; do
- BLURB=`grep '#BLURB' $script | cut -b8-`
- if [ "$BLURB" = "" ]; then
- BLURB=""""
- fi
- echo " "`basename $script | cut -f2- -d .`" $BLURB "no" $BLURB \" >> $TMP/setupscr
- done
- echo "2> $TMP/return" >> $TMP/setupscr
- . $TMP/setupscr
- if [ ! "`cat $TMP/return`" = "" ]; then
- # Run each script:
- for script in `cat $TMP/return` ; do
- scrpath=$ADM_DIR/setup/setup.`echo $script | tr -d "`
- rootdevice="`mount | head -1 | cut -f 1 -d ' '`"
- ( color=on ; cd $TARGET_DIR ; . $scrpath / $rootdevice )
- done
- fi
- rm -f $TMP/return $TMP/setupscr
- continue
- fi # end Setup
- if [ "$REPLY" = "View" ]; then
- DEFITEM=""
- export DEFITEM
- dialog --title "SCANNING" --infobox "Please wait while \
- Pkgtool scans your system to determine which packages you have \
- installed and prepares a list for you." 0 0
- echo 'dialog $DEFITEM --item-help --menu "Please select the package you wish to view." 17 68 10 ' > $TMP/viewscr
- for name in `ls $ADM_DIR/packages` ; do
- pkg_name=`package_name $name`
- BLURB="`sed -n "/$pkg_name:/{s/\"//g;p;q;}" $ADM_DIR/packages/$name | cut -f 2- -d : | crunch`"
- # Let's have some backward compatibility with the interim beta (for now):
- if [ "$BLURB" = "" ]; then
- BLURB="`sed -n "/$name:/{s/\"//g;p;q;}" $ADM_DIR/packages/$name | cut -f 2- -d : | crunch`"
- fi
- echo " "$name" "$BLURB" "View information about package $name" \" >> $TMP/viewscr
- done
- echo "2> $TMP/return" >> $TMP/viewscr
- while [ 0 ]; do
- . $TMP/viewscr
- if [ ! "`cat $TMP/return`" = "" ]; then
- DEFITEM="--default-item `cat $TMP/return`"
- dialog --title "CONTENTS OF PACKAGE: `cat $TMP/return`" --no-shadow --textbox "$ADM_DIR/packages/`cat $TMP/return`" \
- 0 0 2> /dev/null
- else
- break
- fi
- done
- rm -f $TMP/return $TMP/viewscr $TMP/tmpmsg
- # This will clean up after most defective packages:
- 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." 0 0
- # end section
- cat << EOF > $TMP/rmscript
- dialog --title "SELECT PACKAGES TO REMOVE" --item-help --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." 20 75 11 \\
- EOF
- for name in `ls $ADM_DIR/packages` ; do
- pkg_name=`package_name $name`
- BLURB="`sed -n "/$pkg_name:/{s/\"//g;p;q;}" $ADM_DIR/packages/$name | cut -f 2- -d : | crunch`"
- # Let's have some backward compatibility with the interim beta (for now):
- if [ "$BLURB" = "" ]; then
- BLURB="`sed -n "/$name:/{s/\"//g;p;q;}" $ADM_DIR/packages/$name | cut -f 2- -d : | crunch`"
- fi
- echo " "$name" "$BLURB" off "Select/Unselect removing package $name" \" >> $TMP/rmscript
- done
- echo "2> $TMP/return" >> $TMP/rmscript
- if [ -L $LOG -o -r $LOG ]; then
- rm -f $LOG
- fi
- cat /dev/null > $LOG
- chmod 600 $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
- dialog --title "NO PACKAGES REMOVED" --msgbox "Hit OK to return \
- to the main menu." 5 40
- 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." 0 0
- fi
- rm -f $TMP/rmscript $TMP/return $TMP/tmpmsg $TMP/SeT*
- chmod 755 /
- chmod 1777 /tmp
- # No, return to the main menu:
- # exit
- elif [ "$REPLY" = "Floppy" ]; then
- dialog --title "SELECT FLOPPY DRIVE" --menu "Which floppy drive would \
- you like to install from?" \
- 11 70 4 \
- "/dev/fd0u1440" "1.44 MB first floppy drive" \
- "/dev/fd1u1440" "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.
- Separate 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*
- dialog --clear
- 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
- dialog --clear
- 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
- 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 $SOURCE_DIR,
- 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 [ ! $? = 0 ]; 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;
- }
- 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
- # If this directory is missing or contains no *.tgz files, bail.
- if [ ! -d $PACKAGE_DIR ]; then
- return 1
- fi
- if ls $PACKAGE_DIR/*.tgz 1> /dev/null 2> /dev/null ; then
- true
- else
- return 1
- fi
- #
- # look for tagfile for this series and copy into $TMP/tagfile
- #
- 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
- #
- # Do we need to follow a custom path to the tagfiles?
- #
- elif [ -r $TMP/SeTtagpath ]; then
- custom_path=`cat $TMP/SeTtagpath`
- short_path=`basename $PACKAGE_DIR`
- # If tagfile exists at the specified custom path, copy it over.
- if [ -r $custom_path/$short_path/tagfile ]; then
- cat $custom_path/$short_path/tagfile >> $TMP/tagfile
- else # well, I guess we'll use the default one then.
- if [ -r $PACKAGE_DIR/tagfile ]; then
- cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
- fi
- fi
- #
- # We seem to be testing for this too often... maybe this code should
- # be optimized a little...
- #
- 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
- if [ ! "$MAKETAG" = "" -a -r $PACKAGE_DIR/$MAKETAG ]; then # use alternate maketag
- sh $PACKAGE_DIR/$MAKETAG
- else
- sh $PACKAGE_DIR/maketag
- fi
- if [ -r $TMP/SeTnewtag ]; then
- mv $TMP/SeTnewtag $TMP/tagfile
- fi
- fi
- #
- # Protect tagfile from hacker attack:
- #
- if [ -r $TMP/tagfile ]; then
- chmod 600 $TMP/tagfile
- fi
- fi # ! "$DISK_SETS" = "disk"
- # It's possible that the tagfile was specified on the command line. If that's
- # the case, then we'll just override whatever we figured out up above.
- if [ ! "$USETAG" = "" ]; then
- cat $USETAG > $TMP/tagfile
- fi
- # If there's a catalog file present, use it to check for missing files.
- # If not, forget about that and install whatever's there.
- if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 -o -r $PACKAGE_DIR/package-list.txt ]; then
- if [ -r $PACKAGE_DIR/package-list.txt ]; then
- CATALOG_FILE=$PACKAGE_DIR/package-list.txt
- else
- CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
- fi
- if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
- if grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2>&1 ; then
- # First we check for missing packages...
- for PKGTEST in `grep "^CONTENTS:" $PACKAGE_DIR/$CATALOG_FILE | cut -f2- -d : 2> /dev/null` ; do
- # This is not a perfect test. (say emacs is missing but emacs-nox is not)
- if ls $PACKAGE_DIR/$PKGTEST*.tgz 1> /dev/null 2> /dev/null ; then # found something like it
- true
- else
- 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`" 17 67
- fi
- done # checking for missing packages
- # Now we test for extra packages:
- ALLOWED="`grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null`"
- for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
- BASE="`basename $PACKAGE_FILENAME .tgz`"
- BASE="`package_name $BASE`"
- if echo $ALLOWED | grep $BASE 1> /dev/null 2>&1 ; then
- true
- 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 recognize. 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`" 17 67
- rm -f $TMP/tmpmsg
- fi
- done
- fi
- fi
- fi # check for missing/extra packages
- # Install the packages:
- for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
- if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*.tgz" ]; then
- continue;
- fi
- if [ "$ASK" = "never" ]; then # install the package
- installpkg -root $TARGET_DIR -infobox -tagfile $TMP/tagfile $PACKAGE_FILENAME
- ERROR=$?
- elif [ "$ASK" = "tagfiles" ]; then
- installpkg -root $TARGET_DIR -menu -tagfile $TMP/tagfile $PACKAGE_FILENAME
- ERROR=$?
- else # ASK should be = always here, and that's how we'll treat it
- installpkg -root $TARGET_DIR -menu -ask -tagfile $TMP/tagfile $PACKAGE_FILENAME
- ERROR=$?
- fi
- # Check for abort:
- if [ "$ERROR" = "99" ]; then
- umount_the_source;
- chmod 755 $TARGET_DIR
- chmod 1777 $TARGET_DIR/tmp
- exit 1;
- fi
- done
- OUTTAHERE="false"
- if [ -r $PACKAGE_DIR/install.end ]; then
- OUTTAHERE="true"
- fi
- umount_the_source;
- if [ "$OUTTAHERE" = "true" ]; then
- return 1;
- fi
- }
- install_disk_set() { # accepts one argument: the series name in lowercase.
- SERIES_NAME=$1
- CURRENT_DISK_NUMBER="1";
- while [ 0 ]; do
- # Don't start numbering the directories until 2:
- if [ $CURRENT_DISK_NUMBER = 1 ]; then
- DISKTOINSTALL=$SERIES_NAME
- else
- DISKTOINSTALL=$SERIES_NAME$CURRENT_DISK_NUMBER
- fi
- install_disk $DISKTOINSTALL
- if [ ! $? = 0 ]; 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;
- }
- # /* main() */
- if [ "$DISK_SETS" = "disk" ]; then
- install_disk single_disk;
- ASK="always"
- else
- touch $TMP/tagfile
- chmod 600 $TMP/tagfile
- if echo $DISK_SETS | grep "#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
- cat << EOF > $TMP/tmpmsg
- --- Installing package 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 package 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
- dialog --clear
- fi
- chmod 755 $TARGET_DIR $TARGET_DIR/var $TARGET_DIR/usr
- chmod 1777 $TARGET_DIR/tmp
-
- installpkg
-
- 源码:
- #!/bin/sh
- # Copyright 1994, 1998, 2000 Patrick Volkerding, Concord, CA, USA
- # Copyright 2001 Slackware Linux, Inc., Concord, CA, 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.
- #
- # Sun Nov 26 12:38:25 CST 1995
- # Added patch from Glenn Moloney <glenn@physics.unimelb.edu.au> to allow
- # packages to be installed to directories other than /.
- #
- # Wed Mar 18 15:15:51 CST 1998
- # Changed $TMP directory to /var/log/setup/tmp, and chmod'ed it 700 to close
- # some security holes.
- # If installpkg encounters a problem, it will return a non-zero error code.
- # If it finds more than one problem (i.e. with a list of packages) you'll only
- # hear about the most recent one.
- # 1 = tar returned error code
- # 2 = failed 'gzip -l package'
- # 3 = does not end in .tgz
- # 4 = not a file
- # 99 = user abort from menu mode
- EXITSTATUS=0
- TAR=tar-1.13
- $TAR --help 1> /dev/null 2> /dev/null
- if [ ! $? = 0 ]; then
- TAR=tar
- fi
- if [ ! "`LC_MESSAGES=C $TAR --version`" = "tar (GNU tar) 1.13
- Copyright (C) 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.
- This is free software; see the source for copying conditions. There is NO
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- Written by John Gilmore and Jay Fenlason." ]; then
- echo "WARNING: pkgtools are unstable with tar > 1.13."
- echo " You should provide a "tar-1.13" in your \$PATH."
- sleep 5
- fi
- usage() {
- cat << EOF
- Usage: installpkg [options] package_name
- Installpkg is used to install a .tgz package like this:
- installpkg xf_bin.tgz
- options: -warn (warn if files will be overwritten, but do not install)
- -root /mnt (install someplace else, like /mnt)
- -infobox (use dialog to draw an info box)
- -menu (confirm package installation with a menu, unless
- the priority is [required] or ADD)
- -ask (used with menu mode: always ask if a package should be
- installed regardless of what the package's priority is)
- -priority ADD|REC|OPT|SKP (provide a priority for the entire
- package list to use instead of the priority in the
- tagfile)
- -tagfile /somedir/tagfile (specify a different file to use
- for package priorities. The default is "tagfile" in
- the package's directory)
- EOF
- }
- # Eliminate whitespace function:
- crunch() {
- while read FOO ; do
- echo $FOO
- done
- }
- package_name() {
- STRING=`basename $1 .tgz`
- # Check for old style package name with one segment:
- if [ "`echo $STRING | cut -f 1 -d -`" = "`echo $STRING | cut -f 2 -d -`" ]; then
- echo $STRING
- else # has more than one dash delimited segment
- # Count number of segments:
- INDEX=1
- while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do
- INDEX=`expr $INDEX + 1`
- done
- INDEX=`expr $INDEX - 1` # don't include the null value
- # If we don't have four segments, return the old-style (or out of spec) package name:
- if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
- echo $STRING
- else # we have four or more segments, so we'll consider this a new-style name:
- NAME=`expr $INDEX - 3`
- NAME="`echo $STRING | cut -f 1-$NAME -d -`"
- echo $NAME
- # cruft for later
- #VER=`expr $INDEX - 2`
- #VER="`echo $STRING | cut -f $VER -d -`"
- #ARCH=`expr $INDEX - 1`
- #ARCH="`echo $STRING | cut -f $ARCH -d -`"
- #BUILD="`echo $STRING | cut -f $INDEX -d -`"
- fi
- fi
- }
- # Parse options:
- MODE=install # standard text-mode
- while [ 0 ]; do
- if [ "$1" = "-warn" ]; then
- MODE=warn
- shift 1
- elif [ "$1" = "-infobox" ]; then
- MODE=infobox
- shift 1
- elif [ "$1" = "-menu" ]; then
- MODE=menu
- shift 1
- elif [ "$1" = "-ask" ]; then
- ALWAYSASK="yes"
- shift 1
- elif [ "$1" = "-tagfile" ]; then
- if [ -r "$2" ]; then
- USERTAGFILE="$2"
- elif [ -r "`pwd`/$2" ]; then
- USERTAGFILE="`pwd`/$2"
- else
- usage
- exit
- fi
- shift 2
- elif [ "$1" = "-priority" ]; then
- if [ "$2" = "" ]; then
- usage
- exit
- fi
- USERPRIORITY="$2"
- shift 2
- elif [ "$1" = "-root" ]; then
- if [ "$2" = "" ]; then
- usage
- exit
- fi
- ROOT="$2"
- shift 2
- else
- break
- fi
- done
- # Set the prefix for the package database directories (packages, scripts).
- ADM_DIR="$ROOT/var/log"
- # If the directories don't exist, "initialize" the package database:
- for PKGDBDIR in packages removed_packages removed_scripts scripts setup ; do
- if [ ! -d $ADM_DIR/$PKGDBDIR ]; then
- rm -rf $ADM_DIR/$PKGDBDIR # make sure it's not a symlink or something stupid
- mkdir -p $ADM_DIR/$PKGDBDIR
- chmod 755 $ADM_DIR/$PKGDBDIR
- fi
- done
- # Make sure there's a proper temp directory:
- TMP=$ADM_DIR/setup/tmp
- # If the $TMP directory doesn't exist, create it:
- if [ ! -d $TMP ]; then
- rm -rf $TMP # make sure it's not a symlink or something stupid
- mkdir -p $TMP
- chmod 700 $TMP # no need to leave it open
- fi
- # usage(), exit if called with no arguments:
- if [ $# = 0 ]; then
- usage;
- exit
- fi
- # If -warn mode was requested, produce the output and then exit:
- if [ "$MODE" = "warn" ]; then
- while [ -f "$1" ]; do
- echo "#### Scanning the contents of $1..."
- mkdir -p $TMP/scan$$
- ( cd $TMP/scan$$ ; $TAR xzf - install ) < $1 2> /dev/null
- if [ -r $TMP/scan$$/install/doinst.sh ]; then
- if cat $TMP/scan$$/install/doinst.sh | grep ' rm -rf ' 1>/dev/null 2>/dev/null ; then
- cat $TMP/scan$$/install/doinst.sh | grep ' rm -rf ' > $TMP/scan$$/install/delete
- echo "The following locations will be completely WIPED OUT to allow symbolic"
- echo "links to be made. (We're talking 'rm -rf') These locations may be files,"
- echo "or entire directories. Be sure you've backed up anything at these"
- echo "locations that you want to save before you install this package:"
- cat $TMP/scan$$/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'
- fi
- if [ -d $TMP/scan$$ ]; then
- ( cd $TMP/scan$$ ; rm -rf install ) 2> /dev/null
- ( cd $TMP ; rmdir scan$$ ) 2> /dev/null
- fi
- fi
- echo "The following files will be overwritten when installing this package."
- echo "Be sure they aren't important before you install this package:"
- ( $TAR tzvvf - ) < $1 | grep -v 'drwx'
- echo
- shift 1
- done
- exit
- fi
- # Main loop:
- for package in $* ; do
- # If someone left off the .tgz, try to figure that out:
- if [ ! -r "$package" -a -r "$package.tgz" ]; then
- package=$package.tgz
- fi
- # "shortname" isn't really THAT short... it's just the full name without ".tgz"
- shortname="`basename $package .tgz`"
- packagedir="`dirname $package`"
- # This is the base package name, used for grepping tagfiles and descriptions:
- packagebase="`package_name $shortname`"
- # Reject package if it does not end in '.tgz':
- if [ ! -r "`dirname $package`/$shortname.tgz" ]; then
- EXITSTATUS=3
- if [ "$MODE" = "install" ]; then
- echo "Cannot install $package: package does not end in .tgz"
- fi
- continue;
- fi
- # Determine package's priority:
- unset PRIORITY
- if [ "$USERPRIORITY" = "" ]; then
- if [ "$USERTAGFILE" = "" ]; then
- TAGFILE="`dirname $package`/tagfile"
- else
- TAGFILE="$USERTAGFILE"
- fi
- if [ ! -r "$TAGFILE" ]; then
- TAGFILE=/dev/null
- fi
- if grep "^$packagebase:" "$TAGFILE" | grep ADD > /dev/null 2> /dev/null ; then
- PRIORITY="ADD"
- elif grep "^$packagebase:" "$TAGFILE" | grep REC > /dev/null 2> /dev/null ; then
- PRIORITY="REC"
- elif grep "^$packagebase:" "$TAGFILE" | grep OPT > /dev/null 2> /dev/null ; then
- PRIORITY="OPT"
- elif grep "^$packagebase:" "$TAGFILE" | grep SKP > /dev/null 2> /dev/null ; then
- PRIORITY="SKP"
- fi
- else
- PRIORITY="$USERPRIORITY"
- fi
- if [ "$PRIORITY" = "ADD" ]; then
- #PMSG="Priority: [required]"
- PMSG="[required]"
- elif [ "$PRIORITY" = "REC" ]; then
- #PMSG="Priority: [recommended]"
- PMSG="[recommended]"
- elif [ "$PRIORITY" = "OPT" ]; then
- #PMSG="Priority: [optional]"
- PMSG="[optional]"
- elif [ "$PRIORITY" = "SKP" ]; then
- #PMSG="Priority: [skip]"
- PMSG="[skip]"
- else
- #PMSG="Priority: [unknown]"
- PMSG=""
- fi
- # Locate package description file:
- DESCRIPTION="/dev/null"
- # First check the usual locations outside the package, since this is faster:
- for file in $packagedir/disk* $packagedir/package_descriptions $packagedir/$shortname.txt $packagedir/$packagebase.txt ; do
- if grep "^$packagebase:" "$file" 1> /dev/null 2> /dev/null ; then
- DESCRIPTION="$file"
- elif grep "^$shortname:" "$file" 1> /dev/null 2> /dev/null ; then
- DESCRIPTION="$file"
- fi
- done
- # If we still don't have anything, look inside the package. This requires a costly untar.
- if [ "$DESCRIPTION" = "/dev/null" ]; then
- mkdir -p $TMP/scan$$
- ( cd $TMP/scan$$ ; $TAR xzf - install ) < $package 2> /dev/null
- if grep "^$packagebase:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
- DESCRIPTION="$TMP/scan$$/install/slack-desc"
- elif grep "^$shortname:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
- DESCRIPTION="$TMP/scan$$/install/slack-desc"
- fi
- fi
- # Simple package integrity check:
- if [ ! -f $package ]; then
- EXITSTATUS=4
- if [ "$MODE" = "install" ]; then
- echo "Cannot install $package: package is not a regular file"
- fi
- continue;
- fi
- gzip -l $package 1> /dev/null 2> /dev/null
- if [ ! "$?" = "0" ]; then
- EXITSTATUS=2 # failed gzip -l
- if [ "$MODE" = "install" ]; then
- echo "Cannot install $package: package is corrupt (failed 'gzip -l $package')"
- fi
- continue;
- fi
- # Collect the package information into a temp file:
- COMPRESSED=`gzip -l $package | grep -v uncompressed_name | crunch | cut -f 1 -d ' '`
- UNCOMPRESSED=`gzip -l $package | grep -v uncompressed_name | crunch | cut -f 2 -d ' '`
- COMPRESSED="`expr $COMPRESSED / 1024` K"
- UNCOMPRESSED="`expr $UNCOMPRESSED / 1024` K"
- # MD5SUM=`md5sum $package | cut -f 1 -d ' '`
- cat $DESCRIPTION | grep "^$packagebase:" | cut -f 2- -d : | cut -b2- 1> $TMP/tmpmsg$$ 2> /dev/null
- if [ "$shortname" != "$packagebase" ]; then
- cat $DESCRIPTION | grep "^$shortname:" | cut -f 2- -d : | cut -b2- 1>> $TMP/tmpmsg$$ 2> /dev/null
- fi
- # Adjust the length here. This allows a slack-desc to be any size up to 13 lines instead of fixed at 11.
- LENGTH=`cat $TMP/tmpmsg$$ | wc -l`
- while [ $LENGTH -lt 12 ]; do
- echo >> $TMP/tmpmsg$$
- LENGTH=`expr $LENGTH + 1`
- done
- echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED." >> $TMP/tmpmsg$$
- # For recent versions of dialog it is necessary to add \n to the end of each line
- # or it will remove repeating spaces and mess up our careful formatting:
- cat << EOF > $TMP/controlns$$
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- EOF
- paste -d "" $TMP/tmpmsg$$ $TMP/controlns$$ > $TMP/pasted$$
- rm -f $TMP/controlns$$
- mv $TMP/pasted$$ $TMP/tmpmsg$$
- # Emit information to the console:
- if [ "$MODE" = "install" ]; then
- if [ "$PMSG" = "" ]; then
- echo "Installing package $shortname... "
- else
- echo "Installing package $shortname ($PMSG)... "
- fi
- echo "PACKAGE DESCRIPTION:"
- cat $DESCRIPTION | grep "^$packagebase:" | uniq
- if [ "$shortname" != "$packagebase" ]; then
- cat $DESCRIPTION | grep "^$shortname:" | uniq
- fi
- elif [ "$MODE" = "infobox" -a ! "$PRIORITY" = "SKP" ]; then # install non-SKP infobox package
- dialog --title "Installing package ==>$shortname<== $PMSG" --infobox "`cat $TMP/tmpmsg$$`" 0 0
- elif [ "$MODE" = "menu" -a "$PRIORITY" = "ADD" -a ! "$ALWAYSASK" = "yes" ]; then # ADD overrides menu mode unless -ask was used
- dialog --title "Installing package ==>$shortname<== $PMSG" --infobox "`cat $TMP/tmpmsg$$`" 0 0
- elif [ "$MODE" = "menu" -a "$PRIORITY" = "SKP" -a ! "$ALWAYSASK" = "yes" ]; then # SKP overrides menu mode unless -ask used
- rm -f $TMP/tmpmsg$$
- continue # next package
- elif [ "$MODE" = "infobox" -a "$PRIORITY" = "SKP" -a ! "$ALWAYSASK" = "yes" ]; then # SKP overrides infobox mode, too
- rm -f $TMP/tmpmsg$$
- continue
- else # we must need a full menu:
- dialog --title "Package Name: ==>$shortname<== $PMSG" --menu "`cat $TMP/tmpmsg$$`" 0 0 3 \
- "Yes" "Install package $shortname" \
- "No" "Do not install package $shortname" \
- "Quit" "Abort software installation completely" 2> $TMP/reply$$
- if [ ! $? = 0 ]; then
- echo "No" > $TMP/reply$$
- fi
- REPLY="`cat $TMP/reply$$`"
- rm -f $TMP/reply$$ $TMP/tmpmsg$$
- if [ "$REPLY" = "Quit" ]; then
- exit 99 # EXIT STATUS 99 = ABORT!
- elif [ "$REPLY" = "No" ]; then
- continue # skip the package
- fi
- fi
- # Test tarball integrity, and make sure we're not installing files on top of existing symbolic links:
- $TAR tzf $package 1> $TMP/tmplist$$ 2> /dev/null
- TARERROR=$?
- if [ ! "$TARERROR" = "0" ]; then
- EXITSTATUS=1 # tar file corrupt
- if [ "$MODE" = "install" ]; then
- echo "Unable to install $package: tar archive is corrupt (tar returned error code $TARERROR)"
- fi
- rm -f $TMP/tmplist$$
- continue
- fi
- cat $TMP/tmplist$$ | grep -v "/$" | while read file ; do
- if [ -L "$ROOT/$file" ]; then
- rm -f "$ROOT/$file"
- fi
- done
- rm -f $TMP/tmplist$$
- # Write the package file database entry and install the package:
- echo "PACKAGE NAME: $shortname" > $ADM_DIR/packages/$shortname
- echo "COMPRESSED PACKAGE SIZE: $COMPRESSED" >> $ADM_DIR/packages/$shortname
- echo "UNCOMPRESSED PACKAGE SIZE: $UNCOMPRESSED" >> $ADM_DIR/packages/$shortname
- echo "PACKAGE LOCATION: $package" >> $ADM_DIR/packages/$shortname
- # echo "PACKAGE MD5SUM: $MD5SUM" >> $ADM_DIR/packages/$shortname
- echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$shortname
- cat $DESCRIPTION | grep "^$packagebase:" >> $ADM_DIR/packages/$shortname 2> /dev/null
- if [ "$shortname" != "$packagebase" ]; then
- cat $DESCRIPTION | grep "^$shortname:" >> $ADM_DIR/packages/$shortname 2> /dev/null
- fi
- echo "FILE LIST:" >> $ADM_DIR/packages/$shortname
- ( cd $ROOT/ ; $TAR -xzlUpvf - ) < $package >> $TMP/$shortname 2> /dev/null
- if [ "`cat $TMP/$shortname | grep '^./' | wc -l | tr -d ' '`" = "1" ]; then
- # Good. We have a package that meets the Slackware spec.
- cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
- else
- # Some dumb bunny built a package with something other than makepkg. Bad!
- # Oh well. Bound to happen. Par for the course. Fix it and move on...
- echo './' >> $ADM_DIR/packages/$shortname
- cat $TMP/$shortname | grep -v '^./$' | cut -b3- >> $ADM_DIR/packages/$shortname
- fi
- rm -f $TMP/$shortname
- if [ -x /sbin/ldconfig ]; then
- /sbin/ldconfig
- fi
- if [ -f $ROOT/install/doinst.sh ]; then
- if [ "$MODE" = "install" ]; then
- echo "Executing install script for $shortname..."
- fi
- ( cd $ROOT/ ; sh install/doinst.sh -install; )
- fi
- # Clean up the mess...
- if [ -d $ROOT/install ]; then
- if [ -r $ROOT/install/doinst.sh ]; then
- cp $ROOT/install/doinst.sh $ADM_DIR/scripts/$shortname
- chmod 755 $ADM_DIR/scripts/$shortname
- fi
- # /install/doinst.sh and /install/slack-* are reserved locations for the package system.
- ( cd $ROOT/install ; rm -f doinst.sh slack-* 1> /dev/null 2>&1 )
- rmdir $ROOT/install 1> /dev/null 2>&1
- fi
- # If we used a scan directory, get rid of it:
- if [ -d "$TMP/scan$$" ]; then
- rm -rf "$TMP/scan$$"
- fi
- rm -f $TMP/tmpmsg$$ $TMP/reply$$
- if [ "$MODE" = "install" ]; then
- echo
- fi
- done
- exit $EXITSTATUS
复制代码 |
|