diff options
Diffstat (limited to 'source/installer/sources/initrd/usr/lib/setup/slackinstall')
-rwxr-xr-x | source/installer/sources/initrd/usr/lib/setup/slackinstall | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/source/installer/sources/initrd/usr/lib/setup/slackinstall b/source/installer/sources/initrd/usr/lib/setup/slackinstall new file mode 100755 index 00000000..1d16abde --- /dev/null +++ b/source/installer/sources/initrd/usr/lib/setup/slackinstall @@ -0,0 +1,254 @@ +#!/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 + |