Check for space after bootoption 'fast'
[grml-autoconfig.git] / autoconfig.functions
index 45604c9..58eed90 100755 (executable)
@@ -4,7 +4,6 @@
 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Fre Nov 16 08:45:53 CET 2007 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -13,6 +12,11 @@ DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 umask 022
 
 KERNEL="$(uname -r)"
 umask 022
 
+# old linuxrc version:
+[ -d /cdrom ]      && export LIVECD_PATH=/cdrom
+# new initramfs layout:
+[ -d /live/image ] && export LIVECD_PATH=/live/image
+
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
@@ -45,7 +49,7 @@ stringinstring(){
 # Reread boot command line; echo last parameter's argument or return false.
 getbootparam(){
   stringinstring " $1=" "$CMDLINE" || return 1
 # Reread boot command line; echo last parameter's argument or return false.
 getbootparam(){
   stringinstring " $1=" "$CMDLINE" || return 1
-  result="${CMDLINE##*$1=}"
+  result="${CMDLINE##* $1=}"
   result="${result%%[  ]*}"
   echo "$result"
   return 0
   result="${result%%[  ]*}"
   echo "$result"
   return 0
@@ -72,6 +76,11 @@ checkgrmlsmall(){
 checkgrmlusb(){
   grep -q usb /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 "$*"
+}
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -91,7 +100,7 @@ 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)"
 # {{{ 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 /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
+[ -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 from the grml-CD or HD
@@ -116,26 +125,29 @@ fi
 
 # {{{ debug
 config_debug(){
 
 # {{{ debug
 config_debug(){
- if checkbootparam "debug"; then
-   BOOTDEBUG="yes"
- fi
- if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
-   BOOTDEBUG="yes"
- fi
+ checkbootparam "debug"                        && BOOTDEBUG="yes"
+ stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && BOOTDEBUG="yes"
+
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
-    einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
-    eindent
-    if [ -r /etc/grml/screenrc ] ; then
-       einfo "Starting GNU screen to be able to use a full featured shell environment."
-       einfo "Just exit the shells (and therefore screen) to continue boot process..."
-       /bin/zsh -c "screen -c /etc/grml/screenrc"
-    else
-      einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
-      einfo "Just exit the shell to continue boot process..."
-      /bin/zsh
-    fi
-    eoutdent
+     einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
+     if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
+        einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
+        einfo "Just exit the shell to continue boot process..."
+        /bin/zsh
+     else
+        eindent
+        if [ -r /etc/grml/screenrc ] ; then
+           einfo "Starting GNU screen to be able to use a full featured shell environment."
+           einfo "Just exit the shells (and therefore screen) to continue boot process..."
+           /bin/zsh -c "screen -c /etc/grml/screenrc"
+        else
+           einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
+           einfo "Just exit the shell to continue boot process..."
+           /bin/zsh
+        fi
+        eoutdent
+     fi
   fi
  }
 }
   fi
  }
 }
@@ -143,16 +155,16 @@ config_debug(){
 
 # {{{ log
 config_log(){
 
 # {{{ log
 config_log(){
-if checkbootparam "log"; then
-  export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
-  touch $DEBUG
-  einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
-  eindent
-    einfo "Starting bootlogd."
-    bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
-  eoutdent
+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"
+   eindent
+     einfo "Starting bootlogd." # known to be *very* unreliable :(
+     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
+   eoutdent
 else
 else
-  DEBUG="/dev/null"
+   DEBUG="/dev/null"
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -192,12 +204,16 @@ config_language(){
 
  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
  if [ -z "$INSTALLED" ] ; then
 
  # 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='us'
  fi
 
  # if bootoption lang is used update /etc/default/locale, otherwise *not*!
  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 [ -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
  fi
 
  # set console font
  fi
 
  # set console font
@@ -344,26 +360,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
 }
 # }}}
@@ -395,12 +421,17 @@ if checkbootparam novmware ; then
 else
    if [ -z "$INSTALLED" ] ; then
       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
 else
    if [ -z "$INSTALLED" ] ; then
       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
-              if ! checkbootparam qemu ; 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
             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
       fi
    fi
 fi
@@ -441,10 +472,21 @@ config_timezone(){
  if [ -z "$INSTALLED" ]; then
     KTZ="$(getbootparam tz 2>>$DEBUG)"
     if [ -n "$KTZ" ] ; then
  if [ -z "$INSTALLED" ]; then
     KTZ="$(getbootparam tz 2>>$DEBUG)"
     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
 }
@@ -499,8 +541,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
@@ -589,13 +631,8 @@ if [ -n "$TESTCD" ]; then
    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
    echo -n "${RED}"
 
    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
    echo -n "${RED}"
 
-   # /linuxrc grml version:
-   [ -d /cdrom/GRML ]      && TESTCD_PATH=/cdrom/GRML
-   # live-initramfs version:
-   [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
-
-   if [ -n "$TESTCD_PATH" ] ; then
-      ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
+   if [ -n "${LIVECD_PATH}"/GRML ] ; then
+      ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
    else
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
    fi
    else
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
    fi
@@ -702,19 +739,22 @@ 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
   if [ -n "$BLACK" ] ; then
-    einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
-    echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
-    echo "blacklist $BLACK"     >> /etc/modprobe.d/grml
-    echo "alias     $BLACK off" >> /etc/modprobe.d/grml
-    echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
+    for module in $(echo ${BLACK//,/ }) ; do
+        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."
   fi
  else
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
   fi
  else
-  ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
+  ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
   eindent
   eindent
-   einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
+   einfo "Please blacklist the module(s) manually using the 'blacklist' script."
   eoutdent
  fi
 fi
   eoutdent
  fi
 fi
@@ -809,27 +849,92 @@ fi
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
-if checkbootparam swspeak ; then
- if [ -d /proc/speakup/ ] ; then
-  einfo "Bootoption swspeak found. 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 $?
-     einfo "Activating sftsyn in Kernel."
-     echo sftsyn >/proc/speakup/synth_name ; eend $?
-     einfo "Just run swspeak if you want to use software synthesizer via speakup."
-     flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
-   else
-    eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
-    flite -o play -t "speech-dispatcher not available. speakup will not work without it."
+   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
    fi
-  eoutdent
- else
-  eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
-  flite -o play -t "Kernel does not seem to support speakup. Sorry."
- fi
-fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1232,10 +1337,12 @@ if checkbootparam "nocpu"; then
 else
   # check module dependencies
   cpufreq_check() {
 else
   # check module dependencies
   cpufreq_check() {
-   if [ -e /lib64 ] ; then
-      [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
-   else
-      [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+   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
+      else
+         [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+      fi
    fi
   }
 
    fi
   }
 
@@ -1329,20 +1436,51 @@ fi # checkbootparam nocpu
 # {{{ autostart of ssh
 config_ssh(){
 if checkbootparam ssh ; then
 # {{{ autostart of ssh
 config_ssh(){
 if checkbootparam ssh ; then
-  SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
-  einfo "Bootoption passwd found."
-  if [ -n "$SSH_PASSWD" ] ; then
-    echo "grml:$SSH_PASSWD" | chpasswd -m
-    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 &
-    eend 0
-  else
-    eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
-  fi
-  eindent
-    ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
-  eoutdent
+   SSH_PASSWD=''
+   SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
+   einfo "Bootoption ssh found, trying to set password for user grml."
+   eindent
+   if [ -z "$SSH_PASSWD" ] ; then
+      if [ -x /usr/bin/apg ] ; then
+         SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
+      elif [ -x /usr/bin/gpw ] ; then
+         SSH_PASSWD="$(gpw 1)"
+      elif [ -x /usr/bin/pwgen ] ; then
+         SSH_PASSWD="$(pwgen -1 8)"
+      elif [ -x /usr/bin/hexdump ] ; then
+         SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
+      elif [ -n "$RANDOM" ] ; then
+         SSH_PASSWD="grml${RANDOM}"
+      else
+         SSH_PASSWD=''
+         eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
+         eend 1
+      fi
+
+      if [ -n "$SSH_PASSWD" ] ; then
+         ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
+      fi
+   fi
+   eoutdent
+
+   # finally check if we have a password we can use:
+   if [ -n "$SSH_PASSWD" ] ; then
+      # 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.'
+   /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
+   eend $?
+
+   eindent
+   ewarn 'Warning: please change the password for user grml as soon as possible!'
+   eoutdent
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -1451,10 +1589,10 @@ fi # checkbootparam home
 # {{{ Check for scripts on CD-ROM
 config_cdrom_scripts(){
 if checkbootparam "script"; then
 # {{{ Check for scripts on CD-ROM
 config_cdrom_scripts(){
 if checkbootparam "script"; then
-  for script in /cdrom/scripts/* ; do
-    einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
-    . $script
-  done
+   for script in "${LIVECD_PATH}"/scripts/* ; do
+       einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
+       . $script
+   done
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -1604,11 +1742,22 @@ config_wondershaper(){
 # {{{ syslog-ng
 config_syslog(){
  if checkbootparam "nosyslog"; then
 # {{{ syslog-ng
 config_syslog(){
  if checkbootparam "nosyslog"; then
-  ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
+    ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
  else
-  einfo "Starting syslog-ng in background."
-  /etc/init.d/syslog-ng start 1>>$DEBUG &
-  eend 0
+    SYSLOGD=''
+    [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
+    [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
+    [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
+    [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
+    [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
+
+    if [ -z "$SYSLOGD" ] ; then
+       eerror "No syslog daemon found." ; eend 1
+    else
+       einfo "Starting $SYSLOGD in background."
+       /etc/init.d/$SYSLOGD start 1>>$DEBUG &
+       eend 0
+    fi
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1618,10 +1767,14 @@ config_gpm(){
  if checkbootparam "nogpm"; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
  if checkbootparam "nogpm"; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  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 ) &
-  eend 0
+   if ! [ -r /dev/input/mice ] ; then
+      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 ) &
+      eend 0
+   fi
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1674,7 +1827,7 @@ config_netconfig(){
 config_blindsound(){
  if checkbootparam "blind" ; then
     beep
 config_blindsound(){
  if checkbootparam "blind" ; then
     beep
-    flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1682,7 +1835,7 @@ config_blindsound(){
 # {{{ welcome sound
 config_welcome(){
  if checkbootparam welcome ; then
 # {{{ welcome sound
 config_welcome(){
  if checkbootparam welcome ; then
-  flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1758,50 +1911,73 @@ if checkbootparam extract ; then
 fi
 }
 
 fi
 }
 
+config_unpack(){
+MOUNTDEVICE="$1"
+MESSAGE="$2"
+
+if [ ! -b "$MOUNTDEVICE" ] ; then
+   return;
+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 $MESSAGE 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 checkbootparam config ; then
+      FILENAME="$(getbootparam 'config' 2>>$DEBUG)"
+      if [ -e /mnt/grml/"${FILENAME}" ] ; then
+         einfo "Using /mnt/grml/$FILENAME instead of config.tbz"
+         CONFIG="/mnt/grml/${FILENAME}"
+      fi
+   else
+      [ -n "$CONFIG" ] && FILENAME="$(basename $CONFIG)" || FILENAME="config.tbz"
+   fi
+
+   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 ${FILENAME} on device ${MOUNTDEVICE} ${MESSAGE}." ; 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
+
+}
+
 config_automount(){
 if checkbootparam noautoconfig || checkbootparam forensic ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
 config_automount(){
 if checkbootparam noautoconfig || checkbootparam forensic ; then
   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." ; 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. (Disable this via boot option: noautoconfig)"
-#     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
+     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
      fi
+     DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
+     config_unpack "$DEVICE" "labeled GRMCFG"
   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
-    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
-    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
-  else
-    ewarn "No devices with label GRMLCFG found." ; eend 0
-  fi
-  eoutdent
- fi
 fi
 }
 
 fi
 }
 
@@ -1813,44 +1989,14 @@ if checkbootparam "config" ; then
   einfo "Bootoption config found. config is set to: $CONFIG"
   eindent
     einfo "Trying to extract configuration file ${CONFIG}:"
   einfo "Bootoption config found. config is set to: $CONFIG"
   eindent
     einfo "Trying to extract configuration file ${CONFIG}:"
-    cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
+    cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
   eoutdent
 fi
 
 if checkbootparam myconfig ; then
  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
   eoutdent
 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
+     config_unpack "$MOUNTDEVICE"
  else
    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
  fi # [ -n "$MOUNTDEVICE" ]
  else
    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
  fi # [ -n "$MOUNTDEVICE" ]
@@ -1882,18 +2028,39 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam "debs" ; then
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam "debs" ; then
-  DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
-  einfo "Tring to install debian package(s) ${DEBS}"
-  dpkg -i /cdrom/debs/$DEBS* ; eend $?
+   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   einfo "Tring to install debian package(s) ${DEBS}"
+   dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
 fi
 }
 
 config_scripts(){
 if checkbootparam "scripts" ; then
 fi
 }
 
 config_scripts(){
 if checkbootparam "scripts" ; then
-  SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
-  [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
-  einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
-  sh -c /cdrom/scripts/$SCRIPTS ; eend $?
+   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 $?
+fi
+}
+# }}}
+
+# {{{ mypath
+config_mypath(){
+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
+   chmod 644 /etc/grml/my_path
+   # make sure the directories exist:
+   eindent
+   for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
+       if ! [ -d "$i" ] ; then
+          einfo "Creating directory $i"
+          mkdir -p "$i" ; eend $?
+       fi
+   done
+   grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
+   eoutdent
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -2201,6 +2368,47 @@ 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(){
 
@@ -2349,11 +2557,11 @@ fi # stringinstring "BOOT_IMAGE=debian2hd
 config_distri(){
 if checkbootparam "distri"; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
 config_distri(){
 if checkbootparam "distri"; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
-  if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
-     [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
+  if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
+     [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
      # make sure the desktop.jpg file is not a symlink, so copying does not file then
      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
      # make sure the desktop.jpg file is not a symlink, so copying does not file then
      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
-     cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
+     cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
   fi
 fi
 }
   fi
 fi
 }