mirror of
git://slackware.nl/current.git
synced 2025-01-09 05:24:36 +01:00
255 lines
8.5 KiB
Text
255 lines
8.5 KiB
Text
|
#!/bin/sh
|
||
|
# Copyright 2003 Slackware Linux, Inc., Concord, CA USA
|
||
|
# Copyright 2009 Patrick J. Volkerding, Sebeka, MN, 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.
|
||
|
#
|
||
|
|
||
|
# globals
|
||
|
|
||
|
TMP=/var/log/setup/tmp
|
||
|
|
||
|
# functions
|
||
|
|
||
|
get_pkg () {
|
||
|
# Download a package from a remote server.
|
||
|
# $1 == package series
|
||
|
# $2 == package base name
|
||
|
# $3 == additional options to the downloader (like, '-v')
|
||
|
# REMOTESVR points to the root of the slackware tree, and is composed of
|
||
|
# comma-separated values (protocol://remote_ipaddr[:portnumber],remote_root)
|
||
|
# like this example: 'ftp://192.168.0.22,/pub/slackware-12.1'
|
||
|
local REMOTE_URL=$(echo $REMOTESVR | cut -d, -f1)
|
||
|
local REMOTE_ROOT=$(echo $REMOTESVR | cut -d, -f2)
|
||
|
PKGBASE=$(basename $(basename $(basename $(basename $2 .tgz) .tbz) .tlz) .txz)
|
||
|
local PKGSIZE=`cat \`cat $TMP/SeTDS\`/${1}/${PKGBASE}.size`
|
||
|
# So Pat does not get a seizure ;-)
|
||
|
#dialog --title "FTP/HTTP DOWNLOAD ==> series '$1' <==" --infobox \
|
||
|
# "Downloading ${2} ($PKGSIZE) ..." 3 72
|
||
|
mkdir -p `cat $TMP/SeTDS`/${1}
|
||
|
cat /dev/null > `cat $TMP/SeTDS`/${1}/${2}
|
||
|
cat /dev/null > `cat $TMP/SeTDS`/${1}/${PKGBASE}.txt
|
||
|
wget $3 -c -P `cat $TMP/SeTDS`/${1} \
|
||
|
$REMOTE_URL$REMOTE_ROOT/slackware/${1}/${PKGBASE}.txt
|
||
|
wget $3 -c -P `cat $TMP/SeTDS`/${1} \
|
||
|
$REMOTE_URL$REMOTE_ROOT/slackware/${1}/${2}
|
||
|
if [ $? -ne 0 ]; then # One retry for aborted transfers
|
||
|
wget $3 -c -P `cat $TMP/SeTDS`/${1} \
|
||
|
$REMOTE_URL$REMOTE_ROOT/slackware/${1}/${2}
|
||
|
fi
|
||
|
if [ $? -ne 0 ]; then
|
||
|
dialog --title "FTP/HTTP DOWNLOAD FAILURE" --msgbox \
|
||
|
"Downloading ${2} FAILED." 5 72
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
zap_pkg () {
|
||
|
# Cleanup a download from a remote server.
|
||
|
# $1 == package series
|
||
|
# $2 == package name
|
||
|
PKGBASE=$(basename $(basename $(basename $(basename $2 .tgz) .tbz) .tlz) .txz)
|
||
|
cat /dev/null > `cat $TMP/SeTDS`/${1}/${2} # zero the local file
|
||
|
rm -f `cat $TMP/SeTDS`/${1}/${PKGBASE}.txt # remove the description file
|
||
|
}
|
||
|
|
||
|
updatetagfiles() {
|
||
|
if [ $MODE = newbie -o $MODE = full -o $MODE = terse ]; then
|
||
|
cat $TMP/series/series.in | while read series ; do
|
||
|
if [ -r $SRCPATH/$series/tagfile ]; then
|
||
|
mkdir -p $TMP/tagfiles/$series
|
||
|
cp -a $SRCPATH/$1/tagfile $TMP/tagfiles/$series
|
||
|
fi
|
||
|
done
|
||
|
elif [ $MODE = tagpath ]; then
|
||
|
cp -a `cat $TMP/SeTtagpath`/* $TMP/tagfiles
|
||
|
elif [ $MODE = custom ]; then
|
||
|
mkdir -p $TMP/tagfiles/$series
|
||
|
cp -a $SRCPATH/$series/tagfile`cat $TMP/SeTtagext` $TMP/tagfiles/$series/tagfile
|
||
|
elif [ $MODE = menu -o $MODE = expert ]; then
|
||
|
cat $TMP/series/series.in | while read series ; do
|
||
|
if [ $MODE = menu ]; then
|
||
|
if [ -r $SRCPATH/$series/maketag.ez ]; then
|
||
|
sh $SRCPATH/$series/maketag.ez
|
||
|
fi
|
||
|
else
|
||
|
if [ -r $SRCPATH/$series/maketag ]; then
|
||
|
sh $SRCPATH/$series/maketag
|
||
|
fi
|
||
|
fi
|
||
|
if [ -r $TMP/SeTnewtag ]; then
|
||
|
mkdir -p $TMP/tagfiles/$series
|
||
|
mv $TMP/SeTnewtag $TMP/tagfiles/$series/tagfile
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
errorcode() {
|
||
|
if [ $1 = 99 ]; then
|
||
|
# User aborted installation
|
||
|
exit 1
|
||
|
else
|
||
|
dialog --timeout 600 --title "installpkg error #$1" --msgbox \
|
||
|
"There was a fatal error attempting to install $2. The package may \
|
||
|
be corrupt, the installation media may be bad, one of the target \
|
||
|
drives may be full, or something else \
|
||
|
has caused the package to be unable to be read without error. You \
|
||
|
may hit enter to continue if you wish, but if this is an important \
|
||
|
required package then your installation may not work as-is." 11 70
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
installseries() {
|
||
|
if [ -d $SRCPATH/$1 ]; then
|
||
|
# First, make sure our tagfiles are in order:
|
||
|
if [ ! -r $TMP/tagfiles/$1/tagfile -a ! $MODE = full -a ! $MODE = terse ]; then
|
||
|
updatetagfiles $1
|
||
|
fi
|
||
|
# First, make sure there's at least one package:
|
||
|
if ! ls $SRCPATH/$series/*.t?z 1> /dev/null 2> /dev/null ; then
|
||
|
return 1
|
||
|
fi
|
||
|
if [ "$MODE" = "terse" ]; then
|
||
|
echo " >> Installing package series $(echo $1 | tr [a-z] [A-Z])"
|
||
|
else
|
||
|
dialog --infobox "
|
||
|
Installing package series ==>$1<==
|
||
|
" 5 45
|
||
|
fi
|
||
|
sleep 1
|
||
|
# Install the package series:
|
||
|
for package in $SRCPATH/$series/*.t?z ; do
|
||
|
if [ "$MODE" = "full" ]; then # install the package
|
||
|
[ "x$REMOTESVR" != "x" ] && get_pkg $series $(basename $package) '-q'
|
||
|
installpkg -root $ROOTDIR -infobox -priority ADD $package
|
||
|
ERROR=$?
|
||
|
elif [ "$MODE" = "terse" ]; then # install the package with terse description
|
||
|
[ "x$REMOTESVR" != "x" ] && get_pkg $series $(basename $package) '-q'
|
||
|
installpkg -root $ROOTDIR -terse -priority ADD $package
|
||
|
ERROR=$?
|
||
|
else
|
||
|
if [ "x$REMOTESVR" != "x" ]; then
|
||
|
grep "^$(echo $(basename $package) | rev | cut -f4- -d '-' | rev):" \
|
||
|
$TMP/tagfiles/$1/tagfile | grep -qw SKP \
|
||
|
|| get_pkg $series $(basename $package) '-q'
|
||
|
fi
|
||
|
installpkg -root $ROOTDIR -menu -tagfile $TMP/tagfiles/$1/tagfile $package
|
||
|
ERROR=$?
|
||
|
fi
|
||
|
if [ ! $ERROR = 0 ]; then
|
||
|
errorcode $ERROR $package
|
||
|
fi
|
||
|
[ "x$REMOTESVR" != "x" ] && zap_pkg $series $(basename $package)
|
||
|
done
|
||
|
# A "README_SPLIT.TXT" file means the series continues on another CD:
|
||
|
if [ -r $SRCPATH/$series/README_SPLIT.TXT -o -r $SRCPATH/$series/readme_split.txt ] ; then
|
||
|
# Defer until later.
|
||
|
echo $1 >> $TMP/series/series.out
|
||
|
fi
|
||
|
else # requested, but not on media. defer until later.
|
||
|
echo $1 >> $TMP/series/series.out
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
remount_disc() {
|
||
|
umount $DEVICE 2> /dev/null
|
||
|
eject -s $DEVICE 2> /dev/null
|
||
|
dialog --title "INSERT NEXT DISC" --menu "Please insert the next Slackware disc and \
|
||
|
press ENTER to continue installing packages." \
|
||
|
10 62 2 \
|
||
|
"Continue" "Install packages from the next disc" \
|
||
|
"Quit" "Quit installing packages and finish up" 2> $TMP/reply
|
||
|
if [ ! $? = 0 ]; then
|
||
|
REPLY="Quit"
|
||
|
else
|
||
|
REPLY="`cat $TMP/reply`"
|
||
|
fi
|
||
|
rm -f $TMP/reply
|
||
|
if [ "$REPLY" = "Quit" ]; then
|
||
|
errorcode 99
|
||
|
fi;
|
||
|
# Recently, mounting has become unreliable at this point.
|
||
|
# Not sure if it's udev, or what, but we have seen
|
||
|
# mount: /dev/sr0: unknown device
|
||
|
# We will attempt to mount several times to attempt to make
|
||
|
# this less likely to fail.
|
||
|
for attempt in 1 2 3 4 5 6 7 8 9 10 11 ; do
|
||
|
mount $DEVICE $MOUNTPOINT 2> /dev/null
|
||
|
if [ $? = 0 ]; then
|
||
|
break
|
||
|
fi
|
||
|
sleep 7
|
||
|
done
|
||
|
if [ "$MODE" = "terse" ]; then
|
||
|
setterm -background cyan -foreground black -blank 0
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# /* main */
|
||
|
|
||
|
# Process command line:
|
||
|
if [ $# -gt 0 ]; then # there are arguments to the command
|
||
|
while [ $# -gt 0 ]; do
|
||
|
case "$1" in
|
||
|
"--promptmode")
|
||
|
MODE=`echo $2` ; shift 2 ;;
|
||
|
"--srcpath")
|
||
|
SRCPATH=`echo $2` ; shift 2 ;;
|
||
|
"--mountpoint")
|
||
|
MOUNTPOINT=`echo $2` ; shift 2 ;;
|
||
|
"--target")
|
||
|
ROOTDIR=`echo $2` ; shift 2 ;;
|
||
|
"--device")
|
||
|
DEVICE=`echo $2` ; shift 2 ;;
|
||
|
"--series")
|
||
|
SERIES=`echo $2` ; shift 2 ;;
|
||
|
"--net")
|
||
|
REMOTESVR=`echo $2` ; shift 2 ;;
|
||
|
*)
|
||
|
echo "Unrecognized option $1" ; shift 1 ;;
|
||
|
esac
|
||
|
done
|
||
|
else
|
||
|
exit 1;
|
||
|
fi
|
||
|
# Empty out temporary directories:
|
||
|
rm -rf $TMP/series $TMP/tagfiles
|
||
|
mkdir -p $TMP/series $TMP/tagfiles
|
||
|
# Create initial list of series to install:
|
||
|
for series in `echo $SERIES | tr "#" " "` ; do
|
||
|
echo $series | tr A-Z a-z >> $TMP/series/series.in
|
||
|
done
|
||
|
# Main loop:
|
||
|
while [ -r $TMP/series/series.in ]; do
|
||
|
cat $TMP/series/series.in | while read series ; do
|
||
|
installseries $series;
|
||
|
done
|
||
|
rm -f $TMP/series/series.in
|
||
|
if [ -r $TMP/series/series.out ]; then
|
||
|
mv $TMP/series/series.out $TMP/series/series.in
|
||
|
if [ "$DEVICE" = "noremount" ]; then
|
||
|
# we've done all we can here
|
||
|
break
|
||
|
else # see if there's anything we need on the next disc
|
||
|
remount_disc
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
|