#!/bin/sh
#
# doinstall					System Installation Utility
# Version: 1.8.7
# Last changed: 18.05.94
#
# Copyright (c) Ralf Flaxa, Linux Support Team Erlangen,  1993, 1994
#

# Environment:
# ------------
export PATH="$PATH:/sbin:/root/bin:/root/sbin:/root/usr/bin:/root/usr/sbin:/root/usr/local/bin:."
umask 022

# Environment sensitive Variables:
# --------------------------------
: INSTMEDIA=${INSTMEDIA=floppy}
: INSTDEV=${INSTDEV=/dev/fd0}
: INSTROOT=${INSTROOT=/root}
: INSTSRC=${INSTSRC=/mnt}
: INSTFLAGS=${INSTFLAGS=-debug}
: INSTTYPE=${INSTTYPE=}
: TASTATUR=${TASTATUR=}

# Supported Constants:
# --------------------
BADFDISK=  # set this true, if you have problems with fdisk -l (ST-02 Users)
TESTHARDDISKS="/dev/hda /dev/hdb /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh "
VALIDHARDDISKS=
RAWPARTLIST=
PARTLIST=
ROUTE=/sbin/route
IFCONFIG=/sbin/ifconfig
# USEDIALOG=
MSG=/tmp/.message
ERRMSG=/tmp/.error
TEXTCONSTANTS=/usr/lib/LST/libLSTstrings
PAGER=more
EXPART="/dev/hda1"

# String Constants:
# -----------------
# ein erster Versuch fr Multi-Language Support ...
# nur partiell verwirklicht
. $TEXTCONSTANTS
YES=j
NO=n
CLEAR="c"
REVON="[7m"
REVOFF="[27m"
BEEPTONE=''
BASIS="$MSELNOT"
XBASIS="$MSELNOT"
TINYX="$MSELNOT"
NETWORK="$MSELNOT"
TEXT="$MSELNOT"
TEX="$MSELNOT"
DEVELOP="$MSELNOT"
DOKU="$MSELNOT"
SRC="$MSELNOT"
MISC="$MSELNOT"
XAPPL="$MSELNOT"
XDEVELO="$MSELNOT"
XEMACS="$MSELNOT"
GRAFIK="$MSELNOT"
PATCH="$MSELNOT"
UPDA18="$MSELNOT"

#
# Functions
#

#
# PrintUsage () 
#
#       we have no man-page yet, so we give a little help here
#
PrintUsage()
{
	echo
	echo "doinstall                                     LST Installation Utility"
	echo "Version: 1.8.7"
	echo "Last changed: 18.05.94"
	echo "Copyright (c) Ralf Flaxa, Linux Support Team Erlangen,  1993, 1994"
	echo
	echo "Aufruf: "
	echo "doinstall [-config CONFIGFILE] [FLAGS] [PART [MOUNTLIST]] [-args ARGUMENTS]"
	echo
	echo "  -config CONFIGFILE   liest Konfiguration aus der Datei CONFIGFILE ein"
        echo "mgliche Flags :"
        echo "  -expert              allow special features and be less strict"
        echo "  -debug               allow verbose debug messages"
        echo "  -usedialog           use dialog for input/output"
	echo "sonstige Parameter : (fhren automatisch zum nicht-interaktiven Modus)"

	echo "PART wird als Root-Partition der Installation genommen, optional gefolgt von" 
	echo "Paaren \"Partition Mountpunkt\", die gemountet werden sollen."
	echo "Alle Optionen, die -args folgen, werden unverndert an sysinstall bergeben"
	echo
	exit 1
}

Seen()
{
	if [ "$USEDIALOG" = "true" ]; then
		if [ ! -f $MSG ]; then
			touch $MSG
		fi
		cat $MSG | cut -c 1-70 > $MSG.new
		mv $MSG.new $MSG
		zeilen=`wc $MSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 5`
		fi
		dialog --msgbox "`cat $MSG`" $zeilen 75
	else
		cat $MSG
		echo
		echo -n "$MKEYPRESS"
		read dummy
	fi
	rm -f $MSG
}

#
# LogMsg ( text_saved_for_postponed_display )
#
#	Collect Text for postponed display
#
LogMsg()
{
	if [ $# -gt 0 -a "$1" = '-new' ]; then
		rm -f $MSG
		shift 1
	fi
	if [ $# -gt 0 -a "$1" = '-n' ]; then
		shift 1
		echo -n "$@" >> $MSG
	else
		echo "$@" >> $MSG
	fi
}

#
# LogErr ( error_message_saved_for_postponed_display )
#
#	Collect Error Message for postponed display
#
LogErr()
{
	if [ $# -gt 0 -a "$1" = '-new' ]; then
		rm -f $ERRMSG
		shift 1
	fi
	if [ $# -gt 0 -a "$1" = '-n' ]; then
		shift 1
		echo -n "$@" >> $ERRMSG
	else
		echo "$@" >> $ERRMSG
	fi
}

ShowInfo()
{
	if [ "$USEDIALOG" = "true" ]; then
		if [ ! -f $MSG ]; then
			touch $MSG
		fi
		cat $MSG | cut -c 1-70 > $MSG.new
		mv $MSG.new $MSG
		zeilen=`wc $MSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 5`
		fi
		dialog --infobox "`cat $MSG`" $zeilen 75
	else
		cat $MSG
		echo
	fi
	rm -f $MSG
}

PageMessage()
{
	# bad hack, damit er hier kein dialog benutzt, da
	# bei Pfeiltaste runter immer "got a segmentation violation"
	if [ "$USEDIALOG" = "ugly_hack" ]; then
		if [ ! -f $MSG ]; then
			touch $MSG
		fi
		cat $MSG | cut -c 1-70 > $MSG.new
		mv $MSG.new $MSG
		zeilen=`wc $MSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 5`
		fi
		dialog --textbox $MSG $zeilen 75
		if [ $? = 255 ]; then
			exit
		fi
	else
		echo "$CLEAR"
		cat $MSG
		echo
		echo -n "$MKEYPRESS"
		read dummy
	fi
	rm -f $MSG
}


#
# Error ( Errorstring )
#
#       Beep and output an error message
Error()
{
	if [ "$USEDIALOG" = "true" ]; then
		if [ ! -f $ERRMSG ]; then
	 		touch $ERRMSG
		fi
		cat $ERRMSG | cut -c 1-70 > $ERRMSG.new
		mv $ERRMSG.new $ERRMSG
		zeilen=`wc $ERRMSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 5`
		fi
		echo $BEEPTONE
		dialog --title "Fehler" --msgbox "`cat $ERRMSG `" $zeilen 75
	else
	        echo $BEEPTONE $REVON
	   	echo -n "$MERROR "
	        echo '!!!'
	        cat $ERRMSG
	        echo $REVOFF
	        Seen
	fi
	rm -f $ERRMSG
}

#
# Warning ( Warningmessage )
#
#       Beep and output a warning message
Warning()
{
	if [ "$USEDIALOG" = "true" ]; then
		if [ ! -f $ERRMSG ]; then
	 		touch $ERRMSG
		fi
		cat $ERRMSG | cut -c 1-70 > $ERRMSG.new
		mv $ERRMSG.new $ERRMSG
		zeilen=`wc $ERRMSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 5`
		fi
		echo $BEEPTONE
		dialog --title "Warnung" --infobox "`cat $ERRMSG `" $zeilen 75
	else
	        echo $BEEPTONE $REVON
	        echo -n "$MWARNING"
	        echo '!!!'
	        echo -n "$@"
	        echo $REVOFF
	fi
	rm -f $ERRMSG
}

debug()
{
	if [ "$DEBUG" != "" ]; then
		echo "debug: $@" 
	fi
}

#
# domount ( Partition, Mountpoint, Type )
#
#	We could call that "Smartmount ;-) "
#
domount()
{
	RETRY=
	if [ "$1" = '-retry' ]; then
		RETRY=true
		shift 1
	fi

	DUMMYTYPE=$MOUNTTYPE

	if [ $# -gt 0 ]; then
		DUMMYPART=$1
	fi
	if [ $# -gt 1 ]; then
		DUMMYPOINT=$2
	fi
	if [ $# -gt 2 ]; then
		DUMMYTYPE=$3
	fi

	if [ "$MOUNTTYPE" = "" -o "$DUMMYTYPE" = "" ]; then
		DUMMYTYPE=ext2
	fi

	while [ 1 ]; do
		for k in $DUMMYTYPE ext2 minix msdos hpfs ext ; do
			umount $DUMMYPART > /dev/null 2>&1
			umount $DUMMYPOINT > /dev/null 2>&1
			debug "Teste mount -t $k $DUMMYPART $DUMMYPOINT ..."
			mount -t $k $DUMMYPART $DUMMYPOINT > /dev/null 2>&1 
			MNTSTAT=$? 
			if [ $MNTSTAT = 0 ]; then
				break
			fi
		done
		if [ $MNTSTAT = 0 ]; then
			break
		else
			cat << EOF > $ERRMSG
Fehler ! Kann $DUMMYPART nicht mounten  !

Mgliche Fehlerursachen:
A) Diese Partition existiert nicht (Eingabefehler)
   |--> Partitionen anzeigen lassen (p) und neu versuchen 
B) Falscher Partitionstyp (mu Linux native, DOS oder HPFS sein)
   |--> falsche Partition, weiter siehe A)
   |--> wenn falscher Typ (unwahrscheinlich), dann
        mit fdisk (a) verndern und neu booten
C) Ungltiges Filesystem (nicht formatiert)
   |--> Linux Filesystem anlegen (f) und erneut mounten (m)
D) Partition ist bereits gemountet oder Mountpunkt bereits belegt
   |--> die Partition unmounten, die den Konflikt verursacht.
EOF
			Error
			if [ "$RETRY" = "" ]; then
				return 1
			fi
			LogMsg -new "Wollen Sie es nochmal mit genaueren Angaben versuchen ? "
			Askyesno -default j
			if [ "$ANSWER" = "n" ]; then
				return 1
			fi
			LogMsg -new "Geben Sie die Partition ein, die Sie mounten wollen: "
			Askstring
			DUMMYPART=$STRING
			LogMsg -new "Geben Sie den Dateisystem-Typ der Partition an" 
			LogMsg "(z.B. ext2,msdos,minix,...)" 
			Askstring
			DUMMYTYPE=$STRING
			LogMsg -new "Geben Sie den Mountpunkt im Dateisystem an,"
			LogMsg "an den das Dateisystem eingehngt werden soll." 
			Askstring
			DUMMYPOINT=$STRING
		fi
	done
	DUMMYTYPE=$k
	if [ $MNTSTAT = 0 ]; then
		# mount successful , log it
		if [ "$DUMMYPOINT" = "$INSTROOT" ]; then
			echo "$DUMMYPART	/	$DUMMYTYPE	defaults" > $INSTROOT/fstab.tmp
			echo "/proc	/proc	proc	defaults" >> $INSTROOT/fstab.tmp
			if [ "$SWAPLINE" != "" ]; then
				echo "$SWAPLINE" >> $INSTROOT/fstab.tmp
			fi	
			mkdir -p $INSTROOT/proc
			chmod 755 $INSTROOT/proc
		elif [ "$INSTROOT" != "" -a "$INSTROOT" != "/" ]; then
			# calculate newdir ... only works if $INSTROOT=/root !
			# That's bad, but how can we erase a leading substring
			# that contains slashes ? We only have ash :-(
			NEWDIR=`echo "$DUMMYPOINT" | sed "s/\/root//" `
			if [ "$NEWDIR" = "$DUMMYPOINT" ]; then
				debug "not written in fstab.tmp because not in tree of $INSTROOT"
			else
				echo "$DUMMYPART $NEWDIR $DUMMYTYPE	defaults" >> $INSTROOT/fstab.tmp
				debug "written in fstab.tmp because in tree of $INSTROOT"
			fi
		fi
	fi
}


# ferngesteuerter fdisk Aufruf zum ermitteln gltiger Partitionen
diskpartlist()
{
(fdisk $1 2>&1 << EOF
p
q
EOF
) 
}

setvalidharddisks()
{
	export VALIDHARDDISKS=
	export HARDDISKINFOLIST=

	if [ "$BADFDISK" = "" ]; then
		debug "Man traut dem fdisk -l ..."
		HARDDISKINFOLIST=`fdisk -l 2>&1 | fgrep "Disk" `
		debug "fdisk -l Outputs HARDDISKINFOLIST:"
		debug "$HARDDISKINFOLIST"
		for harddisk in ` echo "$HARDDISKINFOLIST" | cut -d' ' -f 2 | sed 's/://' ` ; do
			VALIDHARDDISKS=" $VALIDHARDDISKS $harddisk "
		done
	else
		debug "Man traut dem fdisk -l nicht ..."
		debug "Es wird nach folgenden Festplatten gesucht: "
		debug "$TESTHARDDISKS"
		for harddisk in ` echo "$TESTHARDDISKS" ` ; do
			status=""
			debug "Teste Festplatte $harddisk ..."
			status=" ` diskpartlist $harddisk 2>&1 ` "
			debug "status:"
			debug $status
			debug "===================="
			dummy=` echo "$status" | fgrep "Unable" `

			if [ "$dummy" != "" ]; then
				debug "Festplatte $harddisk nicht vorhanden !"
			else
				debug "Festplatte $harddisk vorhanden"
				debug "Nehme $harddisk in Liste der gltigen Festplatten auf"
				VALIDHARDDISKS=" $VALIDHARDDISKS $harddisk "
				HARDDISKINFOLIST=" $HARDDISKINFOLIST "` echo "$status" | fgrep "Disk" `
			fi
		done
	fi
	debug "gltige Festplatten :"
	debug "$VALIDHARDDISKS"
	export VALIDHARDDISKS
	export HARDDISKINFOLIST

}

setnewpartlists()
{
	debug "Es wird die Liste gltiger Partitionen ermittelt: "
	export RAWPARTLIST=
	> /tmp/RAWPARTLIST
	export PARTLIST=
	> /tmp/PARTLIST
	
	for disk in ` echo "$VALIDHARDDISKS" ` ; do
		diskpartlist $disk >> /tmp/RAWPARTLIST
	done
	RAWPARTLIST=`cat /tmp/RAWPARTLIST`

	echo "Partition Boot  Begin   Start    Ende Size(KB)  Id  Partitionstyp" > /tmp/PARTLIST
	fgrep "/dev/" /tmp/RAWPARTLIST | sed '/Disk/d' | sed '/Using/d' >> /tmp/PARTLIST 
	PARTLIST=`cat /tmp/PARTLIST`
	VALIDPARTS=` cat /tmp/PARTLIST | fgrep '/dev/' | cut -c 1-10 `
	export RAWPARTLIST
	export PARTLIST
	export VALIDPARTS
} 

Showdetected()
{
	debug " "
	debug "VALIDHARDDISKS:"
	debug "==============="
	debug "$VALIDHARDDISKS"
	debug "==============="
	debug " "
	debug "HARDDISKINFOLIST:"
	debug "================="
	debug "$HARDDISKINFOLIST"
	debug "================="
	debug " "
	debug "RAWPARTLIST:"
	debug "============"
	debug "$RAWPARTLIST"
	debug "============"
	debug " "
	debug "PARTLIST:"
	debug "========="
	debug "$PARTLIST"
	debug "========="
	Seen
}

#
# showpartlist ( [TYPE [TYPE]...] )
# 
#	Display List of Partitions [ of Type TYPE ]
#
showpartlist()
{
	debug "showpartlist called ..."
	if [ $# = 0 ]; then
		echo "$PARTLIST" 
		return 0
	fi
	while [ 1 ]; do
		debug "showpartlist: entering display loop ..."
		if [ $# = 0 ]; then
			return 0
		elif [ "$1" = "Linux" ]; then
			echo "$PARTLIST" | fgrep "Linux native" 
			shift 1
		elif [ "$1" = "Swap" ]; then
			echo "$PARTLIST" | fgrep "Linux swap"
			shift 1
		elif [ "$1" = "DOS" ]; then
			echo "$PARTLIST" | fgrep "DOS" 
			shift 1
		elif [ "$1" = "HPFS" ]; then
			echo "$PARTLIST" | fgrep "HPFS" 
			shift 1
		elif [ "$1" = "gemounteten" ]; then
			mount | sed '/type proc/d'
			shift 1
		elif [ "$1" = "mountbaren" ]; then
			debug "looking for mountable partitions ..."
			for dummypart in ` echo "$VALIDPARTS" ` ; do
				dummypartline=`echo "$PARTLIST" | fgrep "$dummypart" `
				debug "testing for /$dummypart/ ..."
				if mount | fgrep "$dummypart" > /dev/null 2>&1 ; then
					# Skip mounted Partitions
					debug "No ! $dummypart is mounted ..."
					continue
				elif echo "$PARTLIST" | fgrep "Linux native" | fgrep "$dummypart" > /dev/null 2>&1 ; then
					# Output Linux Partition
					echo "$dummypartline" 
				elif echo "$PARTLIST" | fgrep "DOS" | fgrep "$dummypart" > /dev/null 2>&1 ; then
					# Output DOS Partitions
					echo "$dummypartline" 
				elif echo "$PARTLIST" | fgrep "HPFS" | fgrep "$dummypart" > /dev/null 2>&1 ; then
					# Output HPFS Partitions
					echo "$dummypartline" 
				else
					# nothing, that we can mount ...
					debug "no, $dummypart not mountable for us ..."
				fi
			done
			shift 1
		else
			return 1
		fi
	done
}


#
# Partdisplay ( TYPE )
#
#	Displays Partitions of Type
#
Partdisplay()
{
	if [ $# = 0 ]; then
		echo "Liste der Partitionen ------------------------------------------------------" 
		showpartlist
		return 0
	fi
	while [ 1 ]; do
		if [ $# = 0 ]; then
			return 0
		fi
		case $1 in
		Linux | DOS | Swap | HPFS | gemounteten | mountbaren )
			echo "Liste der $1-Partitionen -------------------------------------------" 
			if [ "$1" != "gemounteten" ]; then
				echo "$PARTLIST" | fgrep "Partitionstyp" 
			else
				echo "Partition Mountpunkt Typ" 
			fi
			showpartlist $1
			shift 1
			;;
		*)
			return 1
			;;
		esac
		echo 
	done
} 

Runfdisk()
{
	cat << EOF > $MSG

Folgende Festplatten wurden erkannt:
$VALIDHARDDISKS

Welche Festplatte wollen Sie partitionieren ?

EOF
	Askstring
	CURDISK=$STRING
	fdisk $CURDISK || return 1
	cat << EOF > $MSG

Wenn Sie Vernderungen vorgenommen haben und fdisk mit "w" 
verlassen haben, sollten Sie Ihren PC jetzt erneut booten.

Einverstanden ?

EOF
	Askyesno -default j
	if [ "$ANSWER" = "j" ]; then
		sync
		reboot
	fi
}

domkfs()
{
	cat << EOF > $MSG

Wir empfehlen, beim Formatieren auf defekte Sektoren zu prfen.
Dies dauert zwar etwas lnger, ist aber sicherer.

Einverstanden  ?

EOF
	Askyesno -default j
	if [ "$ANSWER" = "n" ]; then 
		check=""
	else
		check='-c'
	fi
	cat << EOF > $MSG

       Das Formatieren des Dateisystems kann einige Zeit dauern.

                       Bitte warten Sie...

EOF
	echo $CLEAR
	ShowInfo
	mke2fs $check $1 > /dev/null 2>&1 || echo "mke2fs failed" ; return 1
}

testexist()
{
	if [ $# = 0 ]; then
		status="Sie haben keine gltige Partition angegeben"
		return 1
	fi
	# Test ob gltiges Device
	if [ ! -b $1 ]; then
		status="$1 ist ein ungltiges Device"
		return 1
	fi
	if [ "`echo $1 | cut -c9`" = "" ]; then
		status="$1 ist keine gltige Partition"
		return 1
	fi
	 
	if [ "` echo $PARTLIST | fgrep $1 `" != "" ]; then
		status="`showpartlist | fgrep $1 `"
		return 0
	else
		status="$1 ist nicht in der Liste der gltigen Partitionen"
		return 1
	fi
	# Should never reach this point ...
	return 1
}

testmountable()
{
	if [ "$1" = "" ]; then
		status="Sie haben entweder keine Partition oder keinen Mountpunkt angegeben"
		return 1
	fi
	dummy="`mount | fgrep $1 `"
	if [ "$dummy" = "" ]; then
		status="`showpartlist | fgrep $1 `"
		return 0 
	else
		status="$dummy"
		return 1 
	fi
}


#
# partsize ( PARTITION )
#
#	Displays size of PARTITION or 0 if not a valid Partition
partsize()
{
	dummy=` showpartlist | fgrep $1 | cut -c38-45 `
	if [ "$dummy" = "" ]; then
		echo "0"
	else
		echo $dummy
	fi
}

# Supported Linux, Swap, DOS, HPFS
#
#	returns Id in status
#
testtype()
{
	status=` showpartlist | fgrep $2 | cut -c 49-50 `

	if [ "$1" = "Linux" ]; then
		if [ "$status" = "83" ]; then
			return 0
		elif [ "$status" = "81" ]; then
			LogErr -new "Sie sollten besser den Typ 83 ( Linux native ) verwenden"
			Warning
			return 0
		else
			return 1
		fi
	elif [ "$1" = "Swap" ]; then
		if [ "$status" = "82" ]; then
			return 0
		else
			return 1
		fi
	elif [ "$1" = "HPFS" ]; then
		if [ "$status" = "7" ]; then
			return 0
		else
			return 1
		fi
	elif [ "$1" = "DOS" ]; then
		if [ "$status" = "1" -o "$status" = "4" -o "$status" = "6" ]; then
			return 0
		else
			return 1
		fi
	else
		LogErr -new "testtype mit falscher Option aufgerufen"
		Error
		return 1
	fi
}

Parttest()
{
	debug "Parttest called ..."
	while [ 1 ]; do
		if [ $# = 0 ]; then
			status="Sie haben keine Partition angegeben"
			debug "Parttest: status = $status"
			return 1
		fi
		
		case $1 in
		type )
			debug "Parttest: called with option $1 ..."
			debug "Parttest: Calling testexist $3 ..."
			testexist $3 || return 1
			debug "Parttest: Calling testtype $2 $3 ..."
			testtype $2 $3 || return 1
			return 0
			;;
		valid | mountbar | gemountet | size )
			debug "Parttest: called with option $1 ..."
			debug "Parttest: Calling testexist $2 ..."
			testexist $2 || return 1
			if [ "$1" = "valid" ]; then
				return 0
			fi
			;;
		* )  
			debug "Parttest: $1 is no valid Option ..."
			status="Sie haben keine gltige Option von Parttest aufgerufen"
			return 1 
			;;
		esac
	
		if [ "$1" = "size" ]; then
			debug "Parttest: Calling partsize $2 ..."
			partsize $2 || return 1
			return 0
		fi

		debug "Calling testmountable ..."

		testmountable $2 
		dummy=$?

		if [ "$dummy" != 0 ]; then
			status="Konflikt mit folgendem Mounteintrag: $status"
			return 1
		else
			if [ "$1" = "gemountet" ]; then
				status="$2 ist nicht gemountet"
				return 1
			elif [ "$1" = "mountbar" ]; then
				status="$2 ist mountbar"
				return 0
			fi
		fi
		LogErr -new "Parttest, interner Fehler !"
		Error
	done

}

Partsetup()
{
	NEWPART=
	candnum=0

	debug "Partsetup called"

	if [ $# = 0 -a "$EXPERT" = "" ]; then
		# try to determine a good NEWPART
		debug "Partsetup: no arguments, try to be smart ..."
		# first we need valid Linux Partitions ....
		Partdisplay Linux > $MSG
		candnum="`Partdisplay Linux | fgrep "/dev/" | wc -l `"
		# Asking for mountable Partitions with Type Linux
		if [ $candnum -gt 0 ]; then
			# We have candidats, ask smartly ...
			debug "$candnum Mglichkeiten gefunden"
			if [ "$candnum" = "1" ]; then
				LogMsg "Partition formatieren  ? "
				Askyesno
				if [ "$ANSWER" = "n" ]; then
					return 1
				else
					# This should not be in .message ...
					NEWPART="`Partdisplay Linux | fgrep "/dev/" | cut -c 1-10 `"
				fi
			else
				cat << EOF >> $MSG	
Wenn Sie keine Partition formatieren wollen,
so drcken Sie nur die Eingabetaste. 
Welche Partition wollen Sie formatieren ?
EOF
				Askstring -emptyvalid
				if [ "$STRING" = "" ]; then
					return 0 
				fi
				NEWPART=$STRING
			fi
		else	
			cat << EOF > $ERRMSG

Habe keine Linux Partition zum Formatieren gefunden !

Mgliche Fehlerursachen:

1. Es ist noch keine Linux Partition angelegt.
2. Es sind bereits alle Linux Partitionen gemountet.

Im 1. Fall mssen Sie mit fdisk (Punkt a) eine Linux Partition anlegen.
Im 2. Fall mssen Sie erst die Partition unmounten, die formatiert werden soll. 

EOF
			Error
			return 1
		fi
	else
		Partdisplay Linux > $MSG
		cat << EOF >> $MSG	
Wenn Sie keine Partition formatieren wollen,
so drcken Sie nur die Eingabetaste. 
Welche Partition wollen Sie formatieren ?
EOF
		Askstring -emptyvalid
		if [ "$STRING" = "" ]; then
			return 0
		fi
		NEWPART=$STRING
	fi

	debug "Calling Parttest "

	Parttest type Linux $NEWPART 
	teststat=$?
	if [ "$teststat" != 0 ]; then
		cat << EOF > $ERRMSG

Formatierung verweigert  !

$NEWPART ist keine "Linux native" Partition (Typ 83)

Sind Sie sicher, da Sie die richtige Partition formatieren wollen ? 
Wenn nein, erneut mit anderer Partition versuchen.
Wenn ja, so ndern Sie mit fdisk den Typ von $NEWPART auf 83.

EOF
		Error
		return 1
	fi
	Parttest mountbar $NEWPART
	if [ $? != 0 ]; then
		echo "$status" > $ERRMSG
		Error 
		return 1
	fi

	fgrep "Ende" /tmp/PARTLIST > $MSG
	fgrep "$NEWPART" /tmp/PARTLIST >> $MSG
	cat << EOF >> $MSG

Alle Daten auf $NEWPART werden dadurch gelscht !

Einverstanden ?
EOF
	Askyesno

	if [ "$ANSWER" = "j" ]; then
		domkfs $NEWPART 
		mountit $NEWPART
	fi
}

Mountsetup()
{
	num=0
	while [ 1 ]; do
		dialog --title "Partitionen mounten/unmounten" \
			--menu "\n\nWhlen Sie einen Menpunkt\n" 15 74 5 \
			"1" "Partitionen anzeigen" \
			"2" "gemountete Partitionen zeigen" \
			"3" "Partitionen mounten" \
			"4" "Partitionen unmounten" \
			"0" "zurck zum Hauptmen" 2> /tmp/ANSWER
		ANSWER="`cat /tmp/ANSWER`"

	case $ANSWER in
	0)
		return 0;;
	1)
		Partdisplay > $MSG
		Seen;;
	2)
		Partdisplay gemounteten | sed '/type proc/d' > $MSG
		Seen;;
	3)
		cat << EOF > $MSG
Suche nach mountbaren Partitionen ...
EOF
		ShowInfo
		dummylist="`Partdisplay mountbaren `"
		num=` echo "$dummylist" | fgrep '/dev/' | wc | cut -c 1-7 `
		echo "$num" | fgrep "0" > /dev/null 
		if [ $? = 0 ]; then
			cat << EOF > $ERRMSG

Habe keine mountbare Partition gefunden

Entweder sind alle mountbaren Partitionen bereits gemountet
oder Sie haben noch keine Linux Partition angelegt.

EOF
			Error
			return 1
		else
			LogMsg -new "$dummylist"
		fi
		LogMsg " "
		if [ $num = 1 ]; then
			LogMsg -n "Partition mounten "
			Askyesno -default j 
			if [ "$ANSWER" = "n" ]; then
				return 1
			else
				NEWPART="` Partdisplay mountbaren | fgrep "/dev/" | cut -c 1-10 `"
			fi
		else
			cat << EOF >> $MSG
Wenn Sie keine Partition mounten wollen,
so drcken Sie nur die Eingabetaste.
Welche Partition wollen Sie mounten ?
EOF
			Askstring -emptyvalid
			if [ "$STRING" = "" ]; then
				return 0
			fi
			NEWPART=$STRING
		fi
		mountit $NEWPART;;
	4)
		Partdisplay gemounteten > $MSG
			cat << EOF >> $MSG
Wenn Sie keine Partition unmounten wollen,
so drcken Sie nur die Eingabetaste.
Welche Partition wollen Sie unmounten ?
EOF
		Askstring -emptyvalid
		if [ "$STRING" = "" ]; then
			return 0
		fi
		MOUNTPART=$STRING
		umount $MOUNTPART > /dev/null 2>&1;;
	*)
		continue;;
	esac
	done
}

mountit()
{
	Parttest mountbar $1 
	if [ $? != 0 ]; then
		LogErr -new "$status" 
		Error 
		return 1
	fi
	if [ "$ROOTDEVICE"  = "" -o "` mount | fgrep /root `" = "" ]; then
		LogMsg -new "Soll $1 die knftige Root-Partition werden ?"
		Askyesno -default j
		if [ "$ANSWER" != "j" ]; then
			LogErr -new "Bitte zuerst die knftige Root-Partition mounten"
			Error
			return 1
		fi
		export ROOTDEVICE=$1
		if [ "$INSTROOT" != "" ]; then
			export INSTROOT=/root
		fi
		NEWPART=$ROOTDEVICE
		NEWDIR=/
		MOUNTPOINT=$INSTROOT
	else
		NEWPART=$1

		if [ $# -lt 2 -o "$2" = "" ]; then
			cat << EOF > $MSG
Unter welchen Pfad (relativ zur knftigen Wurzel) soll
diese Partition gemountet werden ? (z.B. /usr oder /home)
EOF
			Askstring 
			NEWDIR=$STRING
			MOUNTPOINT=$INSTROOT$NEWDIR
		fi
	fi
	if [ "$NEWDIR" != "" ]; then
		mkdir -p $MOUNTPOINT || return 1
	fi
	sync
	testmountable $MOUNTPOINT
	if [ $? != 0 ]; then
		cat << EOF > $ERRMSG
Probleme beim Mounten nach $MOUNTPOINT !
Dies kann durch Eingabefehler oder inkorrekten Abbruch
des Installationsskripts auftreten.
Zugehriger Konflikt-Eintrag in mount:
$status
EOF
		Error
		if [ "$MOUNTPOINT" = "/root" ]; then
			ROOTDEVICE=""
		fi
		return 1
	fi
	domount $NEWPART $MOUNTPOINT || return 1 
	debug "Es wurde Partition $NEWPART an $MOUNTPOINT gemountet"
}

Swappartsetup()
{
	Partdisplay Swap Linux > $MSG
	LogMsg "Auf welcher Partition einen Swapbereich einrichten ? "
	Askstring
	SWAPPART=$STRING
	testexist $SWAPPART
	if [ "$teststat" != 0 ]; then
		LogErr -new "$status"
		Error 
		return 1
	fi
	if [ "`showpartlist | fgrep $SWAPPART | cut -c 49-50`" != "82" ]; then
		cat << EOF > $ERRMSG
Initialisierung der Swap Partition verweigert !
$SWAPPART ist keine "Linux swap" Partition (Typ 82)
Sind Sie sicher, da Sie die richtige Partition gewhlt haben ?
Wenn ja, so ndern Sie mit fdisk den Typ von $SWAPPART auf 82.
Wenn nein, so versuchen Sie es erneut mit einer anderer Partition.
EOF
		Error
		return 1
	fi
	testmountable $SWAPPART
	SWAPSIZE=`showpartlist | fgrep $SWAPPART | cut -c 38-45`
	debug "SWAPSIZE = $SWAPSIZE "
	cat << EOF > $MSG

Ihre Swappartition wird initialisiert und aktiviert.

              Bitte warten Sie...

EOF
	ShowInfo
	mkswap $SWAPPART $SWAPSIZE > /dev/null 2>&1
	Swaponpart $SWAPPART
}

Swaponpart()
{
	debug "Swaponpart: called with args $@ "
	if [ "$#" = 0 ]; then
		debug "Swaponpart: Calling showpartlist Swap ..."

		Partdisplay Swap > $MSG
		number=`showpartlist Swap | wc | cut -c 1-7 `
		if [ $number -eq 0 ]; then
			cat << EOF > $ERRMSG
Keine Swappartition gefunden !
Sie mssen zuerst eine Swappartition mit fdisk anlegen
und dann den Typ der Partition auf 82 (Linux swap) einstellen.
EOF
			Error
			return 1
		fi

		debug "$number Mglichkeiten gefunden"

		if [ $number -eq 1 ]; then
			LogMsg "Wollen Sie diese Partition zum Swappen aktivieren ?"
			Askyesno -default j
			if [ "$ANSWER" = "n" ]; then
				return 1
			else
				SWAPPART=` showpartlist Swap | cut -c 1-10 `
				debug "Using $SWAPPART for swapspace ..."
			fi
		else
			cat << EOF >> $MSG
Wollen Sie keine Partition zum Swappen aktivieren,
so drcken Sie nur die Eingabetaste.
Welche Partition wollen Sie zum Swappen aktivieren ?
EOF
			Askstring -emptyvalid
			if [ "$STRING" = "" ]; then
				return 0
			fi
			SWAPPART=$STRING
		fi		
	else
		debug "Swaponpart: SWAPPART set to $1 "
		SWAPPART=$1
	fi
	testexist $SWAPPART
	if [ "$status" = "" ]; then
		LogErr -new "Partition $SWAPPART nicht gefunden"
		Error
		return 1
	fi
	debug "$SWAPPART found ..."
	if [ "`showpartlist | fgrep $SWAPPART | cut -c 49-50`" != "82" ]; then
		cat << EOF > $ERRMSG
Aktivierung der Swap Partition verweigert !
$SWAPPART ist keine "Linux swap" Partition (Typ 82)
Sind Sie sicher, da Sie die richtige Partition gewhlt haben ?
Wenn ja, so ndern Sie mit fdisk den Typ von $SWAPPART auf 82.
Wenn nein, so versuchen Sie es erneut mit einer anderer Partition.
EOF
		Error
		return 1
	fi
	debug "$SWAPPART has the right signature ..."

	testmountable $SWAPPART
	teststat=$?
	if [ "$teststat" != 0 ]; then
		LogErr -new "$status"
		Error 
		return 1
	fi

	debug "$SWAPPART is not mounted ..."
	
	SWAPSIZE=`showpartlist | fgrep $SWAPPART | cut -c 38-45`
	debug "SWAPSIZE = $SWAPSIZE "
	cat << EOF > $MSG

Ihre Swappartition wird initialisiert und aktiviert.

              Bitte warten Sie...

EOF
	ShowInfo

	mkswap -c $SWAPPART $SWAPSIZE > /dev/null 2>&1

	swapoff $SWAPPART 2>&1 > /dev/null 

	swapon $SWAPPART 2>&1 > /dev/null 
	if [ $? = 0 ]; then
		if [ -f $INSTROOT/fstab.tmp ]; then 
			echo "$SWAPPART	   none	swap" >> $INSTROOT/fstab.tmp 
		else 
			SWAPLINE="$SWAPPART	none	swap" 
		fi 
	fi
}

Swapfilesetup()
{
	if [ "$ROOTDEVICE" = "" ]; then
		LogErr -new "Sorry, Sie mssen zuerst ein Root-Dateisystem anlegen !"
		Error
		continue
	fi
	cat << EOF > $MSG

Anlegen einer Swap Datei im knftigen Root-Dateisystem

Geben Sie gewnschte Gre der Swapdatei in KB an:
EOF
	Askstring
	SWAPSIZE=$STRING
	cat << EOF > $MSG

Ihre Swapdatei wird angelegt und aktiviert.

          Bitte warten Sie...

EOF
	ShowInfo
	dd if=/dev/zero of=$INSTROOT/swap bs=1024 count=$SWAPSIZE > /dev/null 2>&1
	mkswap -c $INSTROOT/swap $SWAPSIZE > /dev/null 2>&1
	Swaponfile
}

Swaponfile()
{
	if [ -f $INSTROOT/swap ]; then
		swapon $INSTROOT/swap > /dev/null 2>&1 &&
		if [ -f $INSTROOT/fstab.tmp ]; then
			echo "/swap	none	swap" >> $INSTROOT/fstab.tmp
		fi
	else
		if [ "$ROOTDEVICE" = "" ]; then
			LogErr -new "Sorry, bitte zuerst Root-Filesystem anlegen bzw. mounten"
			Error
			continue;
		else
			LogErr -new "Sorry, Swap-Datei $INSTROOT/swap nicht vorhanden"
			Error
		fi
	fi
}

Showfree()
{
	echo
	echo "------------- freier Speicher --------------"
	echo
	free 
}

Showmounted()
{
	echo
	echo "---------- gemountete Partitionen ----------"
	echo
	mount | sed '/on \/proc/d'
}

Showdiskfree()
{
	echo
	echo "------------ freier Plattenplatz -----------"
	echo
	df | sed '/\/dev\/fd0/d'
}

DoDiagnose()
{
	cat << EOF > $MSG
Diagnose in der BETA-Version leider noch nicht verfgbar :-( 
Warten Sie auf die offizielle Version.
EOF
	Seen
}

Swapsetup()
{
	Swaponpart 
	teststat=$?
	if [ "$teststat" = 0  ]; then
		return 0
	else
		Swapfilesetup
	fi
}

Prepareinstall()
{
	while [ 1 ]; do
		if [ "$USEDIALOG" = "true" ]; then
dialog --title "Hauptmen der LST Installation" --menu "\n\nWhlen Sie einen Menpunkt\n" 18 74 8 \
"p" "Liste aller Partitionen anzeigen" \
"i" "Informationen ber freien Speicher und gemountete Partitionen" \
"a" "Partitionen anlegen/verndern mit fdisk" \
"s" "Swap Bereiche anlegen/aktivieren (mkswap/swapon)" \
"f" "Formatieren einer Linux Partition (mke2fs)" \
"m" "Mounten/Unmounten von Linux Partitionen (mount/umount)" \
"w" "Weiter, um die Installation der LST Distribution zu beginnen" \
"e" "Installation abbrechen" 2> /tmp/ANSWER
			MAIN=`cat /tmp/ANSWER`
			rm /tmp/ANSWER
		else
			echo $CLEAR	
			echo
			echo "          $REVON Hauptmen der LST Installation $REVOFF"
			echo
			echo " $REVON p $REVOFF  Liste aller Partitionen anzeigen"
			echo " $REVON i $REVOFF  Informationen ber freien Speicher und gemountete Partitionen"
			echo " $REVON a $REVOFF  Partitionen anlegen/verndern mit fdisk (danach Neustart erforderlich)"
			echo " $REVON s $REVOFF  Swap Bereiche anlegen/aktivieren (mkswap/swapon)"
			echo " $REVON f $REVOFF  Formatieren einer Linux Partition (mke2fs)"
			echo " $REVON m $REVOFF  Mounten/Unmounten von Linux Partitionen (mount/umount)"
			if [ "$EXPERT" != "" ]; then
				echo " $REVON b $REVOFF  LST Boot Manager aufrufen"
				echo " $REVON d $REVOFF  Diagnose des installierten Systems"
				echo " $REVON 3 $REVOFF  Swap Partition (mu existieren) initialisieren (mkswap)"
				echo " $REVON 4 $REVOFF  Swap Partition (mu existieren) benutzen (swapon)"
				echo " $REVON 5 $REVOFF  Swap Datei im Root-Dateisystem (mu gemountet sein) anlegen (mkswap)"
				echo " $REVON 6 $REVOFF  Swap Datei im Root-Dateisystem (mu gemountet sein) benutzen (swapon)"
			fi
			echo
			echo " $REVON w $REVOFF  Weiter, um die Installation der LST Distribution zu beginnen"
			echo " $REVON e $REVOFF  Installation abbrechen"
			echo ' '
			echo -n " Whlen Sie einen der Punkte (p/i/v/s/f/m/w/e): "
			read MAIN
		fi
		export MAIN
		if [ "$EXPERT" != "" ]; then
			case $MAIN in
				p) 
					Partdisplay > $MSG
					PageMessage;;
				i) 
					Showfree > $MSG
					Showmounted >> $MSG
					Showdiskfree >> $MSG
					PageMessage;;
				a) Runfdisk;;
				s) Swapsetup;;
				f) Partsetup;;
				m) Mountsetup;;
				b) bootsetup $HASDIALOG -expert;;
				d) DoDiagnose;;
				3) Swappartsetup;;
				4) Swaponpart;;
				5) Swapfilesetup;;
				6) Swaponfile;;
				w) Startlstinstall;;
				e) exit 1;;
				*) LogErr -new "Falsche Eingabe ! " ; Error;;
	 		esac
		else
			case $MAIN in
				p) 
					Partdisplay > $MSG
					PageMessage;;
				i) 
					Showfree > $MSG
					Showmounted >> $MSG
					Showdiskfree >> $MSG
					PageMessage;;
				a) Runfdisk;;
				s) Swapsetup;;
				f) Partsetup;;
				m) Mountsetup;;
				w) Startlstinstall;;
				e) exit 1;;
				*) LogErr -new "Falsche Eingabe ! " ; Error;;
	 		esac
		fi
		if [ "$BEGININSTALL" = "true" ]; then
			break
		fi
	done
}

Dofirsttime()
{
	# sysinstall installieren und decomprimieren
	if [ -f /bin/sysinstall ]; then
		cp /bin/sysinstall $INSTROOT/usr/bin
	elif [ -f /bin/sysinstall.gz ]; then
		cp /bin/sysinstall.gz $INSTROOT/usr/bin
		( cd $INSTROOT/usr/bin ; gzip -df sysinstall.gz )
	else
		echo 'Panic ! Habe kein sysinstall in /bin gefunden !'
	fi
	mkdir -p $INSTROOT/usr
	mkdir -p $INSTROOT/usr/bin
	mkdir -p $INSTROOT/tmp
	chmod 1777 $INSTROOT/tmp
	mkdir -p $INSTROOT/install
	mkdir -p $INSTROOT/etc
	hash -r
}

Testoverinstall()
{
	# Hier sollte ein intelligenter Code hin, der wirklich auf Neu prft 
	debug "Overinstalltest ist noch nicht implementiert :-( "
	cat << EOF > $MSG
Lesen Sie aufmerksam
Wir bieten Ihnen die Mglichkeit, ber ein bestehendes System zu
installieren, weisen jedoch ausdrcklich darauf hin, da die
Gefahr von Inkonsistenzen bei einem Gemisch aus altem und neuem
System sehr gro ist.
Deshalb empfehlen wir, insbesondere fr weniger erfahrene
Benutzer, das System auf eine "frisch" formatierte Partition
zu installieren. Unser Basissystem stellt nicht nur eine
solide und getestete Grundlage dar, sondern die Zusatzpakete
sind auch auf diese Basis abgestimmt.
Das Basispaket trgt seinen Namen also nicht umsonst ;-)
EOF
	Seen
	export OVERINSTALL="true"
	return 0
}

Startlstinstall()
{
	if [ "$ROOTDEVICE" = "" ]; then
		# Unser Sorgenkind ... nicht zu strikt sein, aber auch nicht
		# zu nachlssig. Also dann aber wenigstens an /root mounten ...
		mount | fgrep " /root " > /dev/null 2>&1 
		if [ $? = 0 ]; then
			ROOTDEVICE=` mount | fgrep " /root " | cut -c 1-10 ` 
			LogMsg -new "Wollen Sie $ROOTDEVICE als knftige Root-Partition benutzen ?"
			Askyesno -default j
			if [ "$ANSWER" = "n" ]; then
				ROOTDEVICE=
				return 1
			fi
		else
		   	LogErr -new "Sie mssen zuerst Ihre knftige Root-Partition an /root mounten"
			Error
			return 1
		fi
	fi
	if [ "$EXPERT" != "" ]; then
		Testoverinstall
	fi
	# jetzt kann es losgehen ...
	export BEGININSTALL="true"
}

mountsource()
{
	case $1 in 
	harddrive)
		INSTSRC=/mnt/lst_18/install
		while [ 1 ]; do
			Partdisplay > $MSG
			LogMsg "Geben Sie die Partition an, auf der die Quellen liegen:"
			Askstring
			hdloc=$STRING
			LogMsg -new "Geben Sie den Filesystem-Typ an (msdos/ext2/minix):"
			Askstring
			hdtype=$STRING
			mount -t $hdtype $hdloc /mnt && break
		done
	;;
	cdrom)
		# unsere Test-CD hat diesen Pfad ;-)
		INSTSRC=/mnt/lst_18/install
		CDMOUNT=/mnt
		while [ 1 ]; do
			umount $CDMOUNT > /dev/null 2>&1
			# brrrr ! dirty ! Aber ich hab nur ein Mitsumi ;-)
			# brauche hier ein Liste der mglichen CD Devices
			LogMsg -new "Das ist nicht die endgltige Version !"
			Seen
			LogMsg -new -n "Ist dies ein Mitsumi CDROM player (j/n)"
			Askyesno
			if [ "$ANSWER" = "j" ]; then
				CDDEVICE=/dev/mcd0
			else
				CDDEVICE=/dev/sr0
			fi
			debug "CDMOUNT = $CDMOUNT , CDDEVICE = $CDDEVICE "
			debug "Trying to mount -r -t iso9660 $CDDEVICE $CDMOUNT"
			mount -r -t iso9660 $CDDEVICE $CDMOUNT && break
			cat << EOF > $ERRMSG
Sorry, Mountfehler !
mount -r -t iso9660 $CDDEVICE $CDMOUNT hat nicht funktioniert !
EOF
			Error
			LogMsg -new "Bitte geben Sie das Device des CD-ROMs an:"
			Askstring
			CDDEVICE=$STRING
			LogMsg -new "Bitte geben Sie den Mountpunkt an:"
			Askstring
			CDMOUNT=$STRING
			INSTSRC=$CDMOUNT/install
		done
		mkdir -p $INSTROOT/etc
		echo "CDROM $CDDEVICE" >> $INSTROOT/etc/hwconfig
	;;
	network)
		INSTSRC=/mnt/install
		while [ 1 ]; do
			LogMsg -new "Geben Sie Ihre IP Adresse ein (z.B. 192.0.2.129): "
			Askstring
			IPADDR=$STRING
			if [ "$IPADDR" != "" ]; then
				break
			fi
		done
		while [ 1 ]; do
			LogMsg -new "Geben Sie Ihre Netzwerkadresse ein (z.B. 192.0.2.0): "
			Askstring
			LOCALNET=$STRING
			if [ "$LOCALNET" != "" ]; then
				break
			fi
		done
		while [ 1 ]; do
			LogMsg -new "Geben Sie Ihre Netzwerkmaskierung ein (z.B. 255.255.255.0): "
			Askstring
			NETMASK=$STRING
			if [ "$NETMASK" != "" ]; then
				break
			fi
		done
		while [ 1 ]; do
			LogMsg -new "Geben Sie Ihre Broadcastadresse ein (z.B. 192.0.2.255): "
			Askstring
			BROADCAST=$STRING
			if [ "$BROADCAST" != "" ]; then
				break
			fi
		done
			cat << EOF > $MSG
Geben Sie die IP Adresse Ihres Routers ein (z.B. 192.0.2.1),
oder drcken Sie nur die Eingabetaste, falls Sie keinen
Router bentigen oder haben. 
EOF
			Askstring -emptyvalid
			ROUTER=$STRING
			if [ "$ROUTER" != "" -a "$ROUTER" != "$IPADDR" ]; then
				ROUTERPARM=" gw $ROUTER "
			else
				ROUTERPARM=""
			fi
		while [ 1 ]; do
			LogMsg -new "Geben Sie die IP Adresse des NFS-Servers ein: "
			Askstring
			NFSSERVER=$STRING
			if [ "$NFSSERVER" != "" ]; then
				break
			fi
		done

		# Loopback, warum eigentlich nicht ?
		LogMsg -new "Konfiguriere Ihre Netzwerkanbindung..."
		ShowInfo
		$IFCONFIG lo 127.0.0.1
		$ROUTE add 127.0.0.1
		$IFCONFIG eth0 $IPADDR netmask $NETMASK broadcast $BROADCAST
		LogMsg -new "Konfiguriere Ihr Routing..."
		ShowInfo
		$ROUTE add -net $LOCALNET
		# set the default route, if a router exists
		if [ "$ROUTER" != "" ]; then
			# eigentlich ist der host-route nicht ntig, aber
			# sicher ist sicher ;-)
			$ROUTE add -host $ROUTER
			$ROUTE add default gw $ROUTER
		fi

		while [ 1 ]; do
			LogMsg -new "Geben Sie das Verzeichnis auf dem NFS-Server an,"
			LogMsg "in welchem sich die Quellen befinden: "
			Askstring 
			NFSSRC=$STRING
			export INSTSRC=/mnt
			LogMsg -new "Das Quellverzeichnis vom NFS-Server wird gemountet... "
			ShowInfo
			mount -t nfs $NFSSERVER:$NFSSRC /mnt  && break;
			cat << EOF > $ERRMSG
Problem beim mounten ! 
Die folgenden Daten sind fr Experten zur Diagnose gedacht.
Loggen Sie sich auf einer anderen Konsole als root ein und
korrigieren Sie die Netzwerkkonfigurierung. Wenn Sie damit
fertig sind, knnen Sie die Eingabetaste drcken, um einen
erneuten Versuch zu starten, das Quellverzeichnis vom
NFS-Server zu mounten.
Diagnose: Ihre Einstellungen mit ifconfig:
EOF
			$IFCONFIG >> $ERRMSG
			LogErr "Diagnose: Ihre Routing-Einstellungen:"
			$ROUTE >> $ERRMSG
			Error
		done
	;;
	esac
	MNTSTAT=$?
	if [ $MNTSTAT != 0 ]; then
		echo "kann Quellverzeichnis nicht mounten !" > $ERRMSG
		Error
		return 1
	fi
	# Uuh Vorsicht dirty code ...
	# Deshalb lassen wir das auch lieber weg ... ;-)
	while [ 1 ]; do
		if [ -d $INSTSRC/a2 ]; then
			return
		elif [ -d $INSTSRC/basis2 ]; then
			return
		elif [ -d $INSTSRC ]; then
			cat << EOF > $MSG
$INSTSRC sieht nicht wie ein LST Sourceverzeichnis aus !
Es enthlt folgende Dateien/Unterverzeichnisse (ls): 
EOF
			ls $INSTSRC >> $MSG
			LogMsg "Soll das trotzdem Ihr Quellverzeichnis sein ?" 
			Askyesno 
			if [ "$ANSWER" = "j" ]; then
				return
			fi
		else
			LogErr -new "$INSTSRC ist kein gltiger Pfad zu einem Verzeichnis !"
			Error
		fi
		LogMsg -new "Geben Sie den Pfad zum Quellverzeichnis an."
		Askstring 
		if [ "$STRING" != "" ]; then 
			INSTSRC=$STRING
		fi
	done
}

#
# auswahlseries ( SERIESNAME )
#
auswahlart() {
	while [ 1 ]; do
		# Sichere Einstellungen als default ...
		DOPROMPT="-doprompt"
		MINIMUM=
		RECOMMENDED=
		AUSWAHL="ja"
		Choosemulti -default 4 -mode one -headertext " innerhalb der Serie $SERIES" -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "Serie doch nicht selektieren"


		ans=$SELITEM
		if [ $ans = 0 ]; then
			AUSWAHL="$MSELNOT"
			return 1
		elif [ $ans = 1 ]; then
			MINIMUM="-minimum"
			DOPROMPT=""
			AUSWAHL="$MSELMIN"
			return 0
		elif [ $ans = 2 ]; then
			MINIMUM="-minimum"
			DOPROMPT="-doprompt"
			AUSWAHL="$MSELMINASK"
			return 0
		elif [ $ans = 3 ]; then
			DOPROMPT=""
			AUSWAHL="$MSELMAX"		
			return 0
		elif [ $ans = 4 ]; then
			DOPROMPT="-doprompt"
			AUSWAHL="$MSELASK"
			return 0
		elif [ $ans = 5 ]; then
			MINIMUM="-minimum"
			RECOMMENDED="-recommended"
			DOPROMPT=""
			AUSWAHL="$MSELREC"
			return 0
		elif [ $ans = 6 ]; then
			MINIMUM="-minimum"
			RECOMMENDED="-recommended"
			DOPROMPT="-doprompt"
			AUSWAHL="$MSELRECASK"
			return 0 
		fi
		export MINIMUM RECOMMENDED DOPROMPT
	done	
}

#
# fake Installation with sysinstall -preselect
#
installit() 
{
	# first Arg: Seriesname, second Argument: Defsel
	INSTTYPE="-series $1"
	echo "$1 " >> /tmp/SeriesList
	DOPROMPT=""
	MINIMUM=""
	RECOMMENDED=""
	case $2 in
	1)
		MINIMUM="-minimum"
		;;
	2)
		MINIMUM="-minimum"
		DOPROMPT="-doprompt"
		;;
	3)
		MINIMUM="-minimum"
		RECOMMENDED="-recommended"
		;;
	4)
		MINIMUM="-minimum"
		RECOMMENDED="-recommended"
		DOPROMPT="-doprompt"
		;;
	5)
		DOPROMPT="-doprompt"
		;;
	6)
		DOPROMPT=""
		;;
	0)
		return 0
		;;
	*)
		LogErr -new "falscher Parameter an installit() bergeben ! "
		Error
		return 1
		;;
	esac

	# prepare Arguments for sysinstall
	PRELOAD="-preload"
	if [ "$USEDIALOG" = "true" ]; then
		HASDIALOG='-usedialog'
	fi

	if [ "$SELECTLIST" != "" ]; then
		HASSELECTLIST="-selectlist $SELECTLIST"
	else
		HASSELECTLIST=
	fi
	if [ "$EXTRACTLIST" != "" ]; then
		HASEXTRACTLIST="-extractlist $EXTRACTLIST"
	else
		HASEXTRACTLIST=
	fi
	if [ "$DATABASE" != "" ]; then
		HASDATABASE="-database $DATABASE"
	else
		HASDATABASE=
	fi
	if [ "$FULLINDEX" != "" ]; then
		HASFULLINDEX="-fullindex $FULLINDEX"
	else
		HASFULLINDEX=
	fi
	if [ "$INSTSRC" != "" ]; then
		HASINSTSRC="-instsrc $INSTSRC"
	else
		HASINSTSRC=
	fi
	if [ "$INSTROOT" != "" ]; then
		HASINSTROOT="-instroot $INSTROOT"
	else
		HASINSTROOT=
	fi
	LogMsg -new "Rufe sysinstall mit folgenden Optionen auf:" 
	LogMsg "sysinstall $PRELOAD $EXPERT $HASDIALOG $DEBUG $DOPROMPT $PRESELECT $DELOLD $REMOVEAFTER $MINIMUM $RECOMMENDED -instdev $INSTDEV $HASSELECTLIST $HASEXTRACTLIST $HASDATABASE $HASFULLINDEX $HASINSTSRC $HASINSTROOT $INSTTYPE"
	ShowInfo
	sysinstall $PRELOAD $EXPERT $HASDIALOG $DEBUG $DOPROMPT $PRESELECT $DELOLD $REMOVEAFTER $MINIMUM $RECOMMENDED -instdev $INSTDEV $HASSELECTLIST $HASEXTRACTLIST $HASDATABASE $HASFULLINDEX $HASINSTSRC $HASINSTROOT $INSTTYPE
	if [ $? != 0 ]; then
		echo "doinstall: panic, Aufruf von sysinstall failed at `date` "
		return 1
	fi
	sync
}


askdrive()
{
	while [ 0 ]; do 
		cat << EOF > $MSG
1)  Laufwerk A: 5 1/4 Zoll
2)  Laufwerk A: 3 1/2 Zoll
3)  Laufwerk B: 5 1/4 Zoll
4)  Laufwerk B: 3 1/2 Zoll
Geben Sie das Laufwerk an, von welchem Sie installieren (1/2/3/4):
EOF
		Askstring
		case $STRING in
			1) INSTDEV=/dev/fd0h1200;;
			2) INSTDEV=/dev/fd0H1440;;
			3) INSTDEV=/dev/fd1h1200;;
			4) INSTDEV=/dev/fd1H1440;;
			*) continue;;
		esac
		umount $INSTDEV /dev/null 2>&1
		return
	done
}

extracttape()
{
	while [ 1 ]; do
		if [ "$TAPE" = "" -o "$TAPE" = "invalid" ]; then
			cat << EOF > $MSG
Umgebungsvariable TAPE nicht gesetzt oder Probleme mit dem Streamer
Bitte geben Sie den Devicenamen Ihres Streamers an (z.B. /dev/ftape)
EOF
			Askstring
			TAPE=$STRING
		fi
		if [ "$TAPE" = "/dev/ftape" ]; then
			LogMsg -new "Initialisiere Floppy Streamer Laufwerk"
			ShowInfo
			/sbin/tapetool -init
		fi
		while [ 1 ]; do
			cat << EOF > $MSG
An welcher Stelle haben Sie Platz, um die Pakete vom Band
vor der Installation zwischenzuspeichern ?
Vorschlag: $INSTROOT/usr/extract
EOF
			Askstring
			EXTRACTDIR=$STRING
			mkdir -p $EXTRACTDIR && break
		done
		export EXTRACTDIR
		LogMsg -new "Lese Daten vom Band ein... (bitte etwas Geduld)"
		ShowInfo
		( cd $EXTRACTDIR ; tar xvf /dev/ftape `cat $EXTRACTLIST` ) || panic "Panic ! Probleme beim Lesen des Tapes !" ; export TAPE=invalid ; break 
	done
	INSTSRC=$EXTRACTDIR/install
}

#
#  Askyesno( [-default DEFANSWER] )
# 
#       Just ask a yes/no question (j/n)
#
Askyesno()
{
        export ANSWER=""
	export DEFANSWER=
	if [ $# -gt 1 -a "$1" = "-default" ]; then
		DEFANSWER=$2
		shift 2
	fi
	if [ ! -f $MSG ]; then
		touch $MSG
	fi
	if [ "$USEDIALOG" = "true" ]; then
		cat $MSG | cut -c 1-70 > $MSG.new
		mv $MSG.new $MSG
		zeilen=`wc $MSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 6`
		fi
	else
		echo -n "Eingabe ($YES/$NO)" >> $MSG
		if [ "$DEFANSWER" != "" ]; then
			echo -n " [$DEFANSWER]" >> $MSG
		fi
		echo -n ": " >> $MSG
	fi
        while [ 0 ]; do
		if [ "$USEDIALOG" = "true" ]; then
			dialog --yesno "`cat $MSG`" $zeilen 75 
			if [ $? = 0 ]; then
				ANSWER="$YES"
			else
				ANSWER="$NO"
			fi
		else
			echo $CLEAR
			cat $MSG
                	read ANSWER
		fi
                if [ "$ANSWER" = "$YES" -o "$ANSWER" = "$NO" ]; then
                        break
                elif [ "$DEFANSWER" != "" -a "$ANSWER" = "" ]; then
			ANSWER=$DEFANSWER
			break
                fi
		echo "$MINPUT $MINVALID" > $ERRMSG
		Warning
        done
	export ANSWER
	rm -f $MSG
        return 0
}

#
#   Askstring( [-emptyvalid] [ -default DEFANSWER] )
#
#       Just ask for a non-null string
#
Askstring()
{
	export EMPTYVALID=false
	export DEFANSWER=
        export STRING=
	while [ 1 ]; do
		if [ $# = 0 ]; then
			break
		elif [ "$1" = "-emptyvalid" ]; then
			EMPTYVALID=true
			shift 1
		elif [ $# -gt 1 -a "$1" = "-default" ]; then
			DEFANSWER=$2
			shift 2
		else
			echo "Askstring mit unbekannten Argumenten aufgerufen " > $ERRMSG
			Error
		fi
	done
	if [ "$USEDIALOG" = "true" ]; then
		cat $MSG | cut -c 1-70 > $MSG.new
		mv $MSG.new $MSG
		zeilen=`wc $MSG | cut -c 1-7 | sed 's/ //g' `
		if [ $zeilen -gt 15 ]; then
			zeilen=20
		else
			zeilen=`expr $zeilen + 7`
		fi
	else
		if [ "$DEFANSWER" != "" ]; then
			echo -n " [$DEFANSWER]" >> $MSG
		fi
		echo -n "Eingabe: " >> $MSG
	fi
        while [ 0 ]; do
		if [ "$USEDIALOG" = "true" ]; then	
			dialog --inputbox "`cat $MSG`" $zeilen 75 2> /tmp/ANSWER
			STRING="`cat /tmp/ANSWER`"
		else
			echo $CLEAR
			cat $MSG
			read STRING
		fi
		if [ "$STRING" = "" ]; then
			if [ "$DEFANSWER" != "" ]; then
				STRING=$DEFANSWER
				break
			elif [ "$EMPTYVALID" = "true" ]; then
				STRING=""
				break
			else
				LogErr -new "Sie mssen etwas eingeben !"
				Error
			fi 
                else
			break
		fi
        done
	export STRING
}

#
# panic 
#
#       Someone interrupted the shellscript. Log that critical event.
panic()
{
	cat << EOF > $ERRMSG
Unterbrechen ist keine gute Idee !
Das kann einen inkonsistenten Zustand zur Folge haben !
Hoffentlich wissen Sie, was Sie tun ...
Wenn nicht, dann beginnen Sie bitte nochmal ganz von vorne ...
EOF
	Warning
	if [ -d $INSTROOT/install ]; then
		mkdir -p $INSTROOT/install/log
		echo "panic: doinstall interrupted at `date`" >> $INSTROOT/install/log/panic.log
	else
		echo "panic: doinstall interrupted at `date`" >> /tmp/panic.log
	fi
        exit
}

Slipsetup()
{
	cat << EOF > $MSG
Slipsetup: leider in der BETA Version noch nicht automatisiert.
Loggen Sie sich als root ein und stellen Sie mit dip -t eine
Verbindung zu Ihrem Slip-Server her. Anleitung siehe Ethernet-
bzw. Networking HOWTO.
Drcken Sie erst die Eingabetaste, wenn Sie die SLIP-Verbindung
zu Ihrem Server hergestellt haben !
EOF
	Seen
}

Chooseinsttype()
{
while [ 0 ]; do
	umount /mnt > /dev/null 2>&1
	if [ "$USEDIALOG" = "true" ]; then
		dialog --title "Auswahl der Installations-Quelle" --menu "\n\nWhlen Sie die Quelle, von der Sie Linux installieren\n" 20 74 6 \
"1" "Installation von Disketten" \
"2" "Installation von Festplatte" \
"3" "Installation von Streamer" \
"4" "Installation von CDROM" \
"5" "Installation ber Netzwerk (mit NFS)" \
"6" "Installation ber serielle Leitung (mit SLIP)" 2> /tmp/ANSWER
		ANSWER="`cat /tmp/ANSWER`"	
	else
		echo ' '
		echo '          [7m Installations-Quelle [27m'
		echo ''
		echo ' [7m 1 [27m Installation von Disketten'
		echo ' [7m 2 [27m Installation von Festplatte'
		echo ' [7m 3 [27m Installation von Streamer'
		echo ' [7m 4 [27m Installation von CDROM'
		echo ' [7m 5 [27m Installation ber Netzwerk (mit NFS)'
		echo ' [7m 6 [27m Installation ber serielle Leitung (mit SLIP)'
		echo ' '
		echo -n 'Von welcher Quelle installieren Sie Linux (1-6): '
		read ANSWER
	fi
	case $ANSWER in
		1 ) INSTMEDIA=floppy
			mkspace net qic
			askdrive ;; 
		2 ) INSTMEDIA=harddrive
			mkspace net qic
			mountsource harddrive ;;
		3 ) INSTMEDIA=tape; 
			mkspace net
			auspack qic
			extracttape ;;
		4 ) INSTMEDIA=cdrom
			mkspace net qic
			mountsource cdrom ;;
		5 ) INSTMEDIA=network
			mkspace qic
			auspack net
			mountsource network ;;
		6 ) INSTMEDIA=network
			mkspace qic
			auspack net
			Slipsetup
			mountsource network ;;
		*) echo "$ANSWER ungltige Eingabe, bitte nochmal"; continue;; 
	esac
	export INSTMEDIA
	break
done
}

Askdebug()
{
	if [ "$DEBUG" != "" ]; then
		export DEBUG="-debug"
		return
	fi
	LogMsg -new "Wollen Sie die Debugmeldungen sehen ?"
	Askyesno -default n
	if [ "$ANSWER" = "j" ]; then
		export DEBUG="-debug"
	else
		export DEBUG=
	fi
}

Askpreselect()
{
	while [ 1 ]; do
		LogMsg -new "Mchten Sie Vorauswahl benutzen ?"
		Askyesno
		if [ "$ANSWER" = "n" ]; then
			export SELECTLIST=
			export PRESELECT=
			break
		elif [ "$ANSWER" = "j" ]; then
			export PRESELECT="-preselect"
			export MUSTAFTERINSTALL=true
			break
		fi
	done
}

Askselectlist()
{
	while [ 1 ]; do
		cat << EOF > $MSG
Haben Sie bereits eine persnliche Vorauswahldatei erstellt,
die Sie jetzt benutzen wollen ?
EOF
		Askyesno
		if [ "$ANSWER" = "n" ]; then
			export SELECTLIST=
			break
		elif [ "$ANSWER" = "j" ]; then
			LogMsg -new "Geben Sie Ihre Vorauswahldatei mit vollstndigem Pfad an: "
			Askstring
			if [ ! -f "$STRING" -a -f "$STRING.gz" ]; then
				gzip -d $STRING.gz
			fi
			if [ -f "$STRING" ]; then
				export SELECTLIST="$STRING"
				break
			else
				LogErr -new "$STRING existiert nicht !"
				Warning
			fi
		fi
	done
}

Askdatabase()
{
	while [ 1 ]; do
		LogMsg -new "Mchten Sie eine Datenbank benutzen ?"
		Askyesno
		if [ "$ANSWER" = "n" ]; then
			export DATABASE=
			break
		elif  [ "$ANSWER" = "j" ]; then
			LogMsg -new "Geben Sie Ihre Datenbank mit vollstndigem Pfad an: "
			Askstring
			if [ ! -f "$STRING" -a -f "$STRING.gz" ]; then
				gzip -d $STRING.gz
			fi
			if [ -f "$STRING" ]; then
				export DATABASE="$STRING"
				break
			else
				LogErr -new "$STRING existiert nicht !"
				Warning
			fi
		fi
	done
}

Askfullindex()
{
	while [ 1 ]; do
		LogMsg -new "Mchten Sie einen Gesamtindex benutzen ?"
		Askyesno
		if [ "$ANSWER" = "n" ]; then
			export FULLINDEX=
			break
		elif  [ "$ANSWER" = "j" ]; then
			LogMsg -new "Geben Sie Ihren Gesamtindex mit vollstndigem Pfad an: "
			Askstring
			if [ ! -f "$STRING" -a -f "$STRING.gz" ]; then
				gzip -d $STRING.gz
			fi
			if [ -f "$STRING" ]; then
				export FULLINDEX="$STRING"
				break
			else
				LogErr -new "$STRING existiert nicht !"
				Warning
			fi
		fi
	done
}

Askextractlist()
{
	while [ 1 ]; do
		LogMsg -new "Mchten Sie eine Extractliste benutzen ?"
		Askyesno
		if [ "$ANSWER" = "n" ]; then
			export EXTRACTLIST=
			break
		elif  [ "$ANSWER" = "j" ]; then
			LogMsg -new "Geben Sie Ihre Extractliste mit vollstndigem Pfad an: "
			Askstring
			if [ ! -f "$STRING" -a -f "$STRING.gz" ]; then
				gzip -d $STRING.gz
			fi
			if [ -f "$STRING" ]; then
				export EXTRACTLIST="$STRING"
					break
			else
				Warning "$STRING existiert nicht !"
			fi
		fi
	done
}

#
# 	whlt LST Basissystem aus
#
Choosebasis()
{
	while [ 1 ]; do
		INSTTYPE=""
		BASIS="$MSELNOT"
		TINYX="$MSELNOT"
		XBASIS="$MSELNOT"
		LSTBASIS="$MSELNOT"
		#
		# Auswahl Basispaket
		#
		while [ 1 ]; do
			if [ "$USEDIALOG" = "true" ]; then
				dialog --title "Auswahl LST Basis System" \
	--menu "\nWhlen Sie Ihr Basissystem\n" 12 74 4 "1" "$MBASISONLY" \
	"2" "$MBASISTINY" "3" "$MBASISX11" "4" "$MBASISSUN" 2> /tmp/ANSWER
				if [ $? = 0 ]; then
					DEFSEL="`cat /tmp/ANSWER`"
					break
				fi
			else
				Choosemulti -default 1 -mode one -headertext "LST Basis System" -max 4 "$MBASISONLY" "$MBASISTINY" "$MBASISX11" "$MBASISSUN"
				if [ $? = 0 ]; then
					break
				fi
			fi
		done
		export LSTBASIS=$DEFSEL
		case "$LSTBASIS" in
		1 )
			#
			# Auswahlart innerhalb des Basispakets
			#
			while [ 1 ]; do
				Choosemulti -default 4 -mode one -headertext " innerhalb des Basispaketes " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			BASIS="$DEFSEL"
			installit basis $BASIS
			TINYX="$MSELNOT"
			XBASIS="$MSELNOT"
			break
			;;
		2 )
			#
			# Auswahlart innerhalb des Basispakets
			#
			while [ 1 ]; do
				Choosemulti -default 4 -mode one -headertext " innerhalb des Basispaketes " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			BASIS="$DEFSEL"
			installit basis $BASIS
			X11="tinyx"
			#
			# Auswahl innerhalb von tinyX
			#
			TINYX="6"
			installit tinyx $TINYX
			XBASIS="$MSELNOT"
			break
			;;
		3 ) 
			#
			# Auswahlart innerhalb des Basispakets
			#
			while [ 1 ]; do
				Choosemulti -default 4 -mode one -headertext " innerhalb des Basispaketes " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			BASIS="$DEFSEL"
			installit basis $BASIS
			X11="x11"
			TINYX="$MSELNOT"
			#
			# Auswahl des X-Servers
			#
			while [ 1 ]; do
				Choosemulti -default 1 -mode multione -headertext "XFree86 [tm] Server" -max 7 "$MSERVMONO" "$MSERVSVGA" "$MSERV8514" "$MSERVS3" "$MSERVMACH8" "$MSERVMACH32" "$MSERVVGA16"
				if [ $? = 0 ]; then
					break
				fi
			done
			XSERVER="$SELITEM"
			#
			# Auswahl innerhalb X11
			#
			while [ 1 ]; do
				Choosemulti -default 2 -mode one -headertext " innerhalb von XFree86 " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			XBASIS="$DEFSEL"
			installit xbasis $XBASIS
			break
			;;
		4 )
			#
			# Auswahlart innerhalb des Basispakets
			#
			while [ 1 ]; do
				Choosemulti -default 4 -mode one -headertext " innerhalb des Basispaketes " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			BASIS="$DEFSEL"
			installit basis $BASIS
			X11="openwin"
			TINYX="$MSELNOT"
			#
			# Auswahl des X-Servers
			#
			while [ 1 ]; do
				Choosemulti -default 1 -mode multione -headertext "XFree86 [tm] Server" -max 7 "$MSERVMONO" "$MSERVSVGA" "$MSERV8514" "$MSERVS3" "$MSERVMACH8" "$MSERVMACH32" "$MSERVVGA16"
				if [ $? = 0 ]; then
					break
				fi
			done
			XSERVER="$SELITEM"
			#
			# Auswahl innerhalb Openwin
			#
			while [ 1 ]; do
				Choosemulti -default 4 -mode one -headertext " innerhalb von Openwin " -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "nicht selektieren"
				if [ $? = 0 ]; then
					break
				fi
			done
			XBASIS="$DEFSEL"
			installit xbasis $XBASIS
			break
			;;
		0 )
			INSTTYPE=""
			BASIS="$MSELNOT"
			TINYX="$MSELNOT"
			XBASIS="$MSELNOT"
			LSTBASIS="$MSELNOT"
			return 1
			;;
		*)
			Error "interner Fehler ! ungltige LST Basis Auswahl ! "
			continue
			;;
		esac
	
	done
	return 0
}

# Askmenu 
Askmenu()
{
	echo "Hallo Mausi ..."
}


# Choosemulti [ -default DEFSEL -selected TAGSELECTED ] 
#       	[ -printafter EXTRATEXT -doafterselect SELECTACTION ]
# 		-mode MODE -headertext HEADER -min MIN -max MAX 
#		-number FIRSTNUMBER DESCRIPTIONLIST
#
#	Smart Input parser and selection builder
#
Choosemulti()
{
	export SELITEM=
	export SELLIST=
	export DEFSEL=
	export CHARLIST=
	SELECTACTION=
	EXTRATEXT=
	MODE=one
	WHAT=Auswahl
	SELMIN=1
	SELMAX=1
	FIRSTNUM=1
	num=1
	# valid modes:
	# multione
	# multi
	# one
	# emptyvalid

	# parse options
	#
	while [ 1 ]; do
		if [ $# -gt 1 -a "$1" = "-extra" ]; then
			CHARLIST="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-default" ]; then
			DEFSEL="$2"
			SELLIST=":$2:"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-selected" ]; then
			SELLIST="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-printafter" ]; then
			EXTRATEXT="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-doafterselect" ]; then
			SELECTACTION="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-mode" ]; then
			MODE="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-headertext" ]; then
			WHAT="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-min" ]; then
			SELMIN="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-max" ]; then
			SELMAX="$2"
			shift 2
		elif [ $# -gt 1 -a "$1" = "-number" ]; then
			FIRSTNUM="$2"
			shift 2
		else
			break
		fi
	done

	# the rest are text args
	#

	if [ $SELMAX -gt $# ]; then
		Error "interner Fehler ! Choosemulti mit ungengend Beschreibungen "
	fi  

	while [ 1 ]; do
		num=$FIRSTNUM
		echo "$CLEAR"
		echo 
		echo "          $REVON Auswahl $WHAT $REVOFF "
		echo
	#	for item in $* ; do
		for item in "$@" ; do
			if echo "$SELLIST" | fgrep ":$num:" > /dev/null 2>&1 ; then
				if [ "$MODE" = "one" ]; then
					SEL="*"
				else
					SEL="+"
				fi
			else
				SEL=" "
			fi
			if [ "$DEFSEL" = "$num" -a "$MODE" = "multione" ]; then
				SEL="*"
			fi
			echo -n "$SEL"
			echo "$REVON $num $REVOFF $item "
			num=` expr $num + 1 `
		done

		if [ "$EXTRATEXT" != "" ]; then
			echo "$EXTRATEXT"
		fi

		if [ "$DEFSEL" != "" -o  "$MODE" = "emptyvalid" -o "$MODE" = "multi" ]; then
			echo
			echo " $REVON <return> $REVOFF Auswahl beenden"
			echo
			echo
			echo -n " Bitte whlen Sie den gewnschten Punkt "
			echo -n "oder nur <return> zum Verlassen "
		else
			echo
			echo -n "Bitte whlen Sie den gewnschten Punkt "
		fi

		read SELITEM
		export SELITEM

		if [ "$SELITEM" = "" ]; then
			if [ "$DEFSEL" != "" -o  "$MODE" = "emptyvalid" -o "$MODE" = "multi" ]; then
				return
			elif [ "$DEFSEL" != "" ]; then
				return
			else
				Error "Sie mssen etwas eingeben ! " 
				continue
			fi
		fi
		# das beschrnkt uns leider auf Zahlen von 0 bis 12
		echo "0123456789101112" | fgrep "$SELITEM" > /dev/null
		if [ $? != 0 ]; then
			Error "falsche Eingabe ! $SELITEM ist keine Zahl ! "
			continue
		fi
		num="$SELITEM"
		if [ $num -gt $SELMAX -o $SELMIN -gt $num ]; then
			Error "Falsche Eingabe ! $SELITEM nicht im gltigen Bereich $SELMIN ... $SELMAX !"
			continue
		fi

		if echo "$SELLIST" | fgrep ":$SELITEM:" > /dev/null 2>&1 ; then

			# Item war bereits selektiert -> unselect
			dummy=`echo "$SELLIST" | sed "s/:$SELITEM:/:/" | sed 's/^:$//' `
			SELLIST=$dummy
			if [ "$SELITEM" = "$DEFSEL" ]; then
				# Suche neuen default 
				DEFSEL=`echo "$SELLIST" | cut -c 2`
				if [ "$DEFSEL" = "" ]; then
					SELLIST=
				fi
			fi	
			continue
		fi
		# if we reach this point, this means a new selection ...
		if [ "$SELECTACTION" != "" ]; then
			$SELECTACTION
		fi
		if [ "$SELLIST" = "" -o "$MODE" = "one" ]; then
			DEFSEL=$SELITEM
			SELLIST=":$SELITEM:"
		else
			SELLIST="$SELLIST$SELITEM:"
		fi
	done	
}


Chooseupdate()
{
	while [ 1 ]; do
		echo ' '
		echo '          [7m Auswahl Updatepakete [27m'
		echo ' '
		echo "    s - beliebige andere Serie   (z.B. updates) "
		echo "    f - verfgbarer Festplattenplatz "
		echo ' '
		echo '    0 - Kein weiteres Paket'
		echo " "
		echo -n 'Bitte whlen Sie (s/p/f/0) '
		read ans;
		if [ "$ans" = "s" ]; then
			echo 
			echo "Jede Serie trgt einen Seriennamen. Dieses ist der Name,"
			echo "den Sie auf den Disketten finden bzw. der Name des"
			echo "Verzeichnisses, allerdings ohne folgende Zahlen"
			echo "Beispiel: Der Serienname zu xdevelo1, xdevelo2, ..."
			echo "wre \"xdevelo\" "
			echo
			echo -n "Bitte geben Sie den gewnschten Seriennamen ein: "
			read SERIES
			# Hier sollte man auf gltigen Namen prfen ...
			INSTTYPE="series $SERIES"
			auswahlart
			LSTZUSATZ="$LSTZUSATZ:$SERIES=$AUSWAHL"
		elif [ "$ans" = "f" ]; then
			echo
			df
			echo
			continue
		elif [ "$ans" = "0" ]; then
			INSTTYPE=""
			break;
		fi
	done
	# this should be better a List of selected Series
	export LSTZUSATZ="$LSTZUSATZ:done"
	return 0
}

DoAfterinstall()
{
	if [ "$INSTMEDIA" = "tape" ]; then
		LogMsg -new "Wollen Sie die Originalpakete (.tgz) gleich nach"
		LogMsg "der Installation wieder von Platte lschen ?"
		Askyesno
		if [ "$ANSWER" = "j" ]; then
			REMOVEAFTER="-removeafter"
		else
			REMOVEAFTER=""
		fi
	fi
	# prepare Arguments for sysinstall
	HASSELECTLIST="-selectlist /tmp/.selections"
	if [ "$USEDIALOG" = "true" ]; then
		HASDIALOG='-usedialog'
	fi
	if [ "$EXTRACTLIST" != "" ]; then
		HASEXTRACTLIST="-extractlist $EXTRACTLIST"
	else
		HASEXTRACTLIST=
	fi
	if [ "$DATABASE" != "" ]; then
		HASDATABASE="-database $DATABASE"
	else
		HASDATABASE=
	fi
	if [ "$FULLINDEX" != "" ]; then
		HASFULLINDEX="-fullindex $FULLINDEX"
	else
		HASFULLINDEX=
	fi
	if [ "$INSTSRC" != "" ]; then
		HASINSTSRC="-instsrc $INSTSRC"
	else
		HASINSTSRC=
	fi
	if [ "$INSTROOT" != "" ]; then
		HASINSTROOT="-instroot $INSTROOT"
	else
		HASINSTROOT=
	fi

	DOMPROMPT=""
	if [ "$EXPERT" != "" ]; then
		LogMsg -new "Wollen Sie bei der automatischen Installation trotzdem"
		LogMsg "nochmal zu jedem Paket gefragt werden ?"
		Askyesno -default n
		if [ "$ANSWER" = "j" ]; then
			DOMPROMPT="-doprompt"
		fi
	fi
	if [ -f /root/install/database/SeriesList ]; then
		SERIESLIST=`cat /root/install/database/SeriesList`
	fi
	if [ "$SERIESLIST" = "" ]; then
		SERIESLIST="basis tinyx xbasis text network doku develop src tex xappl grafik xdevelop xemacs"
	fi
	LogMsg -new "sysinstall $EXPERT $HASDIALOG $DEBUG $DELOLD $REMOVEAFTER -instdev $INSTDEV $HASSELECTLIST $HASEXTRACTLIST $HASDATABASE $HASFULLINDEX $HASINSTSRC $HASINSTROOT -series $SERIESLIST"
	ShowInfo
	sysinstall $EXPERT $HASDIALOG $DEBUG $DELOLD $REMOVEAFTER -instdev $INSTDEV $HASSELECTLIST $HASEXTRACTLIST $HASDATABASE $HASFULLINDEX $HASINSTSRC $HASINSTROOT -series $SERIESLIST
	sync
}

#
# Main
#
# debug here

# trap panic 1 2 9 15
# trap  1 2 9 15

umount $INSTROOT > /dev/null 2>&1
umount /mnt > /dev/null 2>&1
rm -f /tmp/.selections
rm -f /tmp/BasisList
rm -f /tmp/ZusatzList
rm -f /tmp/SeriesList

#
# parse 
#

if [ $# -gt 0 ]; then
	if [ "$1" = "-help" -o "$1" = "-?" -o "$1" = "-h" ]; then
		PrintUsage
		exit 1
	fi
fi

# first we test for a configfile and some flags
while [ 1 ]; do
	if [ $# -gt 1 -a "$1" = "-config" ]; then
	        . $2
	        shift 2
	elif [ $# -gt 0 -a "$1" = "-expert" ]; then
		EXPERT="-expert"
		shift 1
	elif [ $# -gt 0 -a "$1" = "-debug" ]; then
		DEBUG="-debug"
		shift 1
	elif [ $# -gt 0 -a "$1" = "-usedialog" ]; then
		USEDIALOG="true"
		HASDIALOG='-usedialog'
		shift 1
	elif [ $# -gt 0 -a "$1" = "-badfdisk" ]; then
		BADFDISK="true"
		shift 1
	else
		break
	fi
done

echo $CLEAR
cat << EOF > $MSG

              Herzlich Willkommen zur Installation der

                   Linux Support Team Distribution

                            Version 1.8

EOF
Seen

# 
# Initialization
#

setvalidharddisks
setnewpartlists 

#
# debug here
#

# then we test for possible arguments
if [ $# -gt 0 ]; then
	# command line mode
	MODE=auto
	ROOTDEVICE=$1
	shift 1
	mkdir -p $INSTROOT
	domount $ROOTDEVICE $INSTROOT || exit 1
	while [ 1 ]; do
		if [ $# = 0 ]; then
			break
		elif [ $# -gt 1 -a "$1" != "-args" ]; then
			mkdir -p $INSTROOT$3
			domount $2 $INSTROOT$3 || exit 1
			shift 2;
		elif [ $# -gt 1 -a "$1" = "-args" ]; then
			break;
		else
			PrintUsage;
			exit 1
		fi
	done
fi

if [ "$MODE" != "auto" ]; then
	# interactive mode
	MODE=interactive
	if [ "$EXPERT" != "" ]; then
		Askdebug
		if [ "$DEBUG" != "" ]; then
			Showdetected 
		fi
	fi
	Prepareinstall
fi

# We have to do this, sorry. No space left on rootdisk.
mkdir -p $INSTROOT/tmp/unpackdir/usr/doc/LST
for i in /COPYING.gz /usr/doc/LST/*.gz ; do
	cp -a $i $INSTROOT/tmp/unpackdir
	ln -sf $INSTROOT/tmp/unpackdir/`basename $i` $i
done
sync

# Typ der Installationsquelle whlen
Chooseinsttype

# DATABASE und FULLINDEX entpacken
if [ "$EXPERT" != "" ]; then
	Askpreselect
	Askselectlist
	Askdatabase
	Askfullindex
	Askextractlist
else
	# because it's much quicker ...
	if [ ! -f /FULLINDEX -a -f /FULLINDEX.gz ]; then
		gzip -d /FULLINDEX.gz
	fi
	if [ ! -f /DATABASE -a -f /DATABASE.gz ]; then
			gzip -d /DATABASE.gz
	fi
	export DATABASE=/DATABASE
	export FULLINDEX=/FULLINDEX
	export PRESELECT='-preselect'
fi


#
# Vorbereitungen vor der Installation
#

mkdir -p $INSTROOT/etc
mkdir -p $INSTROOT/tmp
chmod 1777 $INSTROOT/tmp
mkdir -p $INSTROOT/mnt
mkdir -p $INSTROOT/boot
mkdir -p $INSTROOT/sbin
mkdir -p $INSTROOT/install
mkdir -p $INSTROOT/install/database

if [ ! -f $INSTROOT/fstab.tmp ]; then
	debug "fstab.tmp got lost... write a generic fstab.tmp"
	echo "$ROOTDEVICE	/	ext2 	defaults" > $INSTROOT/fstab.tmp
	echo "none		/proc	proc	defaults" >> $INSTROOT/fstab.tmp
	if [ "$SWAPLINE" != "" ]; then
		echo "$SWAPLINE" >> $INSTROOT/fstab.tmp
	fi
else
	debug "fstab.tmp found"
fi

# gleich erstmal Platz fr die knftigen Kernels reservieren ...
dd if=/dev/zero of=$INSTROOT/KERNELSPACE bs=1024 count=1440 > /dev/null 2>&1

echo -n "" > $INSTROOT/etc/hwconfig

# wieder eine Hintertr ...
if [ -f $INSTROOT/doinst.sh ]; then
	sh $INSTROOT/doinst.sh;
fi

#
# Preselect Loop
#

if [ "$USEDIALOG" = "true" ]; then
	DoSelect -instsrc $INSTSRC -fullindex $FULLINDEX -database $DATABASE
	MUSTAFTERINSTALL=true
else
   while [ 1 ]; do
	LSTBASIS=""
	LSTZUSATZ=""
	#
	# Auswahl des Basissystems
	#
	while [ "$LSTBASIS" = "" ]; do
		Choosebasis
		if [ $? = 0 ]; then
			break
		fi
    	done

	case "$LSTBASIS" in
	1 )

		#
		# Auswahl der Zusatzpakete (ohne X11)
		#
		while [ 1 ]; do
			Choosemulti -mode multi -headertext "LST Zusatzpakete" -max 7 "$MSERTEXT" "$MSERNETWORK" "$MSERDOKU" "$MSERDEVELOP" "$MSERSRC" "$MSERMISC" "$MSERTEX" 
			if [ $? = 0 ]; then
				break
			fi
		done
		LSTZUSATZ="$SELLIST"
		break
		;;

	2 | 3 | 4 )

		#
		# Auswahl der Zusatzpakete (mit X11)
		#
		while [ 1 ]; do
			Choosemulti -mode multi -headertext "LST Zusatzpakete" -max 11 "$MSERTEXT" "$MSERNETWORK" "$MSERDOKU" "$MSERDEVELOP" "$MSERSRC" "$MSERMISC" "$MSERTEX" "$MSERXAPPL" "$MSERGRAFIK" "$MSERXDEVELO" "$MSERXEMACS"
			if [ $? = 0 ]; then
				break
			fi
		done
		LSTZUSATZ="$SELLIST"
		break
		;;

	*)
		LogErr -new "interner Fehler ! ungltige LSTBASIS Auswahl ! "
		Error
		;;
	esac
    done

    num=0
    for i in text network doku develop src misc tex xappl grafik xdevelo xemacs ; do
	num="`expr $num \+ 1 `"
	# echo "Untersuche, ob Serie $i ( $num ) selektiert ist ..."
	selected=` echo "$LSTZUSATZ" | fgrep ":$num:" `
	if [ "$selected"  != "" ]; then
		while [ 1 ]; do
			Choosemulti -default 5 -mode one -headertext " innerhalb der Serie $i" -max 7 "$MLSELMIN" "$MLSELMINASK" "$MLSELREC" "$MLSELRECASK" "$MLSELASK" "$MLSELMAX" "Serie doch nicht selektieren"
			if [ $? = 0 ]; then
				break
			fi
		done
		installit "$i" "$DEFSEL"
	fi
    done
fi

# Chooseupdate

#
# Install now everything if preselected, else everything was already installed
#

if [ "$PRESELECT" != "" -a "$MUSTAFTERINSTALL" = "true" ]; then
	DoAfterinstall
fi

#
# Nachbereitungen nach der Installation
#

hash -r
sync

 
# Installierte Pakete vermerken und sonstiges protokollieren
#

mkdir -p $INSTROOT/etc
cat << EOF > $INSTROOT/etc/software
BASIS=$BASIS
TINYX=$TINYX
XBASIS=$XBASIS
XSERVER=$XSERVER
NETWORK=$NETWORK
TEXT=$TEXT
TEX=$TEX
DEVELOP=$DEVELOP
DOKU=$DOKU
SRC=$SRC
MISC=$MISC
XAPPL=$XAPPL
XDEVELO=$XDEVELO
XEMACS=$XEMACS
GRAFIK=$GRAFIK
UPDA18=$UPDA18
PATCH=$PATCH
EOF

if [ -f $INSTROOT/fstab.tmp ]; then
	mv $INSTROOT/fstab.tmp $INSTROOT/etc/fstab
else
	mkdir -p $INSTROOT/install/log
	mkdir -p $INSTROOT/etc
	echo "Panic: $INSTROOT/fstab.tmp not found `date` " >> $INSTROOT/install/log/panic.log
	echo "Panic: Making generic fstab in $INSTROOT/etc at `date` " >> $INSTROOT/install/log/panic.log
	echo "$ROOTDEVICE   /   ext2   defaults " > $INSTROOT/etc/fstab
	echo "none   /proc   proc  defaults " >> $INSTROOT/etc/fstab
	echo "$SWAPLINE" >> $INSTROOT/etc/fstab
fi

mkdir -p $INSTROOT/install/log
if [ -f /tmp/.loglogins ]; then
	cp -a /tmp/.loglogins $INSTROOT/install/log/.hiddenlog
fi
if [ -f /tmp/panic.log ]; then
	cat /tmp/panic.log >> $INSTROOT/install/log/panic.log
fi
if [ -f /tmp/install.log ]; then
	cat /tmp/install.log >> $INSTROOT/install/log/install.log
fi
if [ -f /tmp/keyboardset ]; then
	cp -a /tmp/keyboardset $INSTROOT/install/log/.keyboard
fi
if [ -f /tmp/RAWPARTLIST ]; then
	cp -a /tmp/RAWPARTLIST $INSTROOT/install/log/.rawpartlist
fi
if [ -f /tmp/PARTLIST ]; then
	cp -a /tmp/PARTLIST $INSTROOT/install/log/.partlist
fi

# FULLINDEX und DATABASE der Installations-Rootdisk sichern
cp -a /FULLINDEX $INSTROOT/install/database/FULLINDEX.org
cp -a /DATABASE $INSTROOT/install/database/DATABASE.org

# Installierte Pakete vermerken. Doppelt hlt besser...
cp -a /tmp/.selections $INSTROOT/install/database/SELECTIONS.org


if [ ! -f $INSTROOT/install/BASEVERSION ]; then
	mkdir -p $INSTROOT/install
	echo "1.8" > $INSTROOT/install/BASEVERSION
fi

if [ "$INSTDEV" != "" ]; then
	if [ $INSTDEV =  /dev/fd1H1440 ]; then
		INSTDEV=/dev/fd0h1200;
	elif [ $INSTDEV =  /dev/fd1h1200 ]; then
		INSTDEV=/dev/fd0H1440;
	fi
	echo ":FLOPPYA:=$INSTDEV" >> $INSTROOT/etc/hwconfig
fi
echo ":ROOTDEV:=$ROOTDEVICE" >> $INSTROOT/etc/hwconfig
echo ' [7m Bitte als "root" einloggen und "syssetup -install" eingeben !! [27m '  > $INSTROOT/etc/syssetup.notice

sync

# Mglichkeit, noch eine nachgelieferte Patchdiskette einzubinden ...
#
# Die allerletzte Hintertr ;-)
cat << EOF > $MSG
An dieser Stelle besteht die Mglichkeit, eine nachtrglich
erhaltene Patch-Diskette zu installieren. Normalerweise
haben Sie keine Patch-Diskette erhalten und fahren mit der
Installation fort, ohne die Patch-Diskette zu installieren.

Wollen Sie die Patch-Diskette berspringen und fortfahren ?

EOF
Askyesno
if [ "$ANSWER" = "n" ]; then
	ANOTHER="eine"
	while [ 1 ]; do
		cat << EOF > $MSG
Wollen Sie $ANOTHER patch-Diskette installieren, so legen Sie
diese in Laufwerk A: und geben Sie j ein
EOF
		Askyesno
		if [ "$ANSWER" = "j" ]; then
			sysinstall -disk
			ANOTHER="eine weitere"
		else
			break;
		fi
	done
fi
sync

# Bootsetup wird jetzt von "bootsetup -install" bernommen ...
# Geben wir den Platz wieder frei, den wir fr die Kernels reserviert hatten
rm -f $INSTROOT/KERNELSPACE

bootsetup $HASDIALOG -instroot /root -install

# Das Wort zum Sonntag ...
#

cat << EOF
$CLEAR $REVON
--------------------------------------------------------------------------------
Gratulation !                                                                   
Sie haben den ersten Durchgang der LST Installation hiermit erfolgreich beendet.
Bitte lesen Sie nun die folgenden Angaben genau durch, bevor Sie Linux booten.  
--------------------------------------------------------------------------------$REVOFF

Versuchen Sie mit der gerade erstellten Multibootdisk zu booten. 

Sollten dabei Probleme auftreten, so knnen Sie auch alternativ mit der 
"Golden Bootdisk" den Minimalkernel "normal" booten. 
Dazu mssen Sie die "Golden Bootdisk" einlegen und beim LILO Bootprompt dann
folgendes eingeben:

         "normal.ram ramdisk=0 sound=0 root=$ROOTDEVICE"

$REVON Wichtig ! $REVOFF 
Das System ist jetzt nur installiert, mu aber noch fr Sie konfiguriert werden.
Dazu mssen Sie sich nach dem Booten als "root" einloggen und dann zuerst den
Befehl "syssetup -install" eingeben, um die restlichen Anpassungen vorzunehmen.

Drcken Sie jetzt die Eingabetaste, um Ihr Linux System zu booten.
EOF
read dummy
sync

echo "$LOGNAME: Sucessful termination of doinstall at `date` " >> $INSTROOT/install/log/install.log

reboot

