replace references to zsh-login with run-welcome
[grml-autoconfig.git] / autoconfig.functions
index 8097a2d..a0846d9 100755 (executable)
@@ -10,6 +10,7 @@
 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
 DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
 DEBUG="/dev/null"
 KERNEL="$(uname -r)"
+ARCH="$(uname -m)"
 umask 022
 
 # old linuxrc version:
 umask 022
 
 # old linuxrc version:
@@ -77,6 +78,11 @@ checkbootparam(){
   esac
 }
 
   esac
 }
 
+# Check if currently using a framebuffer
+hasfb() {
+    [ -e /dev/fb0 ] && return 0 || return 1
+}
+
 # Check wheter a configuration variable (like $CONFIG_TOHD) is
 # enabled or not
 checkvalue(){
 # Check wheter a configuration variable (like $CONFIG_TOHD) is
 # enabled or not
 checkvalue(){
@@ -92,10 +98,6 @@ checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
-# execute flite only if it's present
-flitewrapper() {
-   [ -x /usr/bin/flite ] && flite -o play -t "$*"
-}
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -170,7 +172,7 @@ if checkbootparam 'log' || checkbootparam 'debug' ; then
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    eindent
      einfo "Starting bootlogd." # known to be *very* unreliable :(
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    eindent
      einfo "Starting bootlogd." # known to be *very* unreliable :(
-     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
+     bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
    eoutdent
 else
    DEBUG="/dev/null"
    eoutdent
 else
    DEBUG="/dev/null"
@@ -183,7 +185,7 @@ config_fwtimeout(){
  if checkbootparam 'fwtimeout' ; then
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
  if checkbootparam 'fwtimeout' ; then
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
-   rmmod firmware_class 1>>$DEBUG 2>&1
+   rmmod firmware_class >>$DEBUG 2>&1
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
@@ -202,39 +204,39 @@ config_language(){
  einfo "Activating language settings:"
  eindent
 
  einfo "Activating language settings:"
  eindent
 
- # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
+ # people can specify $LANGUAGE and $CONSOLEFONT in a config file
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
- grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
-
- # check for bootoption which overrides config from /etc/grml/autoconfig:
+ # check for bootoption which overrides config from /etc/grml/autoconfig
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
- # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
+ # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
  if [ -z "$INSTALLED" ] ; then
  if [ -z "$INSTALLED" ] ; then
-    [ -n "$LANGUAGE" ] || LANGUAGE='us'
+    [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
 
  fi
 
- # if bootoption lang is used update /etc/default/locale, otherwise *not*!
- if [ -n "$BOOT_LANGUAGE" -a -x /usr/sbin/grml-setlang ] ; then
-    if checkgrmlsmall ; then
-       /usr/sbin/grml-setlang "POSIX"
-    else
-       /usr/sbin/grml-setlang "$LANGUAGE"
-    fi
+ if [ -x /usr/sbin/grml-setlang ] ; then
+   # if bootoption lang is used update /etc/default/locale accordingly
+   if [ -n "$BOOT_LANGUAGE" ] ; then
+     checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "$LANGUAGE"
+   # otherwise default to lang=en
+   else
+     checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en"
+   fi
  fi
 
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
  fi
 
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
-       # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
-       # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
        fi
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
        fi
+       if ! hasfb ; then
+          CONSOLEFONT='Lat15-Terminus16'
+       fi
     fi
  fi
 
     fi
  fi
 
@@ -296,7 +298,7 @@ config_language(){
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
-       unicode_start 2>>$DEBUG ; eend $?
+       unicode_start >>$DEBUG 2>&1 ; eend $?
     fi
  fi
 
     fi
  fi
 
@@ -308,17 +310,36 @@ config_language(){
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
- NUM_CONSOLES=$(fgconsole --next-available)
- NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
- [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
- CUR_CONSOLE=$(fgconsole)
+ NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
+ if [ -n "$NUM_CONSOLES" ] ; then
+    NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
+    [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ fi
+ CUR_CONSOLE=$(fgconsole 2>/dev/null)
+
+ if [ -x "$(which setfont)" ] ; then
+    use_setfont=true
+ elif [ -x "$(which consolechars)" ] ; then
+    use_consolechars=true
+ else
+    eerror "Neither setfont nor consolechars tool present, can not set font."
+    eend 1
+    return 1
+ fi
 
  if [ -n "$CHARMAP" ] ; then
 
  if [ -n "$CHARMAP" ] ; then
-    einfo "Running consolechars for ${CHARMAP}"
-    for vc in `seq 0 ${NUM_CONSOLES}`  ; do
-        consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
+    einfo "Setting font to ${CHARMAP}"
+    RC=0
+    for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+        if $use_setfont ; then
+          setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
+        elif $use_consolechars ; then
+          consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
+        fi
     done
     done
-    [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+    if [ -n "$CUR_CONSOLE" ] ; then
+       [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+    fi
     eend $RC
  fi
 
     eend $RC
  fi
 
@@ -326,12 +347,19 @@ config_language(){
     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
  else
     if [ -n "$CONSOLEFONT" ] ; then
     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
  else
     if [ -n "$CONSOLEFONT" ] ; then
-       einfo "Running consolechars using ${CONSOLEFONT}"
-       for vc in `seq 0 ${NUM_CONSOLES}`  ; do
-           consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
+       einfo "Setting font to ${CONSOLEFONT}"
+       RC=0
+       for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+           if $use_setfont ; then
+             setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
+           elif $use_consolechars ; then
+             consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
+           fi
        done
        done
-       [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
-       eend $?
+       if [ -n "$CUR_CONSOLE" ] ; then
+          [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+       fi
+       eend $RC
     fi
  fi
 
     fi
  fi
 
@@ -343,9 +371,15 @@ config_language(){
 config_hostname(){
  if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
 config_hostname(){
  if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
+  if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
+     einfo "Generating random hostname as no hostname was specified."
+     HOSTNAME="$(/usr/bin/random-hostname)"
+     eend $?
+  fi
   einfo "Setting hostname to $HOSTNAME as requested."
   einfo "Setting hostname to $HOSTNAME as requested."
-  sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
-  hostname $HOSTNAME ; eend $?
+  grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
+  [ "$RC" = "0" ] && hostname $HOSTNAME
+  eend $RC
  else
   hostname --file /etc/hostname
  fi
  else
   hostname --file /etc/hostname
  fi
@@ -423,41 +457,6 @@ config_kernel(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ vmware specific stuff
-config_vmware(){
-if checkbootparam 'novmware' ; then
-   ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
-else
-   if [ -z "$INSTALLED" ] ; then
-      if vmware-detect || checkbootparam "BOOT_IMAGE=vmware" ; then
-         if ! checkbootparam 'qemu' ; then
-            if [ -r /etc/X11/xorg.conf.vmware ] ; then
-               einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
-               cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
-            fi
-         fi
-      elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
-         if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
-            einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
-            cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
-         fi
-      fi
-   fi
-fi
-}
-# }}}
-
-# {{{ qemu specific stuff
-config_qemu(){
-if checkbootparam 'qemu' ; then
-   if [ -r /etc/X11/xorg.conf.example ] ; then
-      einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
-      cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
-   fi
-fi
-}
-# }}}
-
 # {{{ ld.so.cache + depmod
 config_ld_mod(){
 if [ -n "$INSTALLED" ]; then
 # {{{ ld.so.cache + depmod
 config_ld_mod(){
 if [ -n "$INSTALLED" ]; then
@@ -561,32 +560,56 @@ fi
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
-  einfo "Bootoption (for serial) console detected."
-  eindent
-    if [ -r /etc/mgetty/mgetty.config ] ; then
-       MODE=$(getbootparam 'console' | awk -F, '{print $2}')
-       MODE=${MODE%%n*}
-       [ -n "$MODE" ] || MODE=9600 # default mode
-       einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
-       sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
-    fi
+  local line
+  local ws
+  ws='  '
 
 
-    einfo "Activating mgetty."
-    sed -i 's/^#T0/T0/' /etc/inittab
-    sed -i 's/^#T1/T1/' /etc/inittab
-    /sbin/telinit q ; eend $?
-  eoutdent
-fi
-}
-# }}}
+  einfo "Bootoption for serial console detected:"
+
+  line="$CMDLINE x "
+  this=""
+  line="${line#*[$ws]}"
+  local telinitq=""
+  while [ -n "$line" ]; do
+    case "$this" in
+      console=*)
+        local serial="$this"
+        local device="${this%%,*}"
+        local device="${device##*=}"
+        if echo $serial | grep -q ttyS ; then
+          local option="${serial##*,}"
+          # default (works for kvm & CO):
+          local speed="115200,57600,38400,19200,9600,4800,2400,1200";
+          # ... unless overriden by command line:
+          case "$option" in
+            115200*) speed=115200 ;;
+             57600*) speed=57600 ;;
+             38400*) speed=38400 ;;
+             19200*) speed=19200 ;;
+              9600*) speed=9600 ;;
+              4800*) speed=4800 ;;
+              2400*) speed=2400 ;;
+              1200*) speed=1200 ;;
+          esac
+          eindent
+            einfo "Activating console login on device ${device} with speed ${speed}."
+            local number="${device#ttyS}"
+            sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab
+            eend $?
+            telinitq="1"
+          eoutdent
+        fi
+        ;;
+    esac
+    this="${line%%[$ws]*}"
+    line="${line#*[$ws]}"
+  done
 
 
-# For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
-config_cdrom_perm(){
-CDROMS=""
-for DEVICE in /proc/ide/hd?; do
- [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
-done
-[ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
+  if [ -n "$telinitq" ]; then
+    /sbin/telinit q
+  fi
+  eend $?
+fi
 }
 # }}}
 
 }
 # }}}
 
@@ -602,28 +625,6 @@ config_local_net(){
 }
 # }}}
 
 }
 # }}}
 
-# firewire devices {{{
-# the raw1394 driver does not yet export info into SYSFS,
-# so let's create raw1394 device manually
-# http://www.michael-prokop.at/blog/index.php?p=352
-config_firewire_dev(){
-if checkbootparam 'nofirewiredev' ; then
-  ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
-else
-#if [ "${KERNEL%-*}" == "2.6.11" ] ; then
-  einfo "Creating some firewire devices (fix kernel 2.6-bug)."
-#  cd /dev && MAKEDEV video1394 raw1394
-  [ -r /dev/raw1394 ]   || mknod /dev/raw1394 c 171 0
-  [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
-# mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
-  [ -r /dev/dv1394 ]    || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
-  chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
-  chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
-fi
-#fi
-}
-# }}}
-
 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
 # otherwise we will get: passwd: Authentication token lock busy
 config_fix_passwd(){
 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
 # otherwise we will get: passwd: Authentication token lock busy
 config_fix_passwd(){
@@ -662,86 +663,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ hardware detection via discover
-config_discover(){
-if checkbootparam 'nodisc' ; then
-  ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
-else
- if [ -x /sbin/discover ] ; then
-  einfo "Discovering hardware. Trying to load the following modules in background:"
-   eindent
-   einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
-   eoutdent
-  /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
-  eend 0
- else
-  eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
- fi
-fi
-}
-# }}}
-
-# {{{ hardware detection via hwinfo
-config_hwinfo(){
-if checkbootparam 'hwinfo' >>$DEBUG 2>&1; then
-  einfo "Discovering hardware via hwinfo:"
-  MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
-  echo -n "  Loading modules: "
-  for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
-  eend 0
-fi
-}
-# }}}
-
-# {{{ disable hotplug agents on request
-config_hotplug_agent(){
-if checkbootparam 'noagent' ; then
-  AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
-  AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
-  AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
-  einfo "Disabling hotplug-agent(s) $AGENTNL"
-  for agent in $(echo -e $AGENTLIST) ; do
-    mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
-  done
-  [ "$?" == "0" ] ; eend $?
-fi
-}
-# }}}
-
-# {{{ blacklist of hotplug-modules
-config_hotplug_blacklist(){
-if checkbootparam 'black' ; then
-  BLACK="$(getbootparam 'black' 2>>$DEBUG)"
-  BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
-  BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
-  einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
-  echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
-  echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
-  eend 0
-fi
-}
-# }}}
-
-# {{{ run hotplug
-config_hotplug(){
-if checkbootparam 'nohotplug' ; then
-  ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
-else
-  if [ -r /etc/init.d/hotplug ] ; then
-    einfo "Starting hotplug system in background."
-    /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
-    eend 0
-  elif [ -r /etc/init.d/hotplug-light ] ; then
-    einfo "Starting hotplug-light system in background."
-    /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
-    eend 0
-  else
-    ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
-  fi
-fi
-}
-# }}}
-
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 if checkbootparam 'blacklist' ; then
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 if checkbootparam 'blacklist' ; then
@@ -795,10 +716,10 @@ if [ -d /proc/acpi ]; then
     else
       ewarn "(none)" ; eend 1
     fi
     else
       ewarn "(none)" ; eend 1
     fi
-    if ! ps x | grep -q /usr/sbin/acpid ; then
+    if ! ps x 2>>$DEBUG | grep -q /usr/sbin/acpid ; then
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
-        /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
+        /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
@@ -829,173 +750,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ PCMCIA Check/Setup
-# This needs to be done before other modules are being loaded (by hwsetup)
-config_pcmcia(){
-if checkbootparam 'nopcmcia'; then
-  ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
-else
-  if /usr/sbin/laptop-detect ; then
-    einfo "Detected Laptop - checking for PCMCIA." && eend 0
-    modprobe pcmcia_core >>$DEBUG 2>&1
-    # Try Cardbus or normal PCMCIA socket drivers
-    modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
-    if [ "$?" = "0" ]; then
-      modprobe ds >>$DEBUG 2>&1
-      if [ -d /proc/bus/pccard ] ; then
-       if [ -x /sbin/cardmgr ] ; then
-        einfo "PCMCIA found, starting cardmgr."
-        cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
-       else
-        eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
-       fi
-      fi
-    fi
-  fi
-fi
-}
-# }}}
-
-# {{{ run software synthesizer via speakup
-config_swspeak(){
-   if checkbootparam 'swspeak' ; then
-      einfo "Bootoption swspeak found."
-
-      if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
-         ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
-         eindent
-         einfo "Loading speakup_soft"
-         if modprobe speakup_soft ; then
-            eend 0
-         else
-            flitewrapper "Fatal error setting up software speakup"
-            eend 1
-            return 1
-         fi
-         eoutdent
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
-         einfo "Kernel supports speakup." ; eend 0
-         eindent
-            einfo "Just run swspeak if you want to use software synthesizer via speakup."
-            flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
-         eoutdent
-      else
-         eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
-         flitewrapper "Kernel does not seem to support speakup. Sorry."
-      fi
-   fi
-}
-# }}}
-
-# {{{ support hardware synthesizer via speakup
-config_hwspeak(){
-   if checkbootparam 'speakup.synth' ; then
-      einfo "Bootoption speakup.synth found."
-      eindent
-
-      module="$(getbootparam 'speakup.synth' 2>>$DEBUG)"
-      if [ -z "$module" ] ; then
-         eerror "Sorry, no speakup module specified for bootoption speakup.synth."
-         flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
-      else
-         einfo "Trying to load $module"
-         modprobe "speakup_${module}"
-         eend $?
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
-         einfo "Kernel should support speakup now." ; eend 0
-         flitewrapper "Kernel should support speakup now."
-      else
-         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
-         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
-      fi
-
-      eoutdent
-
-   # hwspeak:
-   elif checkbootparam 'hwspeak' ; then
-      einfo "Bootoption hwspeak found."
-
-      if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
-         ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
-         eindent
-         if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
-            eerror "Kernel does not provide speakup modules, sorry." ; eend 1
-         else
-           for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
-                           sed 's#.*speakup/##g ; s#.ko$##g' | \
-                           grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
-              einfo "Trying to load $module"
-              modprobe $module
-              eend $?
-           done
-         fi
-         eoutdent
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
-         einfo "Kernel should support speakup now." ; eend 0
-         flitewrapper "Kernel should support speakup now."
-      else
-         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
-         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
-      fi
-   fi
-}
-# }}}
-
-# {{{ Check for blind option or brltty
-config_blind(){
-BLIND=""
-checkbootparam 'blind' && BLIND="yes"
-BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)"
-
-if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
-  if [ -x /sbin/brltty ]; then
-    # Blind option detected, start brltty now.
-    # modprobe serial_core parport_serial generic_serial && echo "done"
-    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"
-    einfo "Starting braille-display manager."
-#    ( exec $CMD & )
-    ( sh -c "$CMD" & )
-    sleep 2 && BLINDSOUND="yes"
-    eend 0
-  fi
-fi
-}
-# }}}
-
-# {{{ Interactive configuration
-config_interactive(){
-  ewarn "config_interactive is deprecated nowadays."
-  ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
-}
-# }}}
-
 # {{{ AGP
 config_agp(){
 if checkbootparam 'forceagp' ; then
 # {{{ AGP
 config_agp(){
 if checkbootparam 'forceagp' ; then
@@ -1005,59 +759,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ automount(er)
-config_automounter(){
-if checkbootparam 'automounter' ; then
-  RUNLEVEL="$(runlevel)"
-  AUTOMOUNTER=""
-  [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
-
-addautomount(){
-# /dev/ice  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"
-    grep -q "$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
-  grep -q "$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
-fi
-
-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
-  einfo "Starting automounter for ${AUTOMOUNTS}."
-  /etc/init.d/autofs start >>$DEBUG ; eend $?
-fi
-}
-# }}}
-
 # {{{ Collect partitions from /proc/partitions first for enabling DMA
 check_partitions(){
 partitions=""
 # {{{ Collect partitions from /proc/partitions first for enabling DMA
 check_partitions(){
 partitions=""
@@ -1075,7 +776,7 @@ done <<EOT
 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
 EOT
 }
 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
 EOT
 }
-check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
+check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
@@ -1108,19 +809,6 @@ if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
-if checkbootparam 'nofstab' || checkbootparam 'forensic' ; then
-  ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
-else
-  einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
-  iszsh && setopt nonomatch
-  if [ -x /usr/sbin/rebuildfstab ] ; then
-     config_userfstab || fstabuser=grml
-     /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
-  else
-     ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
-  fi
-fi # checkbootparam nofstab/forensic
-
 # Scan for swap, config, homedir - but only in live-mode
 if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
 # Scan for swap, config, homedir - but only in live-mode
 if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
@@ -1262,183 +950,69 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Fat-Client-Version: DHCP Broadcast for IP address
-config_dhcp(){
-if checkbootparam 'nodhcp'; then
-  ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
-else
-  NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
-  rm -rf /etc/network/status ; mkdir -p /etc/network/status
-  for DEVICE in `echo "$NETDEVICES"` ; do
-    einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
-    trap 2 3 11
-    ifconfig $DEVICE up >>$DEBUG 2>&1
-    ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
-    trap "" 2 3 11
-    sleep 1
-    eend 0
-  done
-  if [ -n "$INSTALLED" ] ; then
-     ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
-     eend 0
-  fi
-fi
-}
-# }}}
-
-# {{{ helper functions
-findfile(){
-FOUND=""
-# search all partitions for a file in the root directory
-for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
-# See if it's already mounted
-  [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
-  if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
-    [ -f "$i/$1" ] && FOUND="$i/$1"
-    umount -l "$i" 2>>$DEBUG
-    [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
-  fi
-done
-return 2
-}
-
-fstype(){
-case "$(file -s $1)" in
-  *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
-  *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
-  *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
-  *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
-  *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
-  *data*)          echo "invalid"; return 0;;
-  *) echo "auto"; return 0;;
-esac
-}
-
-# Try to mount this filesystem read-only, without or with encryption
-trymount(){
-# Check if already mounted
-case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
-# Apparently, mount-aes DOES autodetect AES loopback files.
-[ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# We need to mount crypto-loop files with initial rw support
-[ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# Mount succeeded?
-[ "$RC" = "0" ] && return 0
-echo ""
-einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
-a="y"
-while [ "$a" != "n" -a "$a" != "N" ]; do
-# We need to mount crypto-loop files with initial rw support
- mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
- echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
- # Problem with ioctl() from getpasswd()?
- # read a
- read a
-done
-return 1
-}
-# }}}
-
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
+  return 0
+fi
+
+if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
+   einfo "Detecting CPU:"
+   CPU=$(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>>$DEBUG)
+   echo $CPU | sed 's/ \{1,\}/ /g'
+   eend 0
 else
 else
-  # check module dependencies
-  cpufreq_check() {
-   if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
-      if [ -e /lib64 ] ; then
-         [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
+   einfo "Detecting CPU: `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>>$DEBUG` " ; eend 0
+fi
+
+# Virtual Box supports ACPI and laptop-detect would return with '0', so check for it:
+if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
+   einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
+   return 0
+fi
+
+if [ -x /etc/init.d/loadcpufreq ] ; then
+   einfo "Trying to set up cpu frequency scaling:"
+   eindent
+   SKIP_CPU_GOVERNOR=''
+   LOADCPUFREQ=$(mktemp)
+   /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
+   if grep -q FATAL "$LOADCPUFREQ" ; then
+      eindent
+        SKIP_CPU_GOVERNOR=1
+        oldIFS="$IFS"
+        IFS="
+"
+         for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
+             eerror "$line" ; eend $RC
+         done
+         IFS="$oldIFS"
+      eoutdent
+   elif grep -q done "$LOADCPUFREQ" ; then
+      MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
+      if [ -n "$MODULE" -a "$MODULE" != none ]; then
+         einfo "Loading cpufreq kernel module $MODULE" ; eend 0
       else
       else
-         [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+         ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
       fi
    fi
       fi
    fi
-  }
 
 
-  if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
-     einfo "Detecting CPU:"
-     CPU=$(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>>$DEBUG)
-     echo $CPU | sed 's/ \{1,\}/ /g'
-     eend 0
-  else
-     einfo "Detecting CPU: `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>>$DEBUG` " ; eend 0
-  fi
-
-  # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
-  # * it only if we have the according kernel modules available
-  # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
-  # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
-  #   -> parse output of the initscript and output it according to our look'n'feel
-  # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
-  if ! cpufreq_check ; then
-    ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
-  else
-    if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
-       # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
-       if [ -r /proc/acpi/battery/BAT0/info ] ; then
-          if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
-             einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
-             return 0
-          fi
-       fi
-       einfo "Detected Laptop - trying to use cpu frequency scaling:"
-       eindent
-       if [ -x /etc/init.d/loadcpufreq ] ; then
-          SKIP_CPU_GOVERNOR=''
-          LOADCPUFREQ=$(mktemp)
-          /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
-          if grep -q FATAL "$LOADCPUFREQ" ; then
-             eindent
-               SKIP_CPU_GOVERNOR=1
-               oldIFS="$IFS"
-               IFS="
-"
-                for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
-                    eerror "$line" ; eend $RC
-                done
-                IFS="$oldIFS"
-             eoutdent
-           elif grep -q done "$LOADCPUFREQ" ; then
-             MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
-             if [ -n "$MODULE" -a "$MODULE" != none ]; then
-                einfo "Loading cpufreq kernel module $MODULE" ; eend 0
-             else
-                ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
-             fi
-          fi
-          rm -f $LOADCPUFREQ
-       elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
-          . /usr/bin/cpufreq-detect.sh
-          if [ -n "$MODULE" -a "$MODULE" != none ]; then
-             einfo "Loading modules ${MODULE}"
-             modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
-             RC=$?
-             if [[ $RC == 0 ]]; then
-                eend 0
-             else
-                SKIP_CPU_GOVERNOR=1
-                eend $1
-             fi
-          else
-             ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
-          fi # $MODULE
-       fi # loadcpufreq
-
-       if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
-          einfo "Loading cpufreq_ondemand, setting ondemand governor"
-          if modprobe cpufreq_ondemand ; RC=$? ; then
-             for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
-                 echo ondemand > $file
-             done
-          fi
-          eend $RC
-       fi # cpu-governor
+   rm -f $LOADCPUFREQ
 
 
-       eoutdent
+   if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
+      einfo "Loading cpufreq_ondemand, setting ondemand governor"
+      RC=0
+      if modprobe cpufreq_ondemand ; RC=$? ; then
+         for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
+            echo ondemand > $file
+         done
+      fi
+      eend $RC
+   fi # cpu-governor
 
 
-    fi # laptop-detect
-  fi # cpufreq_check
-fi # checkbootparam nocpu
+   eoutdent
+fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1483,8 +1057,8 @@ if checkbootparam 'ssh' ; then
    fi
 
    einfo 'Starting secure shell server in background.'
    fi
 
    einfo 'Starting secure shell server in background.'
-   /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
-   /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
+   /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
    eend $?
 
    eindent
    eend $?
 
    eindent
@@ -1494,6 +1068,65 @@ fi
 }
 # }}}
 
 }
 # }}}
 
+# {{{ autostart of x11vnc
+config_vnc(){
+
+USER=grml # TODO: make it dynamically configurable
+if checkbootparam 'vnc' ; then
+   VNC_PASSWD=''
+   VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
+   einfo "Bootoption vnc found, trying to set password for user $USER."
+   eindent
+   if [ -z "$VNC_PASSWD" ] ; then
+      if [ -x /usr/bin/apg ] ; then
+         VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
+      elif [ -x /usr/bin/gpw ] ; then
+         VNC_PASSWD="$(gpw 1)"
+      elif [ -x /usr/bin/pwgen ] ; then
+         VNC_PASSWD="$(pwgen -1 8)"
+      elif [ -x /usr/bin/hexdump ] ; then
+         VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
+      elif [ -n "$RANDOM" ] ; then
+         VNC_PASSWD="${USER}${RANDOM}"
+      else
+         VNC_PASSWD=''
+         eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
+         eend 1
+      fi
+
+      if [ -n "$VNC_PASSWD" ] ; then
+         ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
+      fi
+   fi
+   eoutdent
+
+   # finally check if we have a password we can use:
+   if [ -n "$VNC_PASSWD" ] ; then
+
+      VNCDIR="/home/${USER}/.vnc"
+      [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
+
+      if [ ! -x /usr/bin/x11vnc ] ; then
+         eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
+         eend 1
+      else
+         /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
+         /bin/chown -R "$USER": "$VNCDIR"
+      fi
+   fi
+   if checkbootparam 'vnc_connect' ; then
+      VNC_CONNECT=''
+      VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
+      einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
+      #store the options in a file
+      VNCDIR="/home/${USER}/.vnc"
+      [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
+      echo " --connect $VNC_CONNECT " >> $VNCDIR/options
+   fi
+fi
+}
+# }}}
+
 # {{{ set password for user grml
 config_passwd(){
 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
 # {{{ set password for user grml
 config_passwd(){
 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
-config_homedir(){
-if checkbootparam 'home' ; then
-   HOMEDIR="$(getbootparam 'home')"
-   MYHOMEDEVICE=""
-   MYHOMEMOUNTPOINT=""
-   MYHOMEDIR=""
-   if [ -n "$HOMEDIR" ]; then
-      einfo "Bootoption home detected." && eend 0
-      case "$HOMEDIR" in
-        /dev/*)
-        MYHOMEDEVICE="${HOMEDIR##/dev/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
-      ;;
-        /mnt/*)
-        MYHOMEDEVICE="${HOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="$HOMEDIR"
-      ;;
-        [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
-        MYHOMEDIR="$(findfile grml.img)"
-        MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-      ;;
-      *)
-        eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
-        eerror "Option ignored." ; eend 1
-      ;;
-      esac
-   fi # -n $HOMEDIR
-
-   if [ -n "$MYHOMEDIR" ]; then
-      if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
-         [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
-         while read device mountpoint fs relax; do
-           case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-             case "$fs" in
-               *[Nn][Tt][Ff][Ss]*)
-                 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
-                 break
-                 ;;
-               *[Ff][Aa][Tt]*)
-                 # Note: This currently won't work with encrypted partitions
-                 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
-                 if [ ! -f "$MYHOMEDIR" ]; then
-                    ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
-                    ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
-                 fi
-                 ;;
-             esac
-
-             if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
-                einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
-                if [ -f "$MYHOMEDIR" ]; then
-                   # It's a loopback file, mount it over the /home/grml directory
-                   trymount "$MYHOMEDIR" /home/grml
-                   RC="$?"
-                   [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
-                   RC="$?"
-                else
-                   # Do a --bind mount
-                   ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
-                   RC="$?"
-                fi # -f $MYHOMEDIR
-
-                [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
-
-             fi #  mount -o remount,rw,...
-           break
-           ;;
-           esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-         done <<EOT
-         $(cat /proc/mounts)
-EOT
-     fi # if trymount ...
-   fi # -n $MYHOMEDIR
-fi # checkbootparam home
-}
-# }}}
-
 # {{{ Sound
 # {{{ Sound
-config_mixer(){
-if ! [ -x /usr/bin/aumix ] ; then
-  eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
-else
-
-  if ! [ -r /proc/asound/cards ] ; then
-     ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
-     return
-  fi
+config_mixer () {
+   if ! [ -x /usr/bin/amixer ] ; then
+      eerror "amixer binary not available. Can not set sound volumes therefore."
+      eend 1
+   else
+      if ! [ -r /proc/asound/cards ] ; then
+         ewarn "No soundcard present, skipping mixer settings therefore."
+         eend 0
+         return
+      fi
 
 
-  if checkbootparam 'vol' ; then
-    VOL="$(getbootparam 'vol' 2>>$DEBUG)"
-    if [ -z "$VOL" ] ; then
-      eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
-      VOL='75' # default
-    fi
-  else
-    VOL='75' # default
-  fi
+      for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
+         einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
+         eindent
 
 
-  if checkbootparam 'nosound' ; then
-    einfo "Muting sound devices on request."
-    # some IBM notebooks require the following stuff:
-    if [ -x /usr/bin/amixer ] ; then
-       if amixer get Front 1>/dev/null 2>>$DEBUG ; then
-          amixer set Front unmute 1>/dev/null
-          amixer set Front 0% 1>/dev/null
-       fi
-    fi
-    ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
-    if [ -n "$ERROR" ] ; then
-       eindent
-       eerror "Problem muting sound devices: $ERROR"
-       eoutdent
-    fi
-    eend $RC
-  elif [ -z "$INSTALLED" ]; then
-      einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
-      # some IBM notebooks require the following stuff:
-      if [ -x /usr/bin/amixer ] ; then
-         if amixer get Front 1>/dev/null 2>>$DEBUG ; then
-            amixer set Front unmute 1>/dev/null
-            amixer set Front ${VOL}% 1>/dev/null
+         if checkbootparam 'vol' ; then
+            VOL="$(getbootparam 'vol' 2>>$DEBUG)"
+            if [ -z "$VOL" ] ; then
+               eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
+               VOL='75'
+               eend 1
+            fi
+         else
+            VOL='75'
          fi
          fi
-      fi
-      # by default assume '0' as volume for microphone:
-      if checkbootparam 'micvol' ; then
-         MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
-      else
-         MICVOL=0
-      fi
 
 
-      # finally set the volumes:
-      ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
-      if [ -n "$ERROR" ] ; then
-         eindent
-         eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
-         eoutdent
-      fi
-      eend $RC
-  fi
+         if checkbootparam 'nosound' ; then
+            einfo "Muting sound devices on request."
+            ERROR=$(amixer -q set Master mute)
+            RC=$?
+            if [ -n "$ERROR" ] ; then
+               eindent
+               eerror "Problem muting sound devices: $ERROR"
+               eoutdent
+            fi
+            eend $RC
+         elif [ -z "$INSTALLED" ] ; then
+            einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
 
 
-fi
+            if checkbootparam 'micvol' ; then
+               MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+            else
+               MICVOL=0
+            fi
+
+            for CONTROL in Master PCM ; do
+               if amixer -q | grep -q "Simple mixer control '$CONTROL'" ; then
+                  amixer -q set "${CONTROL}" "${VOL}"%
+                  eend $?
+               fi
+            done
+
+            if [ ${MICVOL} -ne 0 ] ; then
+               einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
+               amixer -q set "Mic" $MICVOL &> /dev/null
+               eend $?
+            fi
+         fi # checkbootparam 'nosound'
+         eoutdent
+      done
+   fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1677,34 +1224,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ keyboard add-ons
-config_setkeycodes(){
-if checkbootparam 'setkeycodes' ; then
- einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
-  # MS MM keyboard add-on
-  # fix
-  setkeycodes e001 126 &>/dev/null
-  setkeycodes e059 127 &>/dev/null
-  # fn keys
-  setkeycodes e03b 59 &>/dev/null
-  setkeycodes e008 60 &>/dev/null
-  setkeycodes e007 61 &>/dev/null
-  setkeycodes e03e 62 &>/dev/null
-  setkeycodes e03f 63 &>/dev/null
-  setkeycodes e040 64 &>/dev/null
-  setkeycodes e041 65 &>/dev/null
-  setkeycodes e042 66 &>/dev/null
-  setkeycodes e043 67 &>/dev/null
-  setkeycodes e023 68 &>/dev/null
-  setkeycodes e057 87 &>/dev/null
-  setkeycodes e058 88 &>/dev/null
-  # hp keycodes
-  setkeycodes e00a 89 e008 90 &>/dev/null
- eend 0
-fi
-}
-# }}}
-
 # {{{ wondershaper
 config_wondershaper(){
  if checkbootparam 'wondershaper' ; then
 # {{{ wondershaper
 config_wondershaper(){
  if checkbootparam 'wondershaper' ; then
@@ -1753,7 +1272,7 @@ config_syslog(){
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
-       /etc/init.d/$SYSLOGD start 1>>$DEBUG &
+       /etc/init.d/$SYSLOGD start >>$DEBUG &
        eend 0
     fi
  fi
        eend 0
     fi
  fi
@@ -1769,8 +1288,8 @@ config_gpm(){
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
-      /etc/init.d/gpm start 1>>$DEBUG &
-      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
+      /etc/init.d/gpm start >>$DEBUG &
+      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
       eend 0
    fi
  fi
       eend 0
    fi
  fi
@@ -1783,57 +1302,75 @@ config_services(){
     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
-    einfo "Starting service(s) ${SERVICENL} in background."
     for service in $(echo -e $SERVICELIST) ; do
     for service in $(echo -e $SERVICELIST) ; do
-       /etc/init.d/${service} start 1>>$DEBUG &
+      # support running (custom) init scripts in non-blocking mode
+      # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
+      if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
+        einfo "Starting service ${service}."
+        /etc/init.d/${service} start >>$DEBUG
+      else
+        einfo "Starting service ${service} in background."
+        /etc/init.d/${service} start >>$DEBUG &
+      fi
     done
     done
-    [ "$?" == "0" ] ; eend $?
+    eend $?
  fi
 }
 # }}}
 
  fi
 }
 # }}}
 
-# {{{ config files
-config_netconfig(){
- if checkbootparam 'netconfig' ; then
-  CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
-  CONFIGFILE='/tmp/netconfig.grml'
-
+# {{{ remote files
+get_remote_file() {
+  [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
+  SOURCE=$(eval echo "$1")
+  TARGET="$2"
   getconfig() {
   getconfig() {
-  wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
-       --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
+  wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
+       --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
   }
   }
-  einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
+  einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
   counter=10
   while ! getconfig && [[ "$counter" != 0 ]] ; do
   counter=10
   while ! getconfig && [[ "$counter" != 0 ]] ; do
-    echo -n "Sleeping for 5 seconds and trying to get config again... "
+    echo -n "Sleeping for 1 second and trying to get config again... "
     counter=$(( counter-1 ))
     echo "$counter tries left" ; sleep 1
   done
     counter=$(( counter-1 ))
     echo "$counter tries left" ; sleep 1
   done
-  if [ -r "$CONFIGFILE" ] ; then
+  if [ -s "$TARGET" ] ; then
     einfo "Downloading was successfull." ; eend 0
     einfo "Downloading was successfull." ; eend 0
-    einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
-    md5sum $CONFIGFILE ; eend 0
-    cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
+    einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
+    md5sum ${TARGET} ; eend 0
+    return 0;
   else
   else
-    einfo "Sorry, could not fetch $CONFIG" ; eend 1
-  fi
+    einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
+    return 1;
  fi
 }
 # }}}
 
  fi
 }
 # }}}
 
-# {{{ blindsound
-config_blindsound(){
- if checkbootparam 'blind' ; then
-    beep
-    flitewrapper "welcome to the gremel system"
+# {{{ config files
+config_netconfig(){
+ if checkbootparam 'netconfig' ; then
+  CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
+  CONFIGFILE='/tmp/netconfig.grml'
+
+  if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
+    cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
+  fi
+
  fi
 }
 # }}}
 
  fi
 }
 # }}}
 
-# {{{ welcome sound
-config_welcome(){
- if checkbootparam 'welcome' ; then
-    flitewrapper "welcome to the gremel system"
+# {{{ remote scripts
+config_netscript() {
+ if checkbootparam 'netscript' ; then
+  CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
+  SCRIPTFILE='/tmp/netscript.grml'
+
+  if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
+    chmod +x ${SCRIPTFILE}
+    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
+  fi
+
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1846,19 +1383,12 @@ fix_unionfs(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ create all /mnt-directories
-create_mnt_dirs(){
-  ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
-  ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
-}
-# }}}
-
 # {{{ start X window system via grml-x
 config_x_startup(){
 # make sure we start X only if startx is used *before* a nostartx option
 # so it's possible to disable automatic X startup using nostart
 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
 # {{{ start X window system via grml-x
 config_x_startup(){
 # make sure we start X only if startx is used *before* a nostartx option
 # so it's possible to disable automatic X startup using nostart
 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
- if [ -x /usr/X11R6/bin/X ] ; then
+ if [ -x "$(which X)" ] ; then
   if [ -z "$INSTALLED" ] ; then
    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
    if [ -z "$WINDOWMANAGER" ] ; then
   if [ -z "$INSTALLED" ] ; then
    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
    if [ -z "$WINDOWMANAGER" ] ; then
@@ -1867,20 +1397,19 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
-   einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
+   einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
    config_userfstab || fstabuser='grml'
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
    config_userfstab || fstabuser='grml'
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
-# su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
-sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
+su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
-      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
+      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
    else # just append tty6 to inittab if no definition is present:
    else # just append tty6 to inittab if no definition is present:
-      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
+      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
    fi
 
    /sbin/telinit q ; eend $?
    fi
 
    /sbin/telinit q ; eend $?
@@ -1922,50 +1451,63 @@ config_finddcsdir() {
 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
 #    foo, even if a GRMLCFG partition is present.
 DCSDIR=""
 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
 #    foo, even if a GRMLCFG partition is present.
 DCSDIR=""
+DCSMP="/mnt/grml"
+# autoconfig, see issue673
+GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
+[ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
-  ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
+  ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
 else
   if [ -z "$INSTALLED" ] ; then
     if checkbootparam 'myconfig' ; then
       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
       if [ -z "$DCSDEVICE" ]; then
 else
   if [ -z "$INSTALLED" ] ; then
     if checkbootparam 'myconfig' ; then
       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
       if [ -z "$DCSDEVICE" ]; then
-        einfo "No device for bootoption myconfig provided." ; eend 1
+        eerror "Error: No device for bootoption myconfig provided." ; eend 1
       fi # [ -z "$DCSDEVICE" ]
     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
       fi # [ -z "$DCSDEVICE" ]
     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
-      einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
+      einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
       eindent
       # We do need the following fix so floppy disk is available to blkid in any case :-/
       if [ -r /dev/fd0 ] ; then
         einfo "Floppy device detected. Trying to access floppy disk."
       eindent
       # We do need the following fix so floppy disk is available to blkid in any case :-/
       if [ -r /dev/fd0 ] ; then
         einfo "Floppy device detected. Trying to access floppy disk."
-        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
-           blkid /dev/fd0 1>>$DEBUG 2>&1
+        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
+           blkid /dev/fd0 >>$DEBUG 2>&1
         fi
       fi
         fi
       fi
-      DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
+      DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
+      if [ -n "$DCSDEVICE" ]; then
+        DCSMP="/mnt/grmlcfg"
+      fi
+      eoutdent
     fi
     fi
-    if [ -n "$DCSDEVICE" ]; then
+
+    # if not specified/present then assume default:
+    if [ -z "$DCSDEVICE" ]; then
+      DCSDIR="/live/image"
+    else
+      eindent
       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
       if [ -n "$DCSDIR" ]; then
       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
       if [ -n "$DCSDIR" ]; then
-        einfo "$DCSDEVICE already mounted on $DCSDIR"; eend 0
+        ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
       else
       else
-        [ -d /mnt/grml ] || mkdir /mnt/grml
-        umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
-        mount -o ro -t auto $DCSDEVICE  /mnt/grml ; RC="$?"
+        [ -d $DCSMP ] || mkdir $DCSMP
+        umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
+        mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
         if [[ $RC == 0 ]]; then
         if [[ $RC == 0 ]]; then
-          einfo "Successfully mounted $DCSDEVICE to /mnt/grml (readonly)." ; eend 0
-          eindent
+          einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
+        else
+          eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
         fi
         fi
-        DCSDIR="/mnt/grml"
+        DCSDIR="$DCSMP"
       fi
       fi
-    else
-      DCSDIR="/live/image"
+      eoutdent
     fi
   fi
 fi
 
     fi
   fi
 fi
 
-if [ -n "$DCSDIR" ]; then
-  einfo "Debs, config, scripts will be read from $DCSDIR." ; eend 0
+if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
+  einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
 fi
 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
 fi
@@ -1999,7 +1541,11 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
+   iszsh && setopt localoptions shwordsplit
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   if [ -z "$DEBS" ] ; then
+      DEBS="*.deb"
+   fi
    if ! echo $DEBS | grep -q '/'; then
      # backwards compatibility: if no path is given get debs from debs/
      DEBS="debs/$DEBS"
    if ! echo $DEBS | grep -q '/'; then
      # backwards compatibility: if no path is given get debs from debs/
      DEBS="debs/$DEBS"
@@ -2011,28 +1557,38 @@ fi
 }
 
 config_scripts(){
 }
 
 config_scripts(){
-if checkbootparam 'scripts' ; then
+if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
-   if [ -z "$SCRIPTS" ]; then
+   if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
    fi
    if ! echo $SCRIPTS | grep -q '/'; then
      # backwards compatibility: if no path is given get scripts from scripts/
      SCRIPTS="scripts/$SCRIPTS"
    fi
      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
    fi
    if ! echo $SCRIPTS | grep -q '/'; then
      # backwards compatibility: if no path is given get scripts from scripts/
      SCRIPTS="scripts/$SCRIPTS"
    fi
-   SCRIPTS="${DCSDIR}/$SCRIPTS"
-   if [ -d "$SCRIPTS" ]; then
-     einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
-     run-parts $SCRIPTS
-   else
-     einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
-     sh -c $SCRIPTS
+   if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
+     # we are executing from a GRMLCFG labeled fs
+     # kick everything we have done before and start over
+     SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
+   fi
+   if [ -n "$SCRIPTS" ]; then
+     SCRIPTS="${DCSDIR}/$SCRIPTS"
+     if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
+       einfo "Trying to execute ${SCRIPTS}"
+       sh -c $SCRIPTS
+     elif [ -d "$SCRIPTS" ]; then
+       einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
+       run-parts $SCRIPTS
+     else
+       einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
+       sh -c $SCRIPTS
+     fi
    fi
 fi
 }
 
 config_config(){
    fi
 fi
 }
 
 config_config(){
-if checkbootparam 'config' ; then
+if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
   if [ -z "$CONFIG" ]; then
     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
   if [ -z "$CONFIG" ]; then
     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
@@ -2052,9 +1608,13 @@ if checkbootparam 'config' ; then
     fi
   fi
 fi
     fi
   fi
 fi
-# umount /mnt/grml if it was mounted by finddcsdir
-# this doesn't really belong here
-grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
+}
+# }}}
+
+# {{{ confing_umount_dcsdir
+config_umount_dcsdir(){
+   # umount $DCSMP if it was mounted by finddcsdir
+   grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
 }
 # }}}
 
 }
 # }}}
 
@@ -2124,7 +1684,7 @@ if checkbootparam 'distcc' ; then
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
-   /etc/init.d/distcc start 1>/dev/null ; eend $?
+   /etc/init.d/distcc start >/dev/null ; eend $?
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
@@ -2219,9 +1779,10 @@ fi
 
 # {{{ SW-RAID
 config_swraid(){
 
 # {{{ SW-RAID
 config_swraid(){
-  if [ -z "$INSTALLED" ] ; then
+  [ -n "$INSTALLED" ] && return 0
+
   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
-  if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
+  if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
@@ -2282,14 +1843,83 @@ config_swraid(){
 
      fi # is /sbin/mdadm executable?
   fi # check for bootoptions
 
      fi # is /sbin/mdadm executable?
   fi # check for bootoptions
-  fi # run only in live-cd mode
+}
+# }}}
+
+# {{{ dmraid
+config_dmraid(){
+  [ -n "$INSTALLED" ] && return 0
+
+  if checkbootparam 'nodmraid' ; then
+    ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
+    return 0
+  fi
+
+  if ! [ -x /sbin/dmraid ] ; then
+    eerror "dmraid not available, can not execute it." ; eend 1
+    return
+  fi
+
+  dmraid_wrapper() {
+    # usage: dmraid_wrapper <dmraid_option>
+    [ -n "$1" ] || return 1
+
+    IFSOLD=${IFS:-}
+    IFS='
+'
+    eindent
+
+    for line in $(dmraid $1 ; echo errcode:$?); do
+      case $line in
+        *'no block devices found'*)
+          einfo "No block devices found" ; eend 0
+          break
+          ;;
+        *'no raid disks'*)
+          einfo "No active dmraid devices found" ; eend 0
+          break
+          ;;
+        errcode:0)
+          eend 0;
+          ;;
+        errcode:1)
+          eend 1
+          ;;
+        *)
+          einfo "$line"
+          ;;
+      esac
+    done
+
+    eoutdent
+    IFS=$IFSOLD
+  }
+
+  if checkbootparam 'dmraid' ; then
+    local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
+    if [ "$ACTION" = "off" ] ; then
+      # Deactivates all active software RAID sets:
+      einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
+      dmraid_wrapper -an
+    else
+      # Activate all software RAID sets discovered:
+      einfo "Activating present dmraid sets (as requested via dmraid):"
+      dmraid_wrapper -ay
+    fi
+
+    return
+  fi
+
+  # by default (no special bootoptions) discover all software RAID devices:
+  einfo "Searching for any present dmraid sets:"
+  dmraid_wrapper -r
 }
 # }}}
 
 # {{{ LVM (Logical Volumes)
 config_lvm(){
 }
 # }}}
 
 # {{{ LVM (Logical Volumes)
 config_lvm(){
-  if [ -z "$INSTALLED" ] ; then
-  # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
+  [ -n "$INSTALLED" ] && return 0
+
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
@@ -2297,7 +1927,7 @@ config_lvm(){
     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
-       if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
+       if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
@@ -2310,69 +1940,18 @@ config_lvm(){
        fi
     fi # check for lvm binary
   fi # check for bootoption nolvm
        fi
     fi # check for lvm binary
   fi # check for bootoption nolvm
-  fi # run only in live-cd mode
 }
 # }}}
 
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam 'debnet' ; then
 }
 # }}}
 
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam 'debnet' ; then
- iszsh && setopt shwordsplit
- DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
- DEVICES="$DEVICES $(ls /dev/mapper/*)"
- FOUND_DEBNET=""
-
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
- eindent
- if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
-    for i in $DEVICES; do
-     if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
-         einfo "Scanning on $i"
-       if [ -f /mnt/etc/network/interfaces ]; then
-         einfo "/etc/network/interfaces found on ${i}" ; eend 0
-         FOUND_DEBNET="$i"
-         break
-       fi
-       umount /mnt
-     fi
-    done
-
-   if [ -n "$FOUND_DEBNET" ]; then
-     einfo "Stopping network."
-       pump -k 1>/dev/null 2>&1
-       /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
-     einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
-       rm -rf /etc/network/run
-       cp -a /mnt/etc/network /etc
-       rm -rf /etc/network/run
-       mkdir /etc/network/run
-       umount /mnt ; eend $?
-     einfo "Starting network."
-       invoke-rc.d networking start ; eend $?
-   else
-     eerror "/etc/network/interfaces not found." ; eend 1
-   fi
-   eoutdent
- else
-  eerror "Error: /mnt already mounted." ; eend 1
- fi
+ /usr/sbin/debnet
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
-# {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
-config_ipw3945() {
-  if grep -q ipw3945 /proc/modules ; then
-     if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
-        ewarn "Broken ipw3945 network interface found, reloading module."
-        rmmod ipw3945
-        modprobe ipw3945
-        eend $?
-     fi
-  fi
-}
-# }}}
-
 # {{{ disable console blanking
 config_blanking(){
 if checkbootparam 'noblank' ; then
 # {{{ disable console blanking
 config_blanking(){
 if checkbootparam 'noblank' ; then
@@ -2426,7 +2005,7 @@ config_tohd()
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
-if checkbootparam "BOOT_IMAGE=grml2hd" ; then
+if checkbootparam "grml2hd" || checkbootparam "BOOT_IMAGE=grml2hd" ; then
 
 if checkbootparam 'user' ; then
    NEWUSER=''
 
 if checkbootparam 'user' ; then
    NEWUSER=''
@@ -2478,7 +2057,7 @@ fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
-if checkbootparam "BOOT_IMAGE=debian2hd" ; then
+if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
 
 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
 
 
 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
 
@@ -2567,6 +2146,45 @@ fi # checkbootparam "BOOT_IMAGE=debian2hd
 }
 # }}}
 
 }
 # }}}
 
+config_virtualbox_shared_folders() {
+if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
+  einfo "VirtualBox detected, trying to set up Shared Folders."
+  if ! modprobe -l | grep -q vboxsf.ko ; then
+    ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
+    eend 0
+  elif ! [ -x /usr/sbin/VBoxService ] ; then
+    ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
+    eend 0
+  else
+    eindent
+
+      einfo "Loading vboxsf driver."
+      lsmod | grep -q vboxsf || modprobe vboxsf
+      eend $?
+
+      einfo "Adjusting /dev/vboxguest."
+      chown root:vboxsf /dev/vboxguest
+      chmod 660 /dev/vboxguest
+      eend $?
+
+      if [ -n "$CONFIG_FSTAB_USER" ] ; then
+        fstabuser="$CONFIG_FSTAB_USER"
+      else
+        fstabuser=$(getent passwd 1000 | cut -d: -f1)
+      fi
+      einfo "Adding $fstabuser to group vboxsf."
+      adduser grml vboxsf &>/dev/null
+      eend $?
+
+      einfo "Starting VBoxService."
+      VBoxService >/dev/null &
+      eend $?
+
+    eoutdent
+  fi
+fi
+}
+
 # {{{ Support customization
 config_distri(){
 if checkbootparam 'distri'; then
 # {{{ Support customization
 config_distri(){
 if checkbootparam 'distri'; then
@@ -2581,14 +2199,5 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-### {{{ backwards compatible stuff
-config_environment(){
-  ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
-}
-config_keyboard(){
-  ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
-}
-# }}}
-
 ## END OF FILE #################################################################
 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3
 ## END OF FILE #################################################################
 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3