Bootoption hostname: use grml-hostname to adjust configuration files on the fly.
[grml-autoconfig.git] / autoconfig.functions
index 7af72a2..3cc12ee 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/zsh
 # Filename:      autoconfig.functions
 # Purpose:       basic system configuration and hardware setup for grml system
 #!/bin/zsh
 # Filename:      autoconfig.functions
 # Purpose:       basic system configuration and hardware setup for grml system
-# Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
+# Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 ################################################################################
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 ################################################################################
@@ -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:
@@ -32,51 +33,71 @@ fi
 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
 # }}}
 
 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
 # }}}
 
-### {{{ Utility Functions
-
-# Simple shell grep
-stringinfile(){
-  case "$(cat $2)" in *$1*) return 0;; esac
-  return 1
-}
+# {{{ Read in boot parameters
+if [ -z "$CMDLINE" ]; then
+  # if CMDLINE was set from the outside, we're debugging.
+  # otherwise, take CMDLINE from Kernel and config files.
+  CMDLINE="$(cat /proc/cmdline)"
+  [ -d /cdrom/bootparams/ ]      && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
+  [ -d /live/image/bootparams/ ] && CMDLINE="$CMDLINE $(cat /live/image/bootparams/* | tr '\n' ' ')"
+fi
+# }}}
 
 
-# same for strings
-stringinstring(){
-  case "$2" in *$1*) return 0;; esac
-  return 1
-}
+### {{{ Utility Functions
 
 
-# Reread boot command line; echo last parameter's argument or return false.
+# Get a bootoption's parameter: read boot command line and either
+# echo last parameter's argument or return false.
 getbootparam(){
 getbootparam(){
-  stringinstring " $1=" "$CMDLINE" || return 1
-  result="${CMDLINE##*$1=}"
-  result="${result%%[  ]*}"
-  echo "$result"
-  return 0
+  local line
+  local ws
+  ws='  '
+  line=" $CMDLINE "
+  case "$line" in
+    *[${ws}]"$1="*)
+      result="${line##*[$ws]$1=}"
+      result="${result%%[$ws]*}"
+      echo "$result"
+      return 0 ;;
+    *) # no match?
+      return 1 ;;
+  esac
 }
 
 # Check boot commandline for specified option
 checkbootparam(){
 }
 
 # Check boot commandline for specified option
 checkbootparam(){
-  stringinstring " $1" "$CMDLINE"
-  return "$?"
+  [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
+  local line
+  local ws
+  ws='  '
+  line=" $CMDLINE "
+  case "$line" in
+    *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
+      return 0 ;;
+    *)
+      return 1 ;;
+  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(){
 checkvalue(){
-  if [ "$1" = "yes" ] ; then
-    return 0
-  else
-    return 1
-  fi
+  case "$1" in
+    [yY][eE][sS])     return 0 ;; # it's set to 'yes'
+    [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
+                   *) return 1 ;; # default
+  esac
 }
 
 }
 
+# Are we using grml-small?
 checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
 checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
-checkgrmlusb(){
-  grep -q usb /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 "$*"
 # execute flite only if it's present
 flitewrapper() {
    [ -x /usr/bin/flite ] && flite -o play -t "$*"
@@ -89,7 +110,7 @@ mount_proc(){
 }
 
 mount_pts(){
 }
 
 mount_pts(){
-  stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
+  grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
 }
 
 mount_sys(){
 }
 
 mount_sys(){
@@ -97,23 +118,17 @@ mount_sys(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Read in boot parameters
-[ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
-CMDLINE="$(cat /proc/cmdline)"
-[ -d "${LIVECD_PATH}"/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
-# }}}
-
-# {{{ Check if we are running from the grml-CD or HD
+# {{{ Check if we are running in live mode or from HD
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
 
 # testcd
 TESTCD=""
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
 
 # testcd
 TESTCD=""
-checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
+checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes"
 # }}}
 
 # {{{ source lsb-functions , color handling
 # }}}
 
 # {{{ source lsb-functions , color handling
-if checkbootparam "nocolor"; then
+if checkbootparam 'nocolor'; then
   RC_NOCOLOR=yes
   . /etc/grml/lsb-functions
   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
   RC_NOCOLOR=yes
   . /etc/grml/lsb-functions
   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
@@ -125,8 +140,8 @@ fi
 
 # {{{ debug
 config_debug(){
 
 # {{{ debug
 config_debug(){
- checkbootparam "debug"                        && BOOTDEBUG="yes"
stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && BOOTDEBUG="yes"
+ checkbootparam 'debug'            && BOOTDEBUG="yes"
checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
 
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
 
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
@@ -155,7 +170,7 @@ config_debug(){
 
 # {{{ log
 config_log(){
 
 # {{{ log
 config_log(){
-if checkbootparam "log" || checkbootparam "debug" ; then
+if checkbootparam 'log' || checkbootparam 'debug' ; then
    export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
    touch $DEBUG
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
    touch $DEBUG
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
@@ -171,7 +186,7 @@ fi
 
 # {{{ set firmware timeout via bootparam
 config_fwtimeout(){
 
 # {{{ set firmware timeout via bootparam
 config_fwtimeout(){
- if checkbootparam fwtimeout ; then
+ 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
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
    rmmod firmware_class 1>>$DEBUG 2>&1
@@ -199,22 +214,27 @@ config_language(){
  grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
 
  # check for bootoption which overrides config from /etc/grml/autoconfig:
  grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
 
  # check for bootoption which overrides config from /etc/grml/autoconfig:
- BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
+ 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:
  if [ -z "$INSTALLED" ] ; then
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
  if [ -z "$INSTALLED" ] ; then
-    [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
+    [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
 
  fi
 
- # if bootoption lang is used update /etc/default/locale, otherwise *not*!
- if [ -n "$BOOT_LANGUAGE" ] ; then
-    [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
+ 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
  fi
 
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
-    if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; 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
        # [ -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
@@ -222,6 +242,9 @@ config_language(){
        else
           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
        fi
        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
 
@@ -237,7 +260,7 @@ config_language(){
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
 
  # now allow keyboard override by boot commandline for later use:
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
 
  # now allow keyboard override by boot commandline for later use:
- KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
+ KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
@@ -249,7 +272,7 @@ config_language(){
    local LANGUAGE="$BOOT_LANGUAGE"
    . /etc/grml/language-functions
    # allow setting xkeyboard explicitly different than console keyboard
    local LANGUAGE="$BOOT_LANGUAGE"
    . /etc/grml/language-functions
    # allow setting xkeyboard explicitly different than console keyboard
-   KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
+   KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
    if [ -n "$KXKEYBOARD" ]; then
       XKEYBOARD="$KXKEYBOARD"
       KDEKEYBOARD="$KXKEYBOARD"
    if [ -n "$KXKEYBOARD" ]; then
       XKEYBOARD="$KXKEYBOARD"
       KDEKEYBOARD="$KXKEYBOARD"
@@ -261,7 +284,7 @@ config_language(){
    # duplicate of previous code to make sure /etc/grml/language-functions
    # does not overwrite our values....
    # now allow keyboard override by boot commandline for later use:
    # duplicate of previous code to make sure /etc/grml/language-functions
    # does not overwrite our values....
    # now allow keyboard override by boot commandline for later use:
-   KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
+   KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
@@ -309,7 +332,7 @@ config_language(){
     eend $RC
  fi
 
     eend $RC
  fi
 
- if checkbootparam noconsolefont ; then
+ if checkbootparam 'noconsolefont' ; then
     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
@@ -328,11 +351,12 @@ config_language(){
 
 # {{{ Set hostname
 config_hostname(){
 
 # {{{ Set hostname
 config_hostname(){
- if checkbootparam hostname ; then
+ if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
   einfo "Setting hostname to $HOSTNAME as requested."
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
   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
@@ -356,26 +380,36 @@ config_userfstab(){
 config_time(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
 config_time(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-    UTC=""
-    checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
-    checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
+    # The default hardware clock timezone is stated as representing local time.
+    UTC="--localtime"
+    grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
+    checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
+    checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
+    checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|"  /etc/default/rcS
+    grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
     # hwclock uses the TZ variable
     # hwclock uses the TZ variable
-    [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
-    [ -n "$TZ" ] || TZ=Europe/Vienna
+    KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
+    [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
+    if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
+       ewarn "Warning: unknown timezone $KTZ" ; eend 1
+       KTZ="Europe/Vienna"
+       ewarn "Falling back to timezone $KTZ" ; eend 0
+    fi
 
     if ! [ -r /dev/rtc ] ; then
 
     if ! [ -r /dev/rtc ] ; then
-      ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
-    else
-      ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
-      if [ -n "$ERROR" ] ; then
-         eindent
-         ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
-         if [ -n "$ERROR" ] ; then
-            eerror "Problem running hwclock: $ERROR" ; eend 1
-         fi
-         eoutdent
-      fi
+      ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
     fi
     fi
+
+    ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
+    if [ -n "$ERROR" ] ; then
+       eindent
+       ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
+       if [ -n "$ERROR" ] ; then
+          eerror "Problem running hwclock: $ERROR" ; eend 1
+       fi
+       eoutdent
+    fi
+
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -402,12 +436,12 @@ config_kernel(){
 
 # {{{ vmware specific stuff
 config_vmware(){
 
 # {{{ vmware specific stuff
 config_vmware(){
-if checkbootparam novmware ; then
+if checkbootparam 'novmware' ; then
    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
 else
    if [ -z "$INSTALLED" ] ; then
    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
 else
    if [ -z "$INSTALLED" ] ; then
-      if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
-         if ! checkbootparam qemu ; 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 $?
             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 $?
@@ -426,7 +460,7 @@ fi
 
 # {{{ qemu specific stuff
 config_qemu(){
 
 # {{{ qemu specific stuff
 config_qemu(){
-if checkbootparam qemu ; then
+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 $?
    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 $?
@@ -456,12 +490,23 @@ fi
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-    KTZ="$(getbootparam tz 2>>$DEBUG)"
+    KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
     if [ -n "$KTZ" ] ; then
     if [ -n "$KTZ" ] ; then
-       einfo "Setting timezone."
-       [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
-       rm -f /etc/localtime
-       cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
+       if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
+       then
+          ewarn "Warning: unknown timezone $KTZ"; eend 0
+       else
+          einfo "Setting timezone."
+          # update debconf
+          area=$(echo $KTZ | cut -d '/' -f1)
+          zone=$(echo $KTZ | cut -d '/' -f2)
+          echo "tzdata tzdata/Areas       select $area" | debconf-set-selections
+          echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
+          # update files
+          echo $KTZ > /etc/timezone
+          rm -f /etc/localtime
+          cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
+       fi
     fi
  fi
 }
     fi
  fi
 }
@@ -474,7 +519,7 @@ RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
 eindent
 
 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
 eindent
 
-if checkbootparam "small"; then
+if checkbootparam 'small'; then
   einfo "Information: ${RAM} kB of RAM available." ; eend 0
   einfo "Bootoption small detected. Activating small system."
   if [ -r /etc/inittab.small ] ; then
   einfo "Information: ${RAM} kB of RAM available." ; eend 0
   einfo "Bootoption small detected. Activating small system."
   if [ -r /etc/inittab.small ] ; then
@@ -516,8 +561,8 @@ eoutdent
 
 # skip startup of w3m {{{
 config_fast(){
 
 # skip startup of w3m {{{
 config_fast(){
-if checkbootparam "fast"; then
-  ewarn "Bootoption fast detected. Skipping startup of w3m."
+if checkbootparam 'fast'; then
+  ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
     sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
   /sbin/telinit q ; eend $?
 fi
     sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
   /sbin/telinit q ; eend $?
 fi
@@ -526,11 +571,11 @@ fi
 
 # activate serial console {{{
 config_console(){
 
 # activate serial console {{{
 config_console(){
-if checkbootparam "console"; then
+if checkbootparam 'console'; then
   einfo "Bootoption (for serial) console detected."
   eindent
     if [ -r /etc/mgetty/mgetty.config ] ; then
   einfo "Bootoption (for serial) console detected."
   eindent
     if [ -r /etc/mgetty/mgetty.config ] ; then
-       MODE=$(getbootparam console | awk -F, '{print $2}')
+       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"
        MODE=${MODE%%n*}
        [ -n "$MODE" ] || MODE=9600 # default mode
        einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
@@ -573,7 +618,7 @@ config_local_net(){
 # so let's create raw1394 device manually
 # http://www.michael-prokop.at/blog/index.php?p=352
 config_firewire_dev(){
 # so let's create raw1394 device manually
 # http://www.michael-prokop.at/blog/index.php?p=352
 config_firewire_dev(){
-if checkbootparam "nofirewiredev" ; then
+if checkbootparam 'nofirewiredev' ; then
   ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
 else
 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
   ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
 else
 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
@@ -630,7 +675,7 @@ fi
 
 # {{{ hardware detection via discover
 config_discover(){
 
 # {{{ hardware detection via discover
 config_discover(){
-if checkbootparam "nodisc" ; then
+if checkbootparam 'nodisc' ; then
   ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
 else
  if [ -x /sbin/discover ] ; then
   ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
 else
  if [ -x /sbin/discover ] ; then
@@ -649,7 +694,7 @@ fi
 
 # {{{ hardware detection via hwinfo
 config_hwinfo(){
 
 # {{{ hardware detection via hwinfo
 config_hwinfo(){
-if checkbootparam hwinfo >>$DEBUG 2>&1; then
+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: "
   einfo "Discovering hardware via hwinfo:"
   MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
   echo -n "  Loading modules: "
@@ -661,7 +706,7 @@ fi
 
 # {{{ disable hotplug agents on request
 config_hotplug_agent(){
 
 # {{{ disable hotplug agents on request
 config_hotplug_agent(){
-if checkbootparam "noagent" ; then
+if checkbootparam 'noagent' ; then
   AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
   AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
   AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
   AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
   AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
   AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
@@ -676,7 +721,7 @@ fi
 
 # {{{ blacklist of hotplug-modules
 config_hotplug_blacklist(){
 
 # {{{ blacklist of hotplug-modules
 config_hotplug_blacklist(){
-if checkbootparam "black" ; then
+if checkbootparam 'black' ; then
   BLACK="$(getbootparam 'black' 2>>$DEBUG)"
   BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
   BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
   BLACK="$(getbootparam 'black' 2>>$DEBUG)"
   BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
   BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
@@ -690,7 +735,7 @@ fi
 
 # {{{ run hotplug
 config_hotplug(){
 
 # {{{ run hotplug
 config_hotplug(){
-if checkbootparam "nohotplug" ; then
+if checkbootparam 'nohotplug' ; then
   ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
 else
   if [ -r /etc/init.d/hotplug ] ; then
   ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
 else
   if [ -r /etc/init.d/hotplug ] ; then
@@ -710,17 +755,18 @@ fi
 
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
-if checkbootparam "blacklist" ; then
+if checkbootparam 'blacklist' ; then
  if [ -z "$INSTALLED" ]; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
  if [ -z "$INSTALLED" ]; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
+  BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
   if [ -n "$BLACK" ] ; then
     for module in $(echo ${BLACK//,/ }) ; do
   if [ -n "$BLACK" ] ; then
     for module in $(echo ${BLACK//,/ }) ; do
-        einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
-        echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
-        echo "blacklist $module"     >> /etc/modprobe.d/grml
-        echo "alias     $module off" >> /etc/modprobe.d/grml
-        echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
+        einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
+        echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
+        echo "blacklist $module"     >> "$BLACKLIST_FILE"
+        echo "alias     $module off" >> "$BLACKLIST_FILE"
+        echo "# end   entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
     done
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
     done
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
@@ -738,9 +784,9 @@ fi
 # {{{ ACPI
 config_acpi_apm(){
 if [ -d /proc/acpi ]; then
 # {{{ ACPI
 config_acpi_apm(){
 if [ -d /proc/acpi ]; then
-  if checkbootparam "noacpi"; then
+  if checkbootparam 'noacpi'; then
     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
-  elif checkbootparam "nogrmlacpi" ; then
+  elif checkbootparam 'nogrmlacpi' ; then
     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
   else
     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
   else
     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
@@ -777,7 +823,7 @@ if [ -d /proc/acpi ]; then
   fi
 else
 # APM
   fi
 else
 # APM
-  if checkbootparam "noapm"; then
+  if checkbootparam 'noapm'; then
     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
   else
     modprobe apm power_off=1 >>$DEBUG 2>&1
     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
   else
     modprobe apm power_off=1 >>$DEBUG 2>&1
@@ -797,7 +843,7 @@ fi
 # {{{ PCMCIA Check/Setup
 # This needs to be done before other modules are being loaded (by hwsetup)
 config_pcmcia(){
 # {{{ PCMCIA Check/Setup
 # This needs to be done before other modules are being loaded (by hwsetup)
 config_pcmcia(){
-if checkbootparam "nopcmcia"; then
+if checkbootparam 'nopcmcia'; then
   ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
 else
   if /usr/sbin/laptop-detect ; then
   ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
 else
   if /usr/sbin/laptop-detect ; then
@@ -823,10 +869,10 @@ fi
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
-   if checkbootparam swspeak ; then
+   if checkbootparam 'swspeak' ; then
       einfo "Bootoption swspeak found."
 
       einfo "Bootoption swspeak found."
 
-      if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
+      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"
          ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
          eindent
          einfo "Loading speakup_soft"
@@ -840,27 +886,11 @@ config_swspeak(){
          eoutdent
       fi
 
          eoutdent
       fi
 
-      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
+      if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
          einfo "Kernel supports speakup." ; eend 0
          eindent
          einfo "Kernel supports speakup." ; eend 0
          eindent
-         if [ -x /etc/init.d/speech-dispatcher ] ; then
-            einfo "Starting speech-dispatcher."
-            /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
-            if [ -r /proc/speakup/synth_name ] ; then
-               einfo "Activating sftsyn via /proc in Kernel."
-               echo sftsyn > /proc/speakup/synth_name ; eend $?
-            elif [ -r /sys/modules/speakup/parameters/synth ] ; then
-               einfo "Activating sftsyn via /sys in Kernel."
-               echo sftsyn > /sys/modules/speakup/parameters/synth ; eend $?
-            else
-               eerror "Error when configuring sftsyn via /proc or /sys." ; eend 1
-            fi
             einfo "Just run swspeak if you want to use software synthesizer via speakup."
             flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
             einfo "Just run swspeak if you want to use software synthesizer via speakup."
             flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
-         else
-            eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
-            flitewrapper "speech-dispatcher not available. speakup will not work without it."
-         fi
          eoutdent
       else
          eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
          eoutdent
       else
          eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
@@ -872,19 +902,48 @@ config_swspeak(){
 
 # {{{ support hardware synthesizer via speakup
 config_hwspeak(){
 
 # {{{ support hardware synthesizer via speakup
 config_hwspeak(){
-   if checkbootparam hwspeak ; then
+   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
       einfo "Bootoption hwspeak found."
 
       if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
-         ewarnKernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
+         ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
          eindent
          eindent
-         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
+         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
 
          eoutdent
       fi
 
@@ -902,8 +961,8 @@ config_hwspeak(){
 # {{{ Check for blind option or brltty
 config_blind(){
 BLIND=""
 # {{{ Check for blind option or brltty
 config_blind(){
 BLIND=""
-checkbootparam "blind" && BLIND="yes"
-BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
+checkbootparam 'blind' && BLIND="yes"
+BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)"
 
 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
   if [ -x /sbin/brltty ]; then
 
 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
   if [ -x /sbin/brltty ]; then
@@ -950,16 +1009,16 @@ config_interactive(){
 
 # {{{ AGP
 config_agp(){
 
 # {{{ AGP
 config_agp(){
-if checkbootparam forceagp ; then
+if checkbootparam 'forceagp' ; then
 # Probe for AGP. Hope this can fail safely
 # Probe for AGP. Hope this can fail safely
-  stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
+  grep -q "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
 fi
 }
 # }}}
 
 # {{{ automount(er)
 config_automounter(){
 fi
 }
 # }}}
 
 # {{{ automount(er)
 config_automounter(){
-if checkbootparam automounter ; then
+if checkbootparam 'automounter' ; then
   RUNLEVEL="$(runlevel)"
   AUTOMOUNTER=""
   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
   RUNLEVEL="$(runlevel)"
   AUTOMOUNTER=""
   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
@@ -972,14 +1031,14 @@ addautomount(){
     [ -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"
     [ -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
+    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
     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
+  grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
 }
 
   AUTOMOUNTS="floppy cdrom"
 }
 
   AUTOMOUNTS="floppy cdrom"
@@ -1033,7 +1092,7 @@ check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only
 # {{{ Enable DMA for all IDE drives now if not disabled
 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
 config_dma(){
 # {{{ Enable DMA for all IDE drives now if not disabled
 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
 config_dma(){
-if checkbootparam "nodma"; then
+if checkbootparam 'nodma'; then
   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
 else
   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
 else
   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
@@ -1055,12 +1114,12 @@ fi
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
-if checkbootparam "swap" || checkbootparam "anyswap" ; then
+if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
    NOSWAP=''
    NOSWAP=''
-   checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
+   checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
 fi
 
-if checkbootparam "nofstab" || checkbootparam "forensic" ; then
+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)"
   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)"
@@ -1078,7 +1137,7 @@ if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
    GRML_IMG=""
    GRML_SWP=""
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
    GRML_IMG=""
    GRML_SWP=""
-   HOMEDIR="$(getbootparam home)"
+   HOMEDIR="$(getbootparam 'home')"
    if [ -n "$partitions" ]; then
       while read p m f relax; do
         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
    if [ -n "$partitions" ]; then
       while read p m f relax; do
         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
@@ -1144,7 +1203,7 @@ if [ -z "$INSTALLED" ] ; then
                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
               eoutdent
               fnew="$SWAPFILE swap swap defaults 0 0"
                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
               eoutdent
               fnew="$SWAPFILE swap swap defaults 0 0"
-              stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
+              grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
               GRML_SWP="$GRML_SWP $SWAPFILE"
               eend 0
            fi
               GRML_SWP="$GRML_SWP $SWAPFILE"
               eend 0
            fi
@@ -1188,7 +1247,7 @@ fi
 # {{{ IPv6 configuration
 # Load IPv6 kernel module and print IP adresses
 config_ipv6(){
 # {{{ IPv6 configuration
 # Load IPv6 kernel module and print IP adresses
 config_ipv6(){
-if checkbootparam "ipv6"; then
+if checkbootparam 'ipv6'; then
   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
   modprobe ipv6
   # we probably need some time until stateless autoconfiguration has happened
   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
   modprobe ipv6
   # we probably need some time until stateless autoconfiguration has happened
@@ -1216,7 +1275,7 @@ fi
 
 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
 config_dhcp(){
 
 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
 config_dhcp(){
-if checkbootparam "nodhcp"; then
+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)"
   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)"
@@ -1225,7 +1284,7 @@ else
     einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
     trap 2 3 11
     ifconfig $DEVICE up >>$DEBUG 2>&1
     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 ) &
+    ( pump -i $DEVICE --script=/usr/lib/grml-autoconfig/pump-runparts >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
     trap "" 2 3 11
     sleep 1
     eend 0
     trap "" 2 3 11
     sleep 1
     eend 0
@@ -1293,7 +1352,7 @@ return 1
 
 # {{{ CPU-detection
 config_cpu(){
 
 # {{{ CPU-detection
 config_cpu(){
-if checkbootparam "nocpu"; then
+if checkbootparam 'nocpu'; then
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
 else
   # check module dependencies
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
 else
   # check module dependencies
@@ -1318,77 +1377,75 @@ else
 
   # 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
 
   # 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
+  # * cpufreq 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
   # * 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="
+     # Virtual Box supports ACPI and laptop-detect would return 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 "Trying to set up 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
+              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
 
 
-       eoutdent
+     eoutdent
 
 
-    fi # laptop-detect
   fi # cpufreq_check
 fi # checkbootparam nocpu
 }
   fi # cpufreq_check
 fi # checkbootparam nocpu
 }
@@ -1396,7 +1453,7 @@ fi # checkbootparam nocpu
 
 # {{{ autostart of ssh
 config_ssh(){
 
 # {{{ autostart of ssh
 config_ssh(){
-if checkbootparam ssh ; then
+if checkbootparam 'ssh' ; then
    SSH_PASSWD=''
    SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
    einfo "Bootoption ssh found, trying to set password for user grml."
    SSH_PASSWD=''
    SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
    einfo "Bootoption ssh found, trying to set password for user grml."
@@ -1426,7 +1483,12 @@ if checkbootparam ssh ; then
 
    # finally check if we have a password we can use:
    if [ -n "$SSH_PASSWD" ] ; then
 
    # finally check if we have a password we can use:
    if [ -n "$SSH_PASSWD" ] ; then
-      echo "grml:$SSH_PASSWD" | chpasswd -m
+      # chpasswd sucks, seriously.
+      if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
+        echo "grml:$SSH_PASSWD" | chpasswd -m
+      else
+        echo "grml:$SSH_PASSWD" | chpasswd
+      fi
    fi
 
    einfo 'Starting secure shell server in background.'
    fi
 
    einfo 'Starting secure shell server in background.'
@@ -1441,9 +1503,59 @@ 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
+fi
+}
+# }}}
+
 # {{{ set password for user grml
 config_passwd(){
 # {{{ set password for user grml
 config_passwd(){
-if checkbootparam passwd >>$DEBUG 2>&1; then
+if checkbootparam 'passwd' >>$DEBUG 2>&1; then
   einfo "Bootoption passwd found."
   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
   if [ -n "$PASSWD" ] ; then
   einfo "Bootoption passwd found."
   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
   if [ -n "$PASSWD" ] ; then
@@ -1460,8 +1572,8 @@ fi
 
 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
 config_homedir(){
 
 # {{{ 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)"
+if checkbootparam 'home' ; then
+   HOMEDIR="$(getbootparam 'home')"
    MYHOMEDEVICE=""
    MYHOMEMOUNTPOINT=""
    MYHOMEDIR=""
    MYHOMEDEVICE=""
    MYHOMEMOUNTPOINT=""
    MYHOMEDIR=""
@@ -1542,21 +1654,11 @@ fi # checkbootparam home
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Check for scripts on CD-ROM
-config_cdrom_scripts(){
-if checkbootparam "script"; then
-   for script in "${LIVECD_PATH}"/scripts/* ; do
-       einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
-       . $script
-   done
-fi
-}
-# }}}
-
 # {{{ Sound
 # {{{ Sound
+
 config_mixer(){
 config_mixer(){
-if ! [ -x /usr/bin/aumix ] ; then
-  eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
+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
 else
 
   if ! [ -r /proc/asound/cards ] ; then
@@ -1564,7 +1666,7 @@ else
      return
   fi
 
      return
   fi
 
-  if checkbootparam vol ; then
+  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="$(getbootparam 'vol' 2>>$DEBUG)"
     if [ -z "$VOL" ] ; then
       eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
@@ -1574,16 +1676,14 @@ else
     VOL='75' # default
   fi
 
     VOL='75' # default
   fi
 
-  if checkbootparam nosound ; then
+  if checkbootparam 'nosound' ; then
     einfo "Muting sound devices on request."
     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=$?
+
+    fix_ibm_sound 0
+    # mute the master, this should be sufficient
+    ERROR=$(amixer -q set Master mute)
+    RC=$?
+
     if [ -n "$ERROR" ] ; then
        eindent
        eerror "Problem muting sound devices: $ERROR"
     if [ -n "$ERROR" ] ; then
        eindent
        eerror "Problem muting sound devices: $ERROR"
@@ -1592,37 +1692,55 @@ else
     eend $RC
   elif [ -z "$INSTALLED" ]; then
       einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
     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
-         fi
-      fi
+
+      fix_ibm_sound ${VOL}
+
       # by default assume '0' as volume for microphone:
       # by default assume '0' as volume for microphone:
-      if checkbootparam micvol ; then
+      if checkbootparam 'micvol' ; then
          MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
       else
          MICVOL=0
       fi
 
       # finally set the volumes:
          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
+      RC=0
+      for CONTROL in Master PCM ; do
+         amixer -q set ${CONTROL} ${VOL}%
+         if [ $? -ne 0 ] ; then RC=$? ; fi
+      done
+      # dont know how to set microphone volume for all soundcards with amixer,
+      # so use aumix instead :/
+      if [ ${MICVOL} -ne 0 -a -x /usr/bin/aumix ] ; then
+         aumix -m $MICVOL &>/dev/null
+         if [ $? -ne 0 ] ; then RC=$? ; fi
       fi
       fi
+
       eend $RC
   fi
 
 fi
 }
       eend $RC
   fi
 
 fi
 }
+
+# on some IBM notebooks the front control has to be toggled
+fix_ibm_sound() {
+ if [ -z $1 ] ; then
+    return
+ fi
+
+ VOL=${1}
+
+ if [ -x /usr/bin/amixer ] ; then
+    if amixer -q get Front 1>/dev/null 2>>$DEBUG ; then
+       amixer -q set Front unmute &>/dev/null
+       amixer -q set Front ${VOL}% &>/dev/null
+    fi
+ fi
+}
 # }}}
 
 # {{{ modem detection
 config_modem(){
 # }}}
 
 # {{{ modem detection
 config_modem(){
-if checkbootparam "nomodem"; then
+if checkbootparam 'nomodem'; then
   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
 else
   if [ -x /etc/init.d/sl-modem-daemon ] ; then
   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
 else
   if [ -x /etc/init.d/sl-modem-daemon ] ; then
@@ -1637,7 +1755,7 @@ fi
 
 # {{{ keyboard add-ons
 config_setkeycodes(){
 
 # {{{ keyboard add-ons
 config_setkeycodes(){
-if checkbootparam "setkeycodes" ; then
+if checkbootparam 'setkeycodes' ; then
  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
   # MS MM keyboard add-on
   # fix
  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
   # MS MM keyboard add-on
   # fix
@@ -1665,8 +1783,8 @@ fi
 
 # {{{ wondershaper
 config_wondershaper(){
 
 # {{{ wondershaper
 config_wondershaper(){
- if checkbootparam "wondershaper" ; then
-    WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
+ if checkbootparam 'wondershaper' ; then
+    WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
     CMD=wondershaper
     DEVICE=""
     DOWNSTREAM=""
     CMD=wondershaper
     DEVICE=""
     DOWNSTREAM=""
@@ -1697,7 +1815,7 @@ config_wondershaper(){
 
 # {{{ syslog-ng
 config_syslog(){
 
 # {{{ syslog-ng
 config_syslog(){
- if checkbootparam "nosyslog"; then
+ if checkbootparam 'nosyslog'; then
     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
     SYSLOGD=''
     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
     SYSLOGD=''
@@ -1720,7 +1838,7 @@ config_syslog(){
 
 # {{{ gpm
 config_gpm(){
 
 # {{{ gpm
 config_gpm(){
- if checkbootparam "nogpm"; then
+ if checkbootparam 'nogpm'; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
    if ! [ -r /dev/input/mice ] ; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
    if ! [ -r /dev/input/mice ] ; then
@@ -1737,8 +1855,8 @@ config_gpm(){
 
 # {{{ services
 config_services(){
 
 # {{{ services
 config_services(){
- if checkbootparam "services" ; then
-    SERVICE="$(getbootparam services 2>>$DEBUG)"
+ if checkbootparam 'services' ; then
+    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."
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     einfo "Starting service(s) ${SERVICENL} in background."
@@ -1750,38 +1868,66 @@ config_services(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ 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
+    einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
+    return 1;
+ fi
+}
+# }}}
+
+# {{{ 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
+}
+# }}}
+
+# {{{ 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}:" && ${SCRIPTFILE} ; eend $?
+  fi
+
  fi
 }
 # }}}
 
 # {{{ blindsound
 config_blindsound(){
  fi
 }
 # }}}
 
 # {{{ blindsound
 config_blindsound(){
- if checkbootparam "blind" ; then
+ if checkbootparam 'blind' ; then
     beep
     flitewrapper "welcome to the gremel system"
  fi
     beep
     flitewrapper "welcome to the gremel system"
  fi
@@ -1790,7 +1936,7 @@ config_blindsound(){
 
 # {{{ welcome sound
 config_welcome(){
 
 # {{{ welcome sound
 config_welcome(){
- if checkbootparam welcome ; then
+ if checkbootparam 'welcome' ; then
     flitewrapper "welcome to the gremel system"
  fi
 }
     flitewrapper "welcome to the gremel system"
  fi
 }
@@ -1813,8 +1959,10 @@ create_mnt_dirs(){
 
 # {{{ start X window system via grml-x
 config_x_startup(){
 
 # {{{ start X window system via grml-x
 config_x_startup(){
-if checkbootparam startx ; then
- if [ -x /usr/X11R6/bin/X ] ; then
+# 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 $(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
@@ -1848,12 +1996,12 @@ EOF
    fi
 
   else
    fi
 
   else
-    eerror "We are not running from CD - startx will not work, skipping it.
-     Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
+    eerror "We are not running in live mode - startx will not work, skipping it."
+    eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
   fi
  else
   fi
  else
-   eerror "/usr/X11R6/bin/X is not present on this grml flavour.
-   Boot parameter startx does not work therefore." ; eend 1
+   eerror "/usr/X11R6/bin/X is not present on this grml flavour."
+   eerror "  -> Boot parameter startx does not work therefore." ; eend 1
  fi
 fi
 }
  fi
 fi
 }
 
 # {{{ configuration framework
 config_extract(){
 
 # {{{ configuration framework
 config_extract(){
-if checkbootparam extract ; then
+if checkbootparam 'extract' ; then
  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
  EXTRACTOPTIONS="-- -x $EXTRACT"
 fi
 }
 
  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
  EXTRACTOPTIONS="-- -x $EXTRACT"
 fi
 }
 
-config_automount(){
-if checkbootparam noautoconfig || checkbootparam forensic ; then
+config_finddcsdir() {
+#  - If no GRMLCFG partition is found and noautoconfig is _not_ given
+#    on the command line, nothing is changed and the dcs files are
+#    searched within the .iso, $dcs-dir is set to the root directory
+#    within the .iso
+#  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
+#    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
+#    set, $dcs-dir is set to the root directory within the .iso.
+#  - 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"
+if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
- if [ -z "$INSTALLED" ] ; then
-  einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
-  eindent
-  [ -d /mnt/grml ] || mkdir /mnt/grml
-  umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
-# 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."
-#     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
-     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
-     fi
-  fi
-  DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
-  [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
-  if [[ $RC == 0 ]]; then
-    einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
-
-    CONFIG=''
-    CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
-    if [ -n "$CONFIG" ]; then
-      einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
-      cd /
-      unp $CONFIG $EXTRACTOPTIONS ; eend $?
-    else
-      ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
+  if [ -z "$INSTALLED" ] ; then
+    if checkbootparam 'myconfig' ; then
+      DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
+      if [ -z "$DCSDEVICE" ]; then
+        eerror "Error: No device for bootoption myconfig provided." ; eend 1
+      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
+      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
+        fi
+      fi
+      DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
+      if [ -n "$DCSDEVICE" ]; then
+        DCSMP="/mnt/grmlcfg"
+      fi
+      eoutdent
     fi
 
     fi
 
-    SCRIPT=''
-    SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
-    if [ -n "$SCRIPT" ]; then
-      einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
-      $SCRIPT ; eend $?
+    # 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
+        ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
+      else
+        [ -d $DCSMP ] || mkdir $DCSMP
+        umount $DCSMP 1>>$DEBUG 2>&1 # make sure it is not mounted
+        mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
+        if [[ $RC == 0 ]]; then
+          einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
+        else
+          eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
+        fi
+        DCSDIR="$DCSMP"
+      fi
+      eoutdent
     fi
     fi
-    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
-  else
-    ewarn "No devices with label GRMLCFG found." ; eend 0
   fi
   fi
-  eoutdent
- fi
 fi
 fi
-}
-
-config_myconfig(){
 
 
-if checkbootparam "config" ; then
-  CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
-  [ -z "$CONFIG" ] && CONFIG='config.tbz'
-  einfo "Bootoption config found. config is set to: $CONFIG"
-  eindent
-    einfo "Trying to extract configuration file ${CONFIG}:"
-    cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
-  eoutdent
+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
 fi
+}
 
 
-if checkbootparam myconfig ; then
- MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
- if [ -n "$MOUNTDEVICE" ]; then
-   if checkbootparam file ; then
-    FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
-    [ -n "$FILENAME" ] || FILENAME='config.tbz'
-   fi
-   [ -d /mnt/grml ] || mkdir /mnt/grml
-   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
-   mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
-    if [[ $RC == 0 ]]; then
-      einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
-      eindent
-      CONFIG=''
-      CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
-      if [ -n "$CONFIG" ]; then
-        einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
-        cd /
-        unp $CONFIG $EXTRACTOPTIONS ; eend $?
-      else
-        ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
-      fi
 
 
-      SCRIPT=''
-      SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
-      if [ -n "$SCRIPT" ]; then
-        einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
-        $SCRIPT ; eend $?
-      fi
-      eoutdent
-    else
-      einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
-    fi # mount $MOUNTDEVICE
-   grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
- else
-   einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
- fi # [ -n "$MOUNTDEVICE" ]
-fi # checkbootparam myconfig
-
-if checkbootparam "partconf" ; then
+config_partconf() {
+if checkbootparam 'partconf' ; then
  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
    [ -d /mnt/grml ] || mkdir /mnt/grml
  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
    [ -d /mnt/grml ] || mkdir /mnt/grml
@@ -1990,26 +2112,79 @@ fi
 
 # {{{ /cdrom/.*-options
 config_debs(){
 
 # {{{ /cdrom/.*-options
 config_debs(){
-if checkbootparam "debs" ; then
+if checkbootparam 'debs' ; then
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   if ! echo $DEBS | grep -q '/'; then
+     # backwards compatibility: if no path is given get debs from debs/
+     DEBS="debs/$DEBS"
+   fi
    einfo "Tring to install debian package(s) ${DEBS}"
    einfo "Tring to install debian package(s) ${DEBS}"
-   dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
+   DEBS="$(eval echo ${DCSDIR}/$DEBS)"
+   dpkg -i $DEBS ; eend $?
 fi
 }
 
 config_scripts(){
 fi
 }
 
 config_scripts(){
-if checkbootparam "scripts" ; then
+if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
-   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
-   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
-   sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
+   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
+   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(){
+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)"
+  fi
+  if [ -n "$CONFIG" ]; then
+    if [ -d "${DCSDIR}/${CONFIG}" ] ; then
+      einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
+
+      cp -a ${DCSDIR}/${CONFIG}/* /
+    elif [ -f "${DCSDIR}/${CONFIG}" ]; then
+      einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
+
+      cd /
+      unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
+    else
+      ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
+    fi
+  fi
 fi
 fi
+# umount $DCSMP if it was mounted by finddcsdir
+# this doesn't really belong here
+grep -q '$DCSMP' /proc/mounts && umount $DCSMP
 }
 # }}}
 
 # {{{ mypath
 config_mypath(){
 }
 # }}}
 
 # {{{ mypath
 config_mypath(){
-if checkbootparam "mypath" ; then
+if checkbootparam 'mypath' ; then
    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
    touch /etc/grml/my_path
    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
    touch /etc/grml/my_path
@@ -2030,8 +2205,8 @@ fi
 
 # {{{ distcc
 config_distcc(){
 
 # {{{ distcc
 config_distcc(){
-if checkbootparam "distcc" ; then
- OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
+if checkbootparam 'distcc' ; then
+ OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
  if [ -n "$OPTIONS" ]; then
     NET=""
     INTERFACE=""
  if [ -n "$OPTIONS" ]; then
     NET=""
     INTERFACE=""
@@ -2080,8 +2255,8 @@ if checkbootparam "distcc" ; then
  fi
 fi
 
  fi
 fi
 
-if checkbootparam "gcc"; then
- GCC="$(getbootparam gcc 2>>$DEBUG)"
+if checkbootparam 'gcc'; then
+ GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
  eindent
  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
  eoutdent
  eindent
  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
  eoutdent
@@ -2089,8 +2264,8 @@ if checkbootparam "gcc"; then
  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
 fi
 
  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
 fi
 
-if checkbootparam "gpp"; then
- GPP="$(getbootparam gpp 2>>$DEBUG)"
+if checkbootparam 'gpp'; then
+ GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
  eindent
   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
   if [ -x /usr/bin/g++-${GPP} ] ; then
  eindent
   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
   if [ -x /usr/bin/g++-${GPP} ] ; then
@@ -2114,7 +2289,7 @@ fi
 # in /etc/runlevel.conf
 config_modules(){
 MODULES_FILE=/etc/grml/modules
 # in /etc/runlevel.conf
 config_modules(){
 MODULES_FILE=/etc/grml/modules
-if checkbootparam nomodules ; then
+if checkbootparam 'nomodules' ; then
   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
 elif [ -z "$INSTALLED" ]; then
  if [ -r $MODULES_FILE ] ; then
   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
 elif [ -z "$INSTALLED" ]; then
  if [ -r $MODULES_FILE ] ; then
@@ -2136,8 +2311,8 @@ fi
 
 # {{{ 915resolution
 config_915resolution(){
 
 # {{{ 915resolution
 config_915resolution(){
-if checkbootparam "915resolution" ; then
- OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
+if checkbootparam '915resolution' ; then
+ OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)"
   if [ -x /usr/sbin/915resolution ]; then
     CMD=915resolution
     MODE=""
   if [ -x /usr/sbin/915resolution ]; then
     CMD=915resolution
     MODE=""
@@ -2168,9 +2343,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
@@ -2231,14 +2407,79 @@ 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 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
@@ -2259,13 +2500,12 @@ 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(){
 }
 # }}}
 
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
-if checkbootparam "debnet" ; then
+if checkbootparam 'debnet' ; then
  iszsh && setopt shwordsplit
  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
  DEVICES="$DEVICES $(ls /dev/mapper/*)"
  iszsh && setopt shwordsplit
  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
  DEVICES="$DEVICES $(ls /dev/mapper/*)"
@@ -2297,7 +2537,7 @@ if checkbootparam "debnet" ; then
        mkdir /etc/network/run
        umount /mnt ; eend $?
      einfo "Starting network."
        mkdir /etc/network/run
        umount /mnt ; eend $?
      einfo "Starting network."
-       /etc/init.d/networking start ; eend $?
+       invoke-rc.d networking start ; eend $?
    else
      eerror "/etc/network/interfaces not found." ; eend 1
    fi
    else
      eerror "/etc/network/interfaces not found." ; eend 1
    fi
@@ -2324,31 +2564,72 @@ config_ipw3945() {
 
 # {{{ disable console blanking
 config_blanking(){
 
 # {{{ disable console blanking
 config_blanking(){
-if checkbootparam "noblank" ; then
+if checkbootparam 'noblank' ; then
   einfo "Bootoption noblank found. Disabling monitor blanking."
   setterm -blank 0 ; eend $?
 fi
 }
 # }}}
 
   einfo "Bootoption noblank found. Disabling monitor blanking."
   setterm -blank 0 ; eend $?
 fi
 }
 # }}}
 
+# {{{ tohd= bootoption
+config_tohd()
+{
+  if checkbootparam 'tohd' ; then
+     local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
+     if [ -z "$TARGET" ] ; then
+        eerror "Error: tohd specified without any partition, can not continue." ; eend 1
+        eerror "Please use something like tohd=/dev/sda9." ; eend 1
+        return 1
+     fi
+
+     if ! [ -b "$TARGET" ] ; then
+        eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
+        return 1
+     fi
+
+     if grep -q $TARGET /proc/mounts ; then
+        eerror "$TARGET already mounted, skipping execution of tohd therefore."
+        eend 1
+        return 1
+     fi
+
+     local MOUNTDIR=$(mktemp -d)
+
+     if mount -o rw "$TARGET" "$MOUNTDIR" ; then
+        einfo "Copyring live system to $TARGET - this might take a while"
+        rsync -a --progress /live/image/live $MOUNTDIR
+        sync
+        umount "$MOUNTDIR"
+        eend $?
+        einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
+     else
+        eerror "Error when trying to mount $TARGET, sorry."; eend 1
+        return 1
+     fi
+
+     rmdir "$MOUNTDIR"
+  fi
+}
+# }}}
+
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
-if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
+if checkbootparam "BOOT_IMAGE=grml2hd" ; then
 
 
-if checkbootparam "user" ; then
+if checkbootparam 'user' ; then
    NEWUSER=''
    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
    NEWUSER=''
    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
-if checkbootparam "filesystem" ; then
+if checkbootparam 'filesystem' ; then
    FILESYSTEM=''
    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
    FILESYSTEM=''
    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
-if checkbootparam "partition" ; then
+if checkbootparam 'partition' ; then
    PARTITION=''
    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
    # notice: the following checks whether the given partition is available, if not the skip
    PARTITION=''
    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
    # notice: the following checks whether the given partition is available, if not the skip
@@ -2360,7 +2641,7 @@ if checkbootparam "partition" ; then
    fi
 fi
 
    fi
 fi
 
-if checkbootparam "mbr" ; then
+if checkbootparam 'mbr' ; then
    BOOT_PARTITION=''
    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
    BOOT_PARTITION=''
    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
@@ -2379,14 +2660,14 @@ else
    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
 fi
 
    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
 fi
 
-fi # if stringinstring "BOOT_IMAGE=grml2hd ...
+fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
 }
 # }}}
 
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
 }
 # }}}
 
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
-if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
+if checkbootparam "BOOT_IMAGE=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
 
@@ -2397,7 +2678,7 @@ if ! [ -x /usr/sbin/grml-debootstrap ] ; then
    exit 1
 fi
 
    exit 1
 fi
 
-if checkbootparam "target" ; then
+if checkbootparam 'target' ; then
   TARGET=''
   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
   # notice: the following checks whether the given partition is available, if not the skip
   TARGET=''
   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
   # notice: the following checks whether the given partition is available, if not the skip
@@ -2412,32 +2693,32 @@ else
   exit 1
 fi
 
   exit 1
 fi
 
-if checkbootparam "grub" ; then
+if checkbootparam 'grub' ; then
   GRUB=''
   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
 fi
 
   GRUB=''
   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
 fi
 
-if checkbootparam "groot" ; then
+if checkbootparam 'groot' ; then
   GROOT=''
   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
 fi
 
   GROOT=''
   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
 fi
 
-if checkbootparam "release" ; then
+if checkbootparam 'release' ; then
   RELEASE=''
   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
 fi
 
   RELEASE=''
   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
 fi
 
-if checkbootparam "mirror" ; then
+if checkbootparam 'mirror' ; then
   MIRROR=''
   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
 fi
 
   MIRROR=''
   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
 fi
 
-if checkbootparam "boot_append" ; then
+if checkbootparam 'boot_append' ; then
   BOOT_APPEND=''
   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
 fi
 
   BOOT_APPEND=''
   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
 fi
 
-if checkbootparam "password" ; then
+if checkbootparam 'password' ; then
   PASSWORD=''
   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
 fi
   PASSWORD=''
   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
 fi
@@ -2471,13 +2752,13 @@ screen /usr/bin/grml-debootstrap_noninteractive
 einfo "Invoking a shell, just exit to continue booting..."
 /bin/zsh
 
 einfo "Invoking a shell, just exit to continue booting..."
 /bin/zsh
 
-fi # stringinstring "BOOT_IMAGE=debian2hd
+fi # checkbootparam "BOOT_IMAGE=debian2hd
 }
 # }}}
 
 # {{{ Support customization
 config_distri(){
 }
 # }}}
 
 # {{{ Support customization
 config_distri(){
-if checkbootparam "distri"; then
+if checkbootparam 'distri'; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0