Release new version 0.9.14.
[grml-autoconfig.git] / autoconfig.functions
index 3cc12ee..7f8bc9d 100755 (executable)
@@ -176,7 +176,7 @@ if checkbootparam 'log' || checkbootparam 'debug' ; then
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    eindent
      einfo "Starting bootlogd." # known to be *very* unreliable :(
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    eindent
      einfo "Starting bootlogd." # known to be *very* unreliable :(
-     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
+     bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
    eoutdent
 else
    DEBUG="/dev/null"
    eoutdent
 else
    DEBUG="/dev/null"
@@ -189,7 +189,7 @@ config_fwtimeout(){
  if checkbootparam 'fwtimeout' ; then
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
  if checkbootparam 'fwtimeout' ; then
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
-   rmmod firmware_class 1>>$DEBUG 2>&1
+   rmmod firmware_class >>$DEBUG 2>&1
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
@@ -208,16 +208,14 @@ config_language(){
  einfo "Activating language settings:"
  eindent
 
  einfo "Activating language settings:"
  eindent
 
- # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
+ # people can specify $LANGUAGE and $CONSOLEFONT in a config file
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
- grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
-
- # check for bootoption which overrides config from /etc/grml/autoconfig:
+ # check for bootoption which overrides config from /etc/grml/autoconfig
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
- # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
+ # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
  if [ -z "$INSTALLED" ] ; then
     [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
  if [ -z "$INSTALLED" ] ; then
     [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
@@ -235,8 +233,6 @@ config_language(){
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
-       # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
-       # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
@@ -306,7 +302,7 @@ config_language(){
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
-       unicode_start 2>>$DEBUG ; eend $?
+       unicode_start >>$DEBUG 2>&1 ; eend $?
     fi
  fi
 
     fi
  fi
 
@@ -318,17 +314,21 @@ config_language(){
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
- NUM_CONSOLES=$(fgconsole --next-available)
- NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
- [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
- CUR_CONSOLE=$(fgconsole)
-
+ NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
+ if [ -n "$NUM_CONSOLES" ] ; then
+    NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
+    [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ fi
+ CUR_CONSOLE=$(fgconsole 2>/dev/null)
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
-    for vc in `seq 0 ${NUM_CONSOLES}`  ; do
+    RC=0
+    for vc in $(seq 0 ${NUM_CONSOLES}) ; do
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
-    [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+    if [ -n "$CUR_CONSOLE" ] ; then
+       [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+    fi
     eend $RC
  fi
 
     eend $RC
  fi
 
@@ -337,11 +337,14 @@ config_language(){
  else
     if [ -n "$CONSOLEFONT" ] ; then
        einfo "Running consolechars using ${CONSOLEFONT}"
  else
     if [ -n "$CONSOLEFONT" ] ; then
        einfo "Running consolechars using ${CONSOLEFONT}"
-       for vc in `seq 0 ${NUM_CONSOLES}`  ; do
+       RC=0
+       for vc in $(seq 0 ${NUM_CONSOLES}) ; do
            consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
        done
            consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
        done
-       [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
-       eend $?
+       if [ -n "$CUR_CONSOLE" ] ; then
+          [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+       fi
+       eend $RC
     fi
  fi
 
     fi
  fi
 
@@ -353,6 +356,11 @@ config_language(){
 config_hostname(){
  if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
 config_hostname(){
  if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
+  if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
+     einfo "Generating random hostname as no hostname was specified."
+     HOSTNAME="$(/usr/bin/random-hostname)"
+     eend $?
+  fi
   einfo "Setting hostname to $HOSTNAME as requested."
   grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
   [ "$RC" = "0" ] && hostname $HOSTNAME
   einfo "Setting hostname to $HOSTNAME as requested."
   grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
   [ "$RC" = "0" ] && hostname $HOSTNAME
@@ -572,21 +580,59 @@ fi
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
-  einfo "Bootoption (for serial) console detected."
-  eindent
-    if [ -r /etc/mgetty/mgetty.config ] ; then
-       MODE=$(getbootparam 'console' | awk -F, '{print $2}')
-       MODE=${MODE%%n*}
-       [ -n "$MODE" ] || MODE=9600 # default mode
-       einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
-       sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
-    fi
+  local line
+  local ws
+  ws='  '
 
 
-    einfo "Activating mgetty."
-    sed -i 's/^#T0/T0/' /etc/inittab
-    sed -i 's/^#T1/T1/' /etc/inittab
-    /sbin/telinit q ; eend $?
-  eoutdent
+  einfo "Bootoption for serial console detected:"
+
+  line="$CMDLINE x "
+  this=""
+  line="${line#*[$ws]}"
+  local telinitq=""
+  while [ -n "$line" ]; do
+    case "$this" in
+      console=*)
+        local serial="$this"
+        local device="${this%%,*}"
+        local device="${device##*=}"
+        if ! echo $serial | grep -q ttyS ; then
+          ewarn "Warning: console=ttyS... not specified as last console= option. Falling back to set up ttyS0/9600."
+          sed -i "/^#grmlserial#/iT0:23:respawn:/bin/bash -c \"/sbin/getty -L /dev/ttyS0 -l /usr/bin/zsh-login 9600 vt100 || sleep 30\"" /etc/inittab
+          eend 0
+        else
+          local option="${serial##*,}"
+          # default (works for kvm & CO):
+          local speed="115200,57600,38400,19200,9600,4800,2400,1200";
+          # ... unless overriden by command line:
+          case "$option" in
+            115200*) speed=115200 ;;
+             57600*) speed=57600 ;;
+             38400*) speed=38400 ;;
+             19200*) speed=19200 ;;
+              9600*) speed=9600 ;;
+              4800*) speed=4800 ;;
+              2400*) speed=2400 ;;
+              1200*) speed=1200 ;;
+          esac
+        fi
+        eindent
+          einfo "Activating console login on device ${device} with speed ${speed}."
+          local number="${device#ttyS}"
+          sed -i "/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/bin/zsh-login $speed vt100 || sleep 30\"" /etc/inittab
+          eend $?
+          telinitq="1"
+        eoutdent
+        ;;
+    esac
+    this="${line%%[$ws]*}"
+    line="${line#*[$ws]}"
+  done
+
+  if [ -n "$telinitq" ]; then
+    /sbin/telinit q
+  fi
+  eend $?
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -683,7 +729,7 @@ else
    eindent
    einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
    eoutdent
    eindent
    einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
    eoutdent
-  /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
+  /sbin/discover-modprobe -v >>$DEBUG 2>&1 &
   eend 0
  else
   eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
   eend 0
  else
   eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
@@ -740,11 +786,11 @@ if checkbootparam 'nohotplug' ; then
 else
   if [ -r /etc/init.d/hotplug ] ; then
     einfo "Starting hotplug system in background."
 else
   if [ -r /etc/init.d/hotplug ] ; then
     einfo "Starting hotplug system in background."
-    /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
+    /etc/init.d/hotplug start >>$DEBUG 2>>$DEBUG &
     eend 0
   elif [ -r /etc/init.d/hotplug-light ] ; then
     einfo "Starting hotplug-light system in background."
     eend 0
   elif [ -r /etc/init.d/hotplug-light ] ; then
     einfo "Starting hotplug-light system in background."
-    /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
+    /etc/init.d/hotplug-light start >>$DEBUG 2>>$DEBUG &
     eend 0
   else
     ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
     eend 0
   else
     ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
@@ -809,7 +855,7 @@ if [ -d /proc/acpi ]; then
     if ! ps x | grep -q /usr/sbin/acpid ; then
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
     if ! ps x | grep -q /usr/sbin/acpid ; then
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
-        /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
+        /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
@@ -1086,7 +1132,7 @@ done <<EOT
 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
 EOT
 }
 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
 EOT
 }
-check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
+check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
@@ -1297,59 +1343,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ helper functions
-findfile(){
-FOUND=""
-# search all partitions for a file in the root directory
-for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
-# See if it's already mounted
-  [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
-  if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
-    [ -f "$i/$1" ] && FOUND="$i/$1"
-    umount -l "$i" 2>>$DEBUG
-    [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
-  fi
-done
-return 2
-}
-
-fstype(){
-case "$(file -s $1)" in
-  *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
-  *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
-  *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
-  *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
-  *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
-  *data*)          echo "invalid"; return 0;;
-  *) echo "auto"; return 0;;
-esac
-}
-
-# Try to mount this filesystem read-only, without or with encryption
-trymount(){
-# Check if already mounted
-case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
-# Apparently, mount-aes DOES autodetect AES loopback files.
-[ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# We need to mount crypto-loop files with initial rw support
-[ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# Mount succeeded?
-[ "$RC" = "0" ] && return 0
-echo ""
-einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
-a="y"
-while [ "$a" != "n" -a "$a" != "N" ]; do
-# We need to mount crypto-loop files with initial rw support
- mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
- echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
- # Problem with ioctl() from getpasswd()?
- # read a
- read a
-done
-return 1
-}
-# }}}
-
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
@@ -1421,21 +1414,23 @@ else
         . /usr/bin/cpufreq-detect.sh
         if [ -n "$MODULE" -a "$MODULE" != none ]; then
            einfo "Loading modules ${MODULE}"
         . /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
+           modprobe "$MODULE" >>$DEBUG || modprobe "$MODULE_FALLBACK" >>$DEBUG
            RC=$?
            RC=$?
-           if [[ $RC == 0 ]]; then
+           if [[ "$RC" == 0 ]]; then
               eend 0
            else
               SKIP_CPU_GOVERNOR=1
               eend 0
            else
               SKIP_CPU_GOVERNOR=1
-              eend $1
+              eend $RC
            fi
         else
            fi
         else
-           ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
+           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"
         fi # $MODULE
      fi # loadcpufreq
 
      if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
         einfo "Loading cpufreq_ondemand, setting ondemand governor"
+        RC=0
         if modprobe cpufreq_ondemand ; RC=$? ; then
            for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
                echo ondemand > $file
         if modprobe cpufreq_ondemand ; RC=$? ; then
            for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
                echo ondemand > $file
@@ -1492,8 +1487,8 @@ if checkbootparam 'ssh' ; then
    fi
 
    einfo 'Starting secure shell server in background.'
    fi
 
    einfo 'Starting secure shell server in background.'
-   /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
-   /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
+   /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
    eend $?
 
    eindent
    eend $?
 
    eindent
@@ -1573,84 +1568,8 @@ fi
 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
 config_homedir(){
 if checkbootparam 'home' ; then
 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
 config_homedir(){
 if checkbootparam 'home' ; then
-   HOMEDIR="$(getbootparam 'home')"
-   MYHOMEDEVICE=""
-   MYHOMEMOUNTPOINT=""
-   MYHOMEDIR=""
-   if [ -n "$HOMEDIR" ]; then
-      einfo "Bootoption home detected." && eend 0
-      case "$HOMEDIR" in
-        /dev/*)
-        MYHOMEDEVICE="${HOMEDIR##/dev/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
-      ;;
-        /mnt/*)
-        MYHOMEDEVICE="${HOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="$HOMEDIR"
-      ;;
-        [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
-        MYHOMEDIR="$(findfile grml.img)"
-        MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-      ;;
-      *)
-        eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
-        eerror "Option ignored." ; eend 1
-      ;;
-      esac
-   fi # -n $HOMEDIR
-
-   if [ -n "$MYHOMEDIR" ]; then
-      if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
-         [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
-         while read device mountpoint fs relax; do
-           case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-             case "$fs" in
-               *[Nn][Tt][Ff][Ss]*)
-                 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
-                 break
-                 ;;
-               *[Ff][Aa][Tt]*)
-                 # Note: This currently won't work with encrypted partitions
-                 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
-                 if [ ! -f "$MYHOMEDIR" ]; then
-                    ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
-                    ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
-                 fi
-                 ;;
-             esac
-
-             if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
-                einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
-                if [ -f "$MYHOMEDIR" ]; then
-                   # It's a loopback file, mount it over the /home/grml directory
-                   trymount "$MYHOMEDIR" /home/grml
-                   RC="$?"
-                   [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
-                   RC="$?"
-                else
-                   # Do a --bind mount
-                   ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
-                   RC="$?"
-                fi # -f $MYHOMEDIR
-
-                [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
-
-             fi #  mount -o remount,rw,...
-           break
-           ;;
-           esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-         done <<EOT
-         $(cat /proc/mounts)
-EOT
-     fi # if trymount ...
-   fi # -n $MYHOMEDIR
-fi # checkbootparam home
+   ewarn "The \"home\" bootoption is deprecated, please use the persistency feature instead."; eend 1
+fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1730,7 +1649,7 @@ fix_ibm_sound() {
  VOL=${1}
 
  if [ -x /usr/bin/amixer ] ; then
  VOL=${1}
 
  if [ -x /usr/bin/amixer ] ; then
-    if amixer -q get Front 1>/dev/null 2>>$DEBUG ; then
+    if amixer -q get Front >/dev/null 2>>$DEBUG ; then
        amixer -q set Front unmute &>/dev/null
        amixer -q set Front ${VOL}% &>/dev/null
     fi
        amixer -q set Front unmute &>/dev/null
        amixer -q set Front ${VOL}% &>/dev/null
     fi
@@ -1829,7 +1748,7 @@ config_syslog(){
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
-       /etc/init.d/$SYSLOGD start 1>>$DEBUG &
+       /etc/init.d/$SYSLOGD start >>$DEBUG &
        eend 0
     fi
  fi
        eend 0
     fi
  fi
@@ -1845,8 +1764,8 @@ config_gpm(){
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
-      /etc/init.d/gpm start 1>>$DEBUG &
-      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
+      /etc/init.d/gpm start >>$DEBUG &
+      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
       eend 0
    fi
  fi
       eend 0
    fi
  fi
@@ -1861,7 +1780,7 @@ config_services(){
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     einfo "Starting service(s) ${SERVICENL} in background."
     for service in $(echo -e $SERVICELIST) ; do
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     einfo "Starting service(s) ${SERVICENL} in background."
     for service in $(echo -e $SERVICELIST) ; do
-       /etc/init.d/${service} start 1>>$DEBUG &
+       /etc/init.d/${service} start >>$DEBUG &
     done
     [ "$?" == "0" ] ; eend $?
  fi
     done
     [ "$?" == "0" ] ; eend $?
  fi
@@ -1918,7 +1837,7 @@ config_netscript() {
 
   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
     chmod +x ${SCRIPTFILE}
 
   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
     chmod +x ${SCRIPTFILE}
-    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && ${SCRIPTFILE} ; eend $?
+    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
   fi
 
  fi
   fi
 
  fi
@@ -1971,20 +1890,19 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
-   einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
+   einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
    config_userfstab || fstabuser='grml'
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
    config_userfstab || fstabuser='grml'
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
-# su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
-sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
+su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
-      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
+      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
    else # just append tty6 to inittab if no definition is present:
    else # just append tty6 to inittab if no definition is present:
-      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
+      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
    fi
 
    /sbin/telinit q ; eend $?
    fi
 
    /sbin/telinit q ; eend $?
@@ -2042,8 +1960,8 @@ else
       # 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."
       # We do need the following fix so floppy disk is available to blkid in any case :-/
       if [ -r /dev/fd0 ] ; then
         einfo "Floppy device detected. Trying to access floppy disk."
-        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
-           blkid /dev/fd0 1>>$DEBUG 2>&1
+        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
+           blkid /dev/fd0 >>$DEBUG 2>&1
         fi
       fi
       DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
         fi
       fi
       DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
@@ -2064,7 +1982,7 @@ else
         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
       else
         [ -d $DCSMP ] || mkdir $DCSMP
         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
+        umount $DCSMP >>$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
         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
         if [[ $RC == 0 ]]; then
           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
@@ -2113,6 +2031,7 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
+   iszsh && setopt localoptions shwordsplit
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    if ! echo $DEBS | grep -q '/'; then
      # backwards compatibility: if no path is given get debs from debs/
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    if ! echo $DEBS | grep -q '/'; then
      # backwards compatibility: if no path is given get debs from debs/
@@ -2248,7 +2167,7 @@ if checkbootparam 'distcc' ; then
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
-   /etc/init.d/distcc start 1>/dev/null ; eend $?
+   /etc/init.d/distcc start >/dev/null ; eend $?
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
@@ -2435,6 +2354,10 @@ config_dmraid(){
 
     for line in $(dmraid $1 ; echo errcode:$?); do
       case $line in
 
     for line in $(dmraid $1 ; echo errcode:$?); do
       case $line in
+        *'no block devices found'*)
+          einfo "No block devices found" ; eend 0
+          break
+          ;;
         *'no raid disks'*)
           einfo "No active dmraid devices found" ; eend 0
           break
         *'no raid disks'*)
           einfo "No active dmraid devices found" ; eend 0
           break
@@ -2487,7 +2410,7 @@ config_lvm(){
     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
-       if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
+       if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
@@ -2506,14 +2429,14 @@ config_lvm(){
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam 'debnet' ; then
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam 'debnet' ; then
- iszsh && setopt shwordsplit
+ iszsh && setopt localoptions shwordsplit
  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
  DEVICES="$DEVICES $(ls /dev/mapper/*)"
  FOUND_DEBNET=""
 
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
  eindent
  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
  DEVICES="$DEVICES $(ls /dev/mapper/*)"
  FOUND_DEBNET=""
 
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
  eindent
- if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
+ if ! mount | grep '/mnt ' >/dev/null 2>&1 ; then
     for i in $DEVICES; do
      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
          einfo "Scanning on $i"
     for i in $DEVICES; do
      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
          einfo "Scanning on $i"
@@ -2528,8 +2451,8 @@ if checkbootparam 'debnet' ; then
 
    if [ -n "$FOUND_DEBNET" ]; then
      einfo "Stopping network."
 
    if [ -n "$FOUND_DEBNET" ]; then
      einfo "Stopping network."
-       pump -k 1>/dev/null 2>&1
-       /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
+       pump -k >/dev/null 2>&1
+       /etc/init.d/networking stop >/dev/null 2>&1 ; eend $?
      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
        rm -rf /etc/network/run
        cp -a /mnt/etc/network /etc
      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
        rm -rf /etc/network/run
        cp -a /mnt/etc/network /etc