#!/bin/bash
# /KNOPPIX/etc/init.d/knoppix-autoconfig
# Basic system configuration and hardware setup
# (C) Klaus Knopper <knopper@knopper.net> 2001

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
export PATH

umask 022

# Ignore these signals: INT, TERM, SEGV
trap "" 2 3 11

# ANSI COLORS
CRE="
[K"
NORMAL="[0;39m"
# RED: Failure or error message
RED="[1;31m"
# GREEN: Success message
GREEN="[1;32m"
# YELLOW: Descriptions
YELLOW="[1;33m"
# BLUE: System messages
BLUE="[1;34m"
# MAGENTA: Found devices or drivers
MAGENTA="[1;35m"
# CYAN: Questions
CYAN="[1;36m"
# BOLD WHITE: Hint
WHITE="[1;37m"

### Utility Function(s)

# Simple shell grep
stringinfile(){
case "$(cat $2)" in *$1*) return 0;; esac
return 1
}

# same for strings
stringinstring(){
case "$2" in *$1*) return 0;; esac
return 1
}

# Reread boot command line; echo last parameter's argument or return false.
getbootparam(){
stringinstring "$1=" "$CMDLINE" || return 1
result="${CMDLINE##*$1=}"
result="${result%%[ 	]*}"
echo "$result"
return 0
}

# Check boot commandline for specified option
checkbootparam(){
stringinstring "$1" "$CMDLINE"
return "$?"
}

### EOF utility functions

# We need /proc here, so mount it in case we skipped the bootfloppy
[ -f /proc/version ] || mount -t proc none /proc 2>/dev/null

# Read in boot parameters
# This should work, but doesn't with Kernel 2.4.19-rc1
# CMDLINE="$(</proc/cmdline)" This should work, but doesn't with Kernel 2.4.19-rc1
# This works.
CMDLINE="$(cat /proc/cmdline)"


# Check if we are in interactive startup mode
INTERACTIVE=""
stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes"

# Check if we want the config floppy
MYCONF=""
case "$CMDLINE" in *myconf*|*floppyconf*|*custom*) MYCONF="yes"; ;; esac

### localization
# Allow language specification via commandline. The default language
# will be overridden via "lang=de" boot commandline
LANGUAGE="$(getbootparam lang 2>/dev/null)"
[ -n "$LANGUAGE" ] || LANGUAGE="de"

# The default language/keyboard to use. This CANNOT be autoprobed.
# Most of these variables will be used to generate the KDE defaults
# and will be inserted into /etc/sysconfig/* below.
case "$LANGUAGE" in
de)
# German version
COUNTRY="de"
LANG="de_DE@euro"
KEYTABLE="de-latin1-nodeadkeys"
XKEYBOARD="de"
KDEKEYBOARD="de"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="us,fr"
;;
# BG version
bg)
LANGUAGE="bg"
COUNTRY="bg"
LANG="bg_BG"
KEYTABLE="bg"
XKEYBOARD="bg"
KDEKEYBOARD="bg"
CHARSET="microsoft-cp1251"
# Additional KDE Keyboards
KDEKEYBOARDS="us,de,fr"
;;
# Swiss version (basically de with some modifications)
ch)
LANGUAGE="de"
COUNTRY="ch"
LANG="de_CH"
KEYTABLE="sg-latin1"
XKEYBOARD="de_CH"
KDEKEYBOARD="de_CH"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="de,us,fr"
;;
cn)
# Simplified Chinese version
COUNTRY="cn"
LANG="zh_CN.GB2312"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="gb2312.1980-0"
# Additional KDE Keyboards
KDEKEYBOARDS="us,de,fr"
XMODIFIERS="@im=Chinput"
;;
# Czech version
cs|cz)
LANGUAGE="cs"
COUNTRY="cs"
LANG="cs_CZ"
KEYTABLE="cz-lat2"
XKEYBOARD="cs"
KDEKEYBOARD="cs"
CHARSET="iso8859-2"
# Additional KDE Keyboards
KDEKEYBOARDS="us,de,fr"
;;
dk|da)
# Dansk version
COUNTRY="dk"
LANG="da_DK"
# Workaround: "dk" broken in gettext, use da:da_DK
LANGUAGE="da:da_DK"
# Keytable "dk" is correct.
KEYTABLE="dk"
XKEYBOARD="dk"
KDEKEYBOARD="dk"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="dk,de,us,fr"
;;
es)
# Spanish version
COUNTRY="es"
LANG="es_ES@euro"
KEYTABLE="es"
XKEYBOARD="es"
KDEKEYBOARD="es"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="de,us,fr"
;;
fr)
# french version
COUNTRY="fr"
LANG="fr_FR@euro"
KEYTABLE="fr"
XKEYBOARD="fr"
KDEKEYBOARD="fr"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="de,us"
;;
it)
# italian version
COUNTRY="it"
LANG="it_IT@euro"
KEYTABLE="it"
XKEYBOARD="it"
KDEKEYBOARD="it"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="fr,us,de"
;;
nl)
# netherland version
COUNTRY="nl"
LANG="nl_NL@euro"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="iso8859-15"
# Additional KDE Keyboards
KDEKEYBOARDS="nl,de,fr"
;;
pl)
# Polish version
COUNTRY="pl"
LANG="pl_PL"
KEYTABLE="pl"
XKEYBOARD="pl"
KDEKEYBOARD="pl"
CHARSET="iso8859-2"
# Additional KDE Keyboards
KDEKEYBOARDS="de,us,fr"
;;
ru)
# Russian version
COUNTRY="ru"
LANG="ru_RU.KOI8-R"
KEYTABLE="ru"
XKEYBOARD="ru"
KDEKEYBOARD="ru"
CHARSET="koi8-r"
CONSOLEFONT="Cyr_a8x16"
# Additional KDE Keyboards
KDEKEYBOARDS="de,us,fr"
;;
sk)
# Slovak version (guessed)
COUNTRY="sk"
LANG="sk"
KEYTABLE="sk-qwerty"
XKEYBOARD="sk"
KDEKEYBOARD="sk"
CHARSET="iso8859-2"
# Additional KDE Keyboards
KDEKEYBOARDS="us,de,fr"
;;
tr)
# Turkish version (guessed)
COUNTRY="tr"
LANG="tr_TR"
KEYTABLE="tr_q-latin5"
XKEYBOARD="tr"
KDEKEYBOARD="tr"
CHARSET="iso8859-9"
# Additional KDE Keyboards
KDEKEYBOARDS="us,de,fr"
;;
tw)
# Traditional chinese version (thanks to Chung-Yen Chang)
COUNTRY="tw"
LANG="zh_TW.Big5"
LANGUAGE="zh_TW.Big5"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
# CHARSET="big5-0"
CHARSET="iso8859-1"
# Additional KDE Keyboards
KDEKEYBOARDS="us"
XMODIFIERS="@im=xcin"
;;
uk)
# british version
COUNTRY="uk"
LANG="en_GB"
KEYTABLE="uk"
XKEYBOARD="uk"
KDEKEYBOARD="uk"
CHARSET="iso8859-1"
# Additional KDE Keyboards
KDEKEYBOARDS="us"
;;
*)
# US version
LANGUAGE="us"
COUNTRY="us"
LANG="C"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="iso8859-1"
# Additional KDE Keyboards
KDEKEYBOARDS="de,fr"
;;
esac

# Export it now, so error messages get translated, too
# [K.Wonderboy] ;1.00 s
#export LANG COUNTRY CHARSET
export LANG COUNTRY CHARSET LANGUAGE
# [K.Wonderboy] ;1.00 e

# Allow keyboard override by boot commandline
KKEYBOARD="$(getbootparam keyboard 2>/dev/null)"
[ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
KXKEYBOARD="$(getbootparam xkeyboard 2>/dev/null)"
if [ -n "$KXKEYBOARD" ]; then
XKEYBOARD="$KXKEYBOARD"
KDEKEYBOARD="$KXKEYBOARD"
elif [ -n "$KKEYBOARD" ]; then
XKEYBOARD="$KKEYBOARD"
KDEKEYBOARD="$KKEYBOARD"
fi

# Also read desired desktop, if any
DESKTOP="$(getbootparam desktop 2>/dev/null)"
# Allow only supported windowmanagers
case "$DESKTOP" in gnome|kde|larswm|xfce|windowmaker|wmaker|icewm|fluxbox|twm) ;; *) DESKTOP="kde"; ;; esac

# Check if we are running from the Knoppix-CD or HD
INSTALLED=""
[ -e /KNOPPIX/bin/ash ] || INSTALLED="yes"

# Set hostname
hostname Knoppix

# Set clock (Local time is more often used than GMT, so it is default)
UTC=""
checkbootparam utc >/dev/null 2>&1 && UTC="-u"
checkbootparam gmt >/dev/null 2>&1 && UTC="-u"

hwclock $UTC -s

if [ -n "$INSTALLED" ]; then
echo "${BLUE}Running from HD, checking filesystems...${NORMAL}"
# We are running from HD, so a file system check is recommended
[ -f /etc/init.d/checkroot.sh ] && /etc/init.d/checkroot.sh
[ -f /etc/init.d/checkfs.sh ]   && /etc/init.d/checkfs.sh
fi

# / must be read-write in any case, starting from here
mount -o remount,rw / 2>/dev/null

if [ -n "$INSTALLED" ]; then
echo -n "${BLUE}Running from HD, regenerate ld.so.cache and modules.dep...${NORMAL}"
# Regenerate ld.so.cache and module dependencies on HD
ldconfig ; depmod -a 2>/dev/null
echo ""
fi

# Delete obsolete links and files before starting autoconfig
rm -f /dev/cdrom* /dev/cdwriter* /dev/mouse* /dev/modem* /dev/scanner* \
      /etc/sysconfig/i18n /etc/sysconfig/keyboard /etc/sysconfig/knoppix \
      2>/dev/null

# [K.Wonderboy] ;1.00
rmdir /mnt/hd* >/dev/null 2>&1
rmdir /mnt/sd* >/dev/null 2>&1
cp -af /etc/fstab.kwb  /etc/fstab
cp -af /etc/auto.mnt.kwb /etc/auto.mnt
# [K.Wonderboy] ;1.00

# Write KNOPPIX config files for other scripts to parse
# Standard variables/files
echo "LANG=\"$LANG\""                  > /etc/sysconfig/i18n
echo "COUNTRY=\"$COUNTRY\""           >> /etc/sysconfig/i18n
echo "LANG=\"$LANG\""                 >> /etc/sysconfig/i18n
echo "LANGUAGE=\"$LANGUAGE\""         >> /etc/sysconfig/i18n
echo "CHARSET=\"$CHARSET\""           >> /etc/sysconfig/i18n
echo "XMODIFIERS=\"$XMODIFIERS\""     >> /etc/sysconfig/i18n

# Default Keyboard layout for console and X
echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard

# Desired desktop
echo "DESKTOP=\"$DESKTOP\""            > /etc/sysconfig/desktop

# Write all, including non-standard variables, to /etc/sysconfig/knoppix
echo "LANG=\"$LANG\""                  > /etc/sysconfig/knoppix
echo "COUNTRY=\"$COUNTRY\""           >> /etc/sysconfig/knoppix
echo "LANGUAGE=\"$LANGUAGE\""         >> /etc/sysconfig/knoppix
echo "CHARSET=\"$CHARSET\""           >> /etc/sysconfig/knoppix
echo "KEYTABLE=\"$KEYTABLE\""         >> /etc/sysconfig/knoppix
echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/knoppix
echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/knoppix
echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/knoppix
echo "DESKTOP=\"$DESKTOP\""           >> /etc/sysconfig/knoppix

# No kernel messages while probing modules
echo "0" > /proc/sys/kernel/printk

# Bring up loopback interface now
ifconfig lo 127.0.0.1 up

# CD Checker
if checkbootparam "testcd"; then
echo -n " ${BLUE}Checking CD data integrity as requested by '${CYAN}testcd${BLUE}' boot option... ${NORMAL}"
( tar cpPlf - /cdrom/ | dd of=/dev/null bs=64k ) >/dev/null 2>&1
if [ "$?" = "0" ]; then
echo "${GREEN}OK${NORMAL}"
else
echo "${RED}FAILED${NORMAL}"
echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED. ***${NORMAL}"
echo -n "${CYAN}Hit return to contine. ${NORMAL}"
read a
fi
fi

# Print CPU info
echo -n "${GREEN}"
awk -F: '/^processor/{printf " Processor"$2" is "};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>/dev/null
echo -n "${NORMAL}"

if checkbootparam "noapm"; then
echo " ${BLUE}Skipping APM Bios detection as requested on boot commandline.${NORMAL}"
else
insmod apm power_off=1 >/dev/null 2>&1 && echo " ${GREEN}APM Bios found, power management functions enabled.${NORMAL}"
fi

# Support for hotpluggable devices?
HOTPLUG=""

# KNOPPIX autoconfig
# First: PCMCIA Check/Setup
# This needs to be done before other modules are being loaded by hwsetup

if checkbootparam "nopcmcia"; then
echo " ${BLUE}Skipping PCMCIA detection as requested on boot commandline.${NORMAL}"
else
insmod pcmcia_core >/dev/null 2>&1
# Try Cardbus or normal PCMCIA socket drivers
insmod yenta_socket >/dev/null 2>&1 && HOTPLUG="yes" || insmod i82365 >/dev/null 2>&1 || insmod tcic >/dev/null 2>&1
if [ "$?" != "0" ]
then
# No PCMCIA Bus present.
[ -n "$HOTPLUG" ] || rmmod pcmcia_core 2>/dev/null
else
echo " ${GREEN}PCMCIA found, starting cardmgr.${NORMAL}"
insmod ds >/dev/null 2>&1
cardmgr >/dev/null 2>&1 && sleep 4
fi
fi

# USB enable
if checkbootparam "nousb"; then
echo " ${BLUE}Skipping USB detection as requested on boot commandline.${NORMAL}"
else
# USB/Mouse Check/Setup
# This needs to be done before other modules are being loaded by hwsetup
insmod usbcore  >/dev/null 2>&1
# We now try to load both USB modules, in case someone has 2 different
# controllers
FOUNDUSB=""
for u in usb-uhci usb-ohci; do insmod "$u" >/dev/null 2>&1 && FOUNDUSB="yes"; done
if [ -n "$FOUNDUSB" ]; then
HOTPLUG="yes"
echo " ${GREEN}USB found, managed by ${MAGENTA}hotplug${GREEN}.${NORMAL}"
# [K.Wonderboy] :,usb2.0 enable test
#/etc/init.d/hotplug start
# [K.Wonderboy] :,test end
mount -o devmode=0666 -t usbdevfs none /proc/bus/usb >/dev/null 2>&1
else
rmmod usbcore 2>/dev/null
fi
fi

# Firewire enable
if checkbootparam "nofirewire"; then
echo " ${BLUE}Skipping Firewire detection as requested on boot commandline.${NORMAL}"
else
# We now try to load the firewire module
FOUNDFIREWIRE=""
insmod ohci1394 >/dev/null 2>&1 && FOUNDFIREWIRE="yes"
if [ -n "$FOUNDFIREWIRE" ]; then
HOTPLUG="yes"
echo " ${GREEN}Firewire found, managed by ${MAGENTA}hotplug${GREEN}.${NORMAL}"
fi
fi

# Start hotplug manager for PCI/USB/Firewire/Cardbus
if [ -n "$HOTPLUG" -a -x /sbin/hotplug-knoppix ]; then
echo " ${GREEN}Enabling ${MAGENTA}hotplug${GREEN} manager.${NORMAL}"
echo "/sbin/hotplug-knoppix" > /proc/sys/kernel/hotplug ; sleep 3
fi

# Second: Search & configure supported hardware
echo -n "${WHITE}"
if hwsetup -p >/dev/null
then
echo -n "${NORMAL}"
else
echo " ${RED}Please check.${NORMAL}"
fi

# Read in what hwsetup has found
[ -f /etc/sysconfig/knoppix ] && . /etc/sysconfig/knoppix

# Mouse
if [ -n "$MOUSE_DEVICE" ]
then
echo " ${GREEN}Mouse is ${YELLOW}${MOUSE_FULLNAME}${GREEN} at ${MAGENTA}${MOUSE_DEVICE}${NORMAL}"
fi

# Soundcard
if [ -n "$SOUND_FULLNAME" -o -n "$SOUND_DRIVER" ]
then
# Setting micro input to zero to avoid subsonic disaster
echo -n " ${GREEN}Soundcard:"
aumix -m 0 >/dev/null 2>&1
[ -n "$SOUND_FULLNAME" ] && echo -n " ${YELLOW}$SOUND_FULLNAME${GREEN}"
[ -n "$SOUND_DRIVER" ] && echo -n ", driver=${MAGENTA}$SOUND_DRIVER"
echo "${NORMAL}"
fi

# Read default keyboard from config file.
# There seems to be no reliable autoprobe possible.
[ -f /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
# Set default keyboard before interactive setup
[ -n "$KEYTABLE" ] && loadkeys -q $KEYTABLE
[ -n "$CONSOLEFONT" ] && consolechars -f $CONSOLEFONT

# Check for blind option or brltty
BLIND=""
checkbootparam "blind" && BLIND="yes"
BRLTTY="$(getbootparam brltty 2>/dev/null)"

if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
if [ -x /sbin/brltty ]; then
# Blind option detected, start brltty now.
CMD=brltty
BRLTYPE=""
BRLDEV=""
BRLTEXT=""
if [ -n "$BRLTTY" ]; then
# Extra options
BRLTYPE="${BRLTTY%%,*}"
R="${BRLTTY#*,}"
if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
BRLTTY="$R"
BRLDEV="${BRLTTY%%,*}"
R="${BRLTTY#*,}"
if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
BRLTTY="$R"
BRLTEXT="${BRLTTY%%,*}"
R="${BRLTTY#*,}"
fi
fi
fi
[ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
[ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
[ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
echo " ${BLUE}Starting braille-display manager: ${GREEN}${CMD}${BLUE}.${NORMAL}"
( exec $CMD & )
sleep 2
fi
fi

if [ -n "$INTERACTIVE" ]
then
# Interactive configuration
echo "${BLUE}Entering interactive configuration second stage.${NORMAL}"

echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}"
echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] "
read a
[ "$a" != "n" ] && /usr/sbin/kbdconfig
# kbdconfig already loads the keyboard if modified.

echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] "
read a
[ "$a" != "n" ] && sndconfig && aumix -m 0 >/dev/null 2>&1

if [ -n "$MOUSE_FULLNAME" -o -n "$MOUSE_DEVICE" ]
then
echo -n " ${GREEN}Your mouse has been autodetected as: ${MAGENTA}"
ls -l /dev/mouse | awk '{print $9 " " $10 " " $11}'
echo -n "${NORMAL}"
fi
echo -n "${CYAN}Do you want to (re)configure your mouse?${NORMAL} [Y/n] "
read a
[ -f /etc/sysconfig/mouse ] && . /etc/sysconfig/mouse
[ "$a" != "n" ] && mouseconfig
fi

if checkbootparam noagp; then
echo " ${BLUE}Skipping AGP detection as requested on boot commandline.${NORMAL}"
else
# Probe for AGP. Hope this can fail safely
stringinfile "AGP" "/proc/pci" 2>/dev/null && insmod agpgart agp_try_unsupported=1 >/dev/null 2>&1 && echo " ${YELLOW}AGP bridge${GREEN} detected."
fi

# KNOPPIX automatic XFree86 Setup
[ -x /usr/sbin/mkxf86config ] && /usr/sbin/mkxf86config

# Read in changes
[ -f /etc/sysconfig/knoppix ] && . /etc/sysconfig/knoppix

if [ -n "$INTERACTIVE" ]
then
echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] "
read a
[ "$a" != "n" ] && xf86cfg -textmode -xf86config /etc/X11/XF86Config-4 >/dev/console 2>&1 </dev/console
echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}"
fi

RUNLEVEL="$(runlevel)"
AUTOMOUNTER=""
[ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"

addautomount(){
# /dev/device  options
d="${1##*/}"
if [ -n "$AUTOMOUNTER" ]; then
[ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
[ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
[ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
anew="$d	-fstype=auto,$2	:$i"
stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
AUTOMOUNTS="$AUTOMOUNTS $d"
new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
else
[ -d /mnt/$d ] && mkdir -p /mnt/$d
new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
fi
stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
}

AUTOMOUNTS="floppy cdrom"
# Add new devices to /etc/fstab and /etc/auto.mnt
for i in /dev/cdrom?*; do
if [ -L $i ]; then
addautomount "$i" "ro"
fi
done

NOSWAP=""
NODMA=""
checkbootparam "noswap" && NOSWAP="yes"
checkbootparam "nodma" && NODMA="yes"

# Collect partitions from /proc/partitions first for enabling DMA
partitions=""
while read major minor blocks partition relax; do
partition="${partition##*/}"
[ -z "$partition" -o ! -e "/dev/$partition" ] && continue
case "$partition" in
hd?) [ -n "$NODMA" ] || dma="$dma $partition" ;;      # IDE  Harddisk, entire disk
sd?) ;;                                               # SCSI Harddisk, entire disk
[hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
esac
done <<EOT
$(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
EOT

# Enable DMA for all IDE disks now.
if [ -n "$dma" ]; then
echo -n "${BLUE}Enabling DMA acceleration for:"
for d in $dma; do
echo -n " ${MAGENTA}$d${NORMAL}"
hdparm -qd1 "/dev/$d" 2>/dev/null
done
echo "${BLUE}.${NORMAL}"
fi

# Start creating /etc/fstab with HD partitions and USB SCSI devices now
echo -n "${BLUE}Scanning for Harddisk partitions and creating ${YELLOW}/etc/fstab${BLUE}... "
rebuildfstab -r >/dev/null 2>&1
if [ -e /var/run/rebuildfstab.pid ]; then
# Another instance of rebuildfstab, probably from hotplug, is still running, so just wait.
sleep 8
fi
echo "${GREEN}Done.${NORMAL}"

if [ -n "$partitions" ]; then
 while read p m f relax; do
  options="users,exec"
  fnew=""
  case "$f" in swap)
   if [ -n "$NOSWAP" ]; then
    echo "${BLUE}Ignoring swap partition ${MAGENTA}$p${BLUE} as requested.${NORMAL}"
   else
    echo "${BLUE}Using swap partition ${MAGENTA}$p${BLUE}.${NORMAL}"
    swapon $p 2>/dev/null
   fi
   continue
   ;;
  esac
# Create mountdir if not already present
  d="/mnt/${p##*/}" ; [ -d "$d" ] || mkdir -p "$d"
  case "$f" in vfat|msdos)
   if [ -z "$NOSWAP" ] && mount -o uid=knoppix,gid=knoppix,ro -t $f $p $d 2>/dev/null; then
    if [ -f $d/knoppix.swp ]; then
     mount -o remount,rw $d
     if swapon $d/knoppix.swp 2>/dev/null; then
      echo "${BLUE}Using KNOPPIX swapfile ${MAGENTA}$d/knoppix.swp${BLUE}.${NORMAL}"
      mount -o remount,ro $d 2>/dev/null
      fnew="$d/knoppix.swp swap swap defaults 0 0"
      stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
     else
      umount $d
     fi
    else
     umount $d
    fi
   fi
   ;;
  esac
 done </etc/fstab
fi

# New: Interactively create swapfiles on DOS partitions
# (if necessary and possible)
FREEMEM="$(awk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)"

if [ "$FREEMEM" -lt 80000 ]; then
if [ -x /usr/sbin/mkdosswapfile ]; then
case "$LANGUAGE" in
de)
LOWMEM="Ihr Rechner verfgt nur ber ${FREEMEM}kB freien RAM-Speicher. Dies ist fr das Arbeiten mit Linux zwar generell ausreichend, aber leider nicht genug, um grere Anwendungen wie KDE oder Office-Pakete zu starten. Sie knnen im nchsten Schritt versuchen, eine sog. Auslagerungsdatei auf einer DOS-Partition (sofern vorhanden) einzurichten."
;;
*)
LOWMEM="There are only ${FREEMEM}kB of RAM available in your computer. While this is usually sufficient for working under Linux, it is unfortunately not enough for starting bigger applications like KDE, or office suites. You can try to create a so-called swapfile on an existing DOS-Partition (if available) in the next step."
;;
esac
dialog --msgbox "$LOWMEM" 12 65 </dev/console >/dev/console 2>&1 
/usr/sbin/mkdosswapfile </dev/console >/dev/console 2>&1 
fi
fi

# Fat-Client-Version: DHCP Broadcast for IP address
if checkbootparam "nodhcp"; then
echo " ${BLUE}Skipping DHCP broadcast/network detection as requested on boot commandline.${NORMAL}"
else
NETDEVICES="$(awk -F: '/eth.:|tr.:/{print $1}' /proc/net/dev 2>/dev/null)"
for DEVICE in $NETDEVICES
do
echo -n " ${GREEN}Network device ${MAGENTA}$DEVICE${GREEN} detected, DHCP broadcasting for IP.${NORMAL}"
trap 2 3 11
pump -i $DEVICE >/dev/null 2>&1 &
trap "" 2 3 11
sleep 1
echo " ${BLUE}(Backgrounding)${NORMAL}"
done
fi

# Background image detection for KDE/GNOME/X
BACKGROUND=/cdrom/KNOPPIX/background.gif
[ -e "$BACKGROUND" ] || BACKGROUND=/usr/local/lib/knoppix.gif
echo 'BACKGROUND="'"$BACKGROUND"'"' >> /etc/sysconfig/knoppix
 
# Check for configuration floppy add-on if not running from HD
if [ -z "$INSTALLED" -a -n "$MYCONF" ]; then
FOUND_CONFIG=""
echo -n "${CRE}${BLUE}Checking ${MAGENTA}/dev/fd0${BLUE} for KNOPPIX configuration floppy...${NORMAL}"
if mount -t auto -o ro /dev/fd0 /mnt/floppy >/dev/null 2>&1; then
for i in knoppix.sh KNOPPIX.SH KNOPPIX.sh Knoppix.sh; do
if [ -f /mnt/floppy/$i ]; then
echo ""
FOUND_CONFIG="yes"
echo " ${GREEN}KNOPPIX Configuration floppy found, executing ${MAGENTA}$i${GREEN}.${NORMAL}"
echo "6" > /proc/sys/kernel/printk
. /mnt/floppy/$i /mnt/floppy || true
echo "0" > /proc/sys/kernel/printk
break
fi
done
umount /mnt/floppy 2>/dev/null
fi
[ -n "$FOUND_CONFIG" ] || echo " ${BLUE}Not present.${NORMAL}"
fi

# Check for extra shellscript on CD-Rom (/cdrom/KNOPPIX/knoppix.sh)
for i in knoppix.sh KNOPPIX.SH KNOPPIX.sh Knoppix.sh; do
if [ -f /cdrom/KNOPPIX/$i ]; then
echo ""
FOUND_CONFIG="yes"
echo " ${GREEN}KNOPPIX Configuration file found in /cdrom/KNOPPIX, executing ${MAGENTA}$i${GREEN}.${NORMAL}"
echo "6" > /proc/sys/kernel/printk
. /cdrom/KNOPPIX/$i /cdrom/KNOPPIX || true
echo "0" > /proc/sys/kernel/printk
break
fi
done

if [ -n "$AUTOMOUNTER" ]; then
# Check for floppy dir, reinstall with automounter
[ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
[ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
[ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
[ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
[ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
[ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
rm -f /etc/fstab.new
# Replace paths from bootfloppy
sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
mv -f /etc/fstab.new /etc/fstab
# Start automounter now
/etc/init.d/autofs start >/dev/null && echo " ${GREEN}Automounter started for: ${MAGENTA}${AUTOMOUNTS}${GREEN}.${NORMAL}"
fi

# This has to be done as root
[ -e /opt/openoffice/program/resource-"$LANGUAGE" ] && { rm -f /etc/alternatives/soffice.resource ; ln -sf /opt/openoffice/program/resource-"$LANGUAGE" /etc/alternatives/soffice.resource 2>/dev/null; }
[ -e /opt/openoffice/help/help-"$LANGUAGE" ] && { rm -f /etc/alternatives/soffice.help ; ln -sf /opt/openoffice/help/help-"$LANGUAGE" /etc/alternatives/soffice.help 2>/dev/null; }

echo "6" > /proc/sys/kernel/printk

# Re-enable signals
trap 2 3 11

exit 0
