#!/bin/sh

echo "Preparing LISA ..." > /dev/tty8

export PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export TERM=linux
export DIR_LIVE_LISA="/mnt/install/live/lisa"

# ====================================================================
# old rc.S
# ====================================================================

# switch to tty1
chvt 1

# clear screen
echo "c"

# disable screen blank
echo "[9;0]"

# activate LISA environment
ln -s $DIR_LIVE_LISA/boot/os2_d.b /boot/os2_d.b
cp -a $DIR_LIVE_LISA/etc/lst.cnf /etc
cp -a $DIR_LIVE_LISA/etc/system.cnf /etc
cp -a $DIR_LIVE_LISA/etc/lilo.conf.in /etc
ln -s $DIR_LIVE_LISA/bin/box /bin/box
ln -s $DIR_LIVE_LISA/bin/build_menu /bin/build_menu
ln -s $DIR_LIVE_LISA/bin/db_printf /bin/db_printf
ln -s $DIR_LIVE_LISA/bin/do_quote /bin/do_quote
ln -s $DIR_LIVE_LISA/bin/get_key /bin/get_key
ln -s $DIR_LIVE_LISA/bin/lisa /bin/lisa
ln -s $DIR_LIVE_LISA/bin/passwd /bin/passwd
ln -s $DIR_LIVE_LISA/bin/prep_use /bin/prep_use
ln -s /bin/prep_use /bin/end_use
ln -s /bin/prep_use /bin/not_use
ln -s $DIR_LIVE_LISA/sbin/activate /sbin/activate
ln -s $DIR_LIVE_LISA/sbin/badblocks /sbin/badblocks
gunzip /sbin/fdisk.gz
ln -s $DIR_LIVE_LISA/sbin/isapnp /sbin/isapnp
ln -s $DIR_LIVE_LISA/sbin/lilo /sbin/lilo
ln -s $DIR_LIVE_LISA/sbin/mke2fs /sbin/mke2fs
ln -s $DIR_LIVE_LISA/sbin/pnpdump /sbin/pnpdump
mkdir -p /usr/doc/LST
ln -s $DIR_LIVE_LISA/usr/doc/LST/use-fdisk.gz /usr/doc/LST/use-fdisk.gz
mkdir -p /usr/lib/rpm-3.0.3
ln -s $DIR_LIVE_LISA/usr/lib/rpm-3.0.3/rpmrc /usr/lib/rpm-3.0.3/rpmrc
mkdir -p /usr/lib/LST
ln -s $DIR_LIVE_LISA/usr/lib/LST/libLSTall /usr/lib/LST/libLSTall
ln -s $DIR_LIVE_LISA/usr/lib/LST/libLSTtext.gz /usr/lib/LST/libLSTtext.gz
mkdir -p /usr/lib/kbd/keytables
ln -s $DIR_LIVE_LISA/usr/lib/kbd/keytables/master.map.gz /usr/lib/kbd/keytables/master.map.gz
mkdir -p /usr/bin
ln -s $DIR_LIVE_LISA/usr/bin/loadkeys /usr/bin/loadkeys
ln -s $DIR_LIVE_LISA/usr/bin/rdev /usr/bin/rdev
mkdir -p /usr/sbin
ln -s $DIR_LIVE_LISA/usr/sbin/useradd /usr/sbin/useradd

box --info "Please wait"
sleep 2

# parse lst configuration file
. /etc/lst.cnf

# save boot image name
echo "$BOOT_IMAGE" > $FILE_BOOT_IMAGE

# save boot params
rm -f $FILE_BOOT_PARAMS
if [ -f /proc/cmdline ]; then
	KERNEL_BOOTPARAMS="`cat /proc/cmdline`"
fi
if [ -n "$KERNEL_BOOTPARAMS" ]; then
	for i in $KERNEL_BOOTPARAMS ; do
		echo "$i" >> $FILE_BOOT_PARAMS
	done
fi

# set the default language to english
set_val CONF_LST_LANG "us"

# switch to expert mode if requested
MODE_USER=newbie
if [ -n "`fgrep -x expert $FILE_BOOT_PARAMS`" ]; then
	MODE_USER=expert
	set_val MODE_USER expert
fi

# switch to box log mode if requested
if [ -n "`fgrep -x log $FILE_BOOT_PARAMS`" ]; then
	echo "0" > /tmp/.log
fi

set_val -f /etc/lst.cnf CONF_COL_EDITION COL
set_val MODE_QUERY prompt

# set values we might have received through DHCP
bpf=/tmp/bootpc.out
if [ -s $bpf ]; then
	CONF_FQ_HOSTNAME="`get_val -f $bpf HOSTNAME`"
	set_val CONF_FQ_HOSTNAME "$CONF_FQ_HOSTNAME"
	set_val CONF_eth0_STAT "up"
	set_val CONF_eth0_DEV "eth0"
	set_val CONF_eth0_NAME "$CONF_FQ_HOSTNAME"
	CONF_eth0_IP="`get_val -f $bpf IPADDR`"
	set_val CONF_eth0_IP "$CONF_eth0_IP"
	CONF_eth0_MASK="`get_val -f $bpf NETMASK`"
	set_val CONF_eth0_MASK "$CONF_eth0_MASK"
	set_val CONF_eth0_BCAST "`get_val -f $bpf BROADCAST`"
	CONF_eth0_NET="`get_val -f $bpf NETWORK`"
	if [ -z "$CONF_eth0_NET" ]; then
		CONF_eth0_NET="`do_netcalc -n $CONF_eth0_IP $CONF_eth0_MASK`"
	fi
	set_val CONF_eth0_NET "$CONF_eth0_NET"
	set_val CONF_ROUTER1_IP "`get_val -f $bpf GATEWAYS`"
	set_val CONF_DNS_SERVER1_IP "`get_val -f $bpf DNSSRVS`"
	set_val CONF_DNS_DOMAIN "`echo $CONF_FQ_HOSTNAME | cut -d'.' -f 2-`"
	set_val CONF_DNS_SEARCH "$CONF_DNS_DOMAIN"
fi

# re-parse lst configuration file
. /etc/lst.cnf

echo ">>> init: analysing system: $MODE_SPEED $CONF_COL_EDITION install using $MODE_USER $MODE_QUERY mode." > /dev/tty8

hostname noname

prep_use SINGLE
prep_use MULTI

# ====================================================================
# old rc.setup
# ====================================================================

# parse /etc/lst.cnf
. /etc/lst.cnf

Debug()
{
	echo "$@" > /dev/tty8
}

Check_Low_RAM()
{
	# check for sufficient memory
	Debug "Checking for sufficient memory ..."
	Debug "`filesize /proc/kcore` Bytes RAM found"
	if [ `filesize /proc/kcore` -ge 12582912 ]; then
		return 0
	fi
	echo
	sysinfo --mem
	sysinfo --notitle --swap
	cat << EOF

!!! Error !!!  Not enough main memory (RAM) available  !!! Error !!!

Installation can only proceed automatically with at least 16 MB RAM.

If you know how to configure swap space using "fdisk", "mkswap" and
"swapon" then you can do that now and when you have finished type
"exit" to proceed with the installation.

If you are not an experienced user you should better install more RAM
and try again from scratch.

EOF
	/bin/sh
	return 0
}

Setup_PnP()
{
	Debug "Disabling plug & play cards ..."
	if [ -f /sbin/pnpdump.gz ]; then
		gzip -df /sbin/pnpdump.gz
	fi
	if [ -f /sbin/isapnp.gz ]; then
		gzip -df /sbin/isapnp.gz
	fi
	if [ -x /sbin/pnpdump -a -x /sbin/isapnp ]; then
		Debug "Running pnpdump ..."
		/sbin/pnpdump > /etc/pnp.conf
		if [ $? -eq 0 ]; then
			Debug "Running pnpdump ..."
			/sbin/isapnp /etc/pnp.conf
			if [ $? -ne 0 ]; then
				Debug "Error: isapnp failed"
			fi
		else
			Debug "Error: pnpdump failed"
		fi
	fi
}

Menu_Read_Previous_Config()
{

  local i
  local dummy
  local nothing=true
  local use_preset=n
  local my_lang="`get_val CONF_LST_LANG`"

  $CMD_BOX --title ":ASK_READ_PREVIOUS_CONFIG_TITLE:" \
	--help ":ASK_READ_PREVIOUS_CONFIG_HELP:" \
	--default "n" \
	--bool ":ASK_READ_PREVIOUS_CONFIG_TEXT:" 2> /tmp/LST/answer || return 1
  if [ -s /tmp/LST/answer ]; then
  	use_preset="`cat /tmp/LST/answer`"
  fi
  if [ "$use_preset" != "0" ]; then
	return 0
  fi

  $CMD_BOX --msg "Insert the floppy with your personal config files and press <Enter>."
  mount -r -t ext2 /dev/fd0H1440 /floppy >/dev/tty8 2>&1
  if [ $? -ne 0 ]; then
  	mount -r -t msdos /dev/fd0H1440 /floppy >/dev/tty8 2>&1
	if [ $? -ne 0 ]; then
  		$CMD_BOX --msg "Error. Floppy could not be mounted."
	fi
  fi

  $CMD_BOX --info "Reading config files from floppy. Please wait..."

  echo -n "Copying" > /dev/tty8
  for i in /etc/lst.cnf /etc/system.cnf /usr/lib/LST/pkgs.sel ; do
    if [ -f /floppy/$i ]; then
      nothing=
      echo -n " `basename /floppy/$i`" > /dev/tty8
      cp -a /floppy/$i $i
    fi
  done
  if [ "$nothing" = "true" ]; then
    echo " nothing (no preset files found)" > /dev/tty8
  else
    echo > /dev/tty8
  fi
  # the language we selected during this run overrides the old configuration
  set_val CONF_LST_LANG "$my_lang"
  umount /floppy >/dev/tty8 2>&1
}

Choose_Lang()
{
	local i
	local lang_list_supported="us de fr it es pt"
	local lang_list_available=""
	local major_edition="`get_val -f /etc/lst.cnf CONF_LST_EDITION`"
	local my_lang="`get_val CONF_LST_LANG`"
	local fixed_title="Language Selection"
	local fixed_message="The following languages are currently available. Use the arrow keys to select."

	if [ "$major_edition" != "LST" -a "$major_edition" != "COL" ]; then
		major_edition="LST"
	fi

	$CMD_BOX --info "Scanning for available languages. Please wait."
	sleep 1

	# dynamically determine available languages from libLSTtext header line
	lang_list_available="`gzip -dc /usr/lib/LST/libLSTtext.gz | sed -n "/^# Languages: /s/^# Languages: //p"`"

	# do not ask any questions if a single language is available only
	if [ -z "`echo "$lang_list_available" | sed -n '/ /p'`" ]; then
		echo "$lang_list_available" > /tmp/LST/answer
	else
		cat << EOF > /tmp/LST/command
#!/bin/sh
$CMD_BOX --title "$fixed_title" \\
	--default "$my_lang" \\
	--one "$fixed_message" \\
EOF
		for i in $lang_list_available ; do
			case $i in
			us)
				echo "\"us\"	\"English\" \\" >> /tmp/LST/command
				;;
			de)
				echo "\"de\"	\"Deutsch\" \\" >> /tmp/LST/command
				;;
			fr)
				echo "\"fr\"	\"Français\" \\" >> /tmp/LST/command
				;;
			it)
				echo "\"it\"	\"Italiano\" \\" >> /tmp/LST/command
				;;
			es)
				echo "\"es\"	\"Español\" \\" >> /tmp/LST/command
				;;
			pt)
				echo "\"pt\"	\"Portuguese\" \\" >> /tmp/LST/command
				;;
			esac
		done
		echo "2> /tmp/LST/answer" >> /tmp/LST/command
		chmod 755 /tmp/LST/command
		sh /tmp/LST/command || return 1
	fi

	if [ -s /tmp/LST/answer ]; then
		my_lang="`cat /tmp/LST/answer`"
	fi
	
	set_val CONF_LST_LANG "$my_lang"

	case $my_lang in
	de)
		$CMD_BOX --info "Das Sprachmodul wird geladen. Bitte warten."
		set_val CONF_KEYBOARD_MAP "de-latin1-nodeadkeys.map"
		set_val CONF_TIMEZONE "MET"
		set_val CONF_PRINTER1_PAPER "a4"
		;;
	fr)
		$CMD_BOX --info "Le langage choisi est en cours, patientez un instant s'il vous plaît."
		set_val CONF_KEYBOARD_MAP "fr-latin1.map"
		set_val CONF_TIMEZONE "MET"
		set_val CONF_PRINTER1_PAPER "a4"
		;;
	it)
		$CMD_BOX --info "The language module is being loaded. Please wait."
		set_val CONF_KEYBOARD_MAP "it.map"
		set_val CONF_TIMEZONE "MET"
		set_val CONF_PRINTER1_PAPER "a4"
		;;
	es)
		$CMD_BOX --info "The language module is being loaded. Please wait."
		set_val CONF_KEYBOARD_MAP "es.map"
		set_val CONF_TIMEZONE "MET"
		set_val CONF_PRINTER1_PAPER "a4"
		;;
	pt)
		$CMD_BOX --info "The language module is being loaded. Please wait."
		# FIXME: we only have a brazilian portuguese map
		set_val CONF_KEYBOARD_MAP "br.map"
		set_val CONF_TIMEZONE "MET"
		set_val CONF_PRINTER1_PAPER "a4"
		;;
	*)
		$CMD_BOX --info "The language module is being loaded. Please wait."
		set_val CONF_KEYBOARD_MAP "us.map"
		set_val CONF_TIMEZONE "US/Mountain"
		set_val CONF_PRINTER1_PAPER "letter"
		;;
	esac
	mkdir -p /usr/lib/LST/$my_lang
	gzip -dc /usr/lib/LST/libLSTtext.gz | sed "{
		s/^${my_lang}-$major_edition> //
		s/^${my_lang}-x> //
		s/^x-$major_edition> //
		s/^x-x> //
		s/^${my_lang}> //
		s/^x> //
		/^[a-z]\{2\}-[A-Za-z]\{3,5\}> /d
	        /^x-[A-Za-z]\{3,5\}> /d
		/^[a-z]\{2\}-x> /d
		}"  > /usr/lib/LST/libLSTtext
	ln -s ../libLSTtext /usr/lib/LST/$my_lang/libLSTtext
	return 0
}

Get_Keyboard_Map()
{
	local map_path=/usr/lib/kbd/keytables
	local master_map=${map_path}/master.map.gz
	local Mp=$1
	local N
  
	N=`zcat $master_map | sed -n "/^$Mp=/p" | cut -d'=' -f 2`
	zcat $master_map | sed -n 's/^.*\:'$N'\:[^ ]* //p'
}

Choose_Keymap()
{
	local keymap="`get_val CONF_KEYBOARD_MAP`"

	# FIXME: the available keymaps should be determined dynamically
	$CMD_BOX --title ":CHOOSE_KEYBOARD_FIRST_TITLE:" \
		--help ":CHOOSE_KEYBOARD_FIRST_HELP:" \
		--default "$keymap" \
		--one ":CHOOSE_KEYBOARD_FIRST_TEXT:" \
		"us.map"	":TYPE_KEYBOARD_US:" \
		"uk.map"	":TYPE_KEYBOARD_UK:" \
		"de-latin1-nodeadkeys.map" ":TYPE_KEYBOARD_GERMAN:" \
		"fr-latin1.map" ":TYPE_KEYBOARD_FRENCH:" \
		"it.map" ":TYPE_KEYBOARD_ITALIAN:" \
		"fi-latin1.map" ":TYPE_KEYBOARD_FINISH:" \
		"es.map" ":TYPE_KEYBOARD_SPANISH:" \
		"br.map" ":TYPE_KEYBOARD_BRAZILIAN_PORTUGUESE:" 2> /tmp/LST/answer || return 1

	if [ -s /tmp/LST/answer ]; then
		keymap="`cat /tmp/LST/answer`"
		$CMD_BOX --info ":INFO_LOADING_KEYBOARD:"
		Get_Keyboard_Map `basename $keymap .map` | /usr/bin/loadkeys
		set_val CONF_KEYBOARD_MAP "$keymap"
	fi
	return 0
}

Ask_Disable_PnP()
{
	local disable_pnp="`get_val CONF_SETUP_DISABLE_PNP`"
	local defval=n
	local ans

	if [ "$disable_pnp" = "on" ]; then
		defval=y
	fi

	$CMD_BOX --title ":ASK_DISABLE_PNP_TITLE:" \
		--help ":ASK_DISABLE_PNP_HELP:" \
		--default "$defval" \
		--bool ":ASK_DISABLE_PNP_TEXT:" 2> /tmp/LST/answer || return 1
	if [ -s /tmp/LST/answer ]; then
		ans="`cat /tmp/LST/answer`"
	fi
	if [ "$ans" = "0" ]; then
		set_val CONF_SETUP_DISABLE_PNP on
	else
		set_val CONF_SETUP_DISABLE_PNP off
	fi
	return 0
}

Ask_Use_BOOTP()
{
	local use_bootp="`get_val CONF_SETUP_USE_BOOTP`"
	local defval=n
	local ans

	if [ "$use_bootp" = "on" ]; then
		defval=y
	fi

	$CMD_BOX --title ":ASK_USE_BOOTP_TITLE:" \
		--help ":ASK_USE_BOOTP_HELP:" \
		--default "$defval" \
		--bool ":ASK_USE_BOOTP_TEXT:" 2> /tmp/LST/answer || return 1
	if [ -s /tmp/LST/answer ]; then
		ans="`cat /tmp/LST/answer`"
	fi
	if [ "$ans" = "0" ]; then
		set_val CONF_SETUP_USE_BOOTP on
	else
		set_val CONF_SETUP_USE_BOOTP off
	fi
	return 0
}

Ask_Use_Netprobe()
{
	local use_netprobe="`get_val CONF_SETUP_USE_NETPROBE`"
	local defval=n
	local ans

	if [ "$use_netprobe" = "on" ]; then
		defval=y
	fi

	$CMD_BOX --title ":ASK_USE_NETPROBE_TITLE:" \
		--help ":ASK_USE_NETPROBE_HELP:" \
		--default "$defval" \
		--bool ":ASK_USE_NETPROBE_TEXT:" 2> /tmp/LST/answer || return 1
	if [ -s /tmp/LST/answer ]; then
		ans="`cat /tmp/LST/answer`"
	fi
	if [ "$ans" = "0" ]; then
		set_val CONF_SETUP_USE_NETPROBE on
	else
		set_val CONF_SETUP_USE_NETPROBE off
	fi
	return 0
}

Choose_Netprobe()
{
	local probes
	local i

	$CMD_BOX --title ":CHOOSE_NETPROBE_TITLE:" \
		--help ":CHOOSE_NETPROBE_HELP:" \
		--multi ":CHOOSE_NETPROBE_TEXT:" \
		hostname "hostname" S \
		netmask "netmask" S \
		gateway "gateway" S \
		nameserver "nameserver" S \
		nisdomain "nisdomain" U \
		nisserver "nisserver" U 2> /tmp/LST/answer || return 1

	for i in `cat /tmp/LST/answer` ; do
		probes="$probes $i"
	done
	set_val CONF_SETUP_NETPROBE_PROBES "$probes"
	return 0
}

Menu_Setup_LISA()
{
	local choice=DONE
	local disable_pnp
	local use_bootp
	local use_netprobe

	while [ 1 ]; do
		disable_pnp="`get_val CONF_SETUP_DISABLE_PNP`"
		use_bootp="`get_val CONF_SETUP_USE_BOOTP`"
		use_netprobe="`get_val CONF_SETUP_USE_NETPROBE`"
		$CMD_BOX --title ":MENU_SETUP_LISA_TITLE:" \
			--help ":MENU_SETUP_LISA_HELP:" \
			--default "$choice" \
			--menu ":MENU_SETUP_LISA_TEXT:" \
			pnp ":MENU_DISABLE_PNP: [$disable_pnp]" \
			bootp ":MENU_USE_BOOTP: [$use_bootp]" \
			netprobe ":MENU_USE_NETPROBE: [$use_netprobe]" \
			DONE ":MENU_SETUP_LISA_DONE:" 2> /tmp/LST/answer || return 1
		if [ -s /tmp/LST/answer ]; then
			choice="`cat /tmp/LST/answer`"
		fi
		case $choice in
		pnp)
			Ask_Disable_PnP
			;;
		bootp)
			Ask_Use_BOOTP
			;;
		netprobe)
			while [ 1 ]; do
				Ask_Use_Netprobe
				use_netprobe="`get_val CONF_SETUP_USE_NETPROBE`"
				if [ "$use_netprobe" = "on" ]; then
					Choose_Netprobe || continue
				fi
				break
			done
			;;
		DONE)
			return 0
			;;
		esac
	done
}

Cleanup_Ramdisk()
{
	local my_lang="`get_val CONF_LST_LANG`"
	local lang_list_supported="`get_val CONF_LST_LANG_SUPPORTED`"

	$CMD_BOX --info ":INFO_WAIT:"

	# remove unused message catalog
	rm -f /usr/lib/LST/libLSTtext.gz

	# FIXME: currently we only have an english /etc/issue
	# copy right /etc/issue in place
	if [ -f /usr/lib/LST/$my_lang/issue.gz ]; then
		mv /usr/lib/LST/$my_lang/issue.gz /etc/issue.gz
	fi
	if [ -f /etc/issue.gz ]; then
		gzip -df /etc/issue.gz
	fi
	for i in $lang_list_supported ; do
		rm -f /usr/lib/LST/$i/issue.gz
	done

	# remove all keymaps
	rm -fr /usr/bin/loadkeys /usr/lib/kbd

	# disable PnP if requested	
	if [ "`get_val CONF_SETUP_DISABLE_PNP`" = "on" ]; then
		Setup_PnP
	fi

	# remove PnP tools
	rm -f /sbin/pnpdump* /sbin/isapnp*
}

Menu_Setup()
{
	local setup_state=2

	while [ 1 ]; do
		setup_state="`do_calc $setup_state - 1`"
		case $setup_state in
		1)
			Check_Low_RAM
			;;
		2)
			Choose_Lang
			;;
		3)
			Choose_Keymap || continue
			;;
		4)
			Menu_Read_Previous_Config || continue
			;;
		5)
			Menu_Setup_LISA || continue
			;;
		6)
			Cleanup_Ramdisk
			;;
		7)
			break
			;;
		esac
		setup_state="`do_calc $setup_state + 2`"
	done
}

Debug "Running rc.setup ..."
Menu_Setup

exit 0

