Get always the right boot parameter
[grml-autoconfig.git] / autoconfig.functions
index 921be17..7af51eb 100755 (executable)
@@ -49,7 +49,7 @@ stringinstring(){
 # 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
@@ -360,26 +360,29 @@ config_userfstab(){
 config_time(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-    UTC=""
+    # The default hardware clock timezone is stated as representing local time.
+    UTC="--localtime"
     checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
     checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
     # 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)
+    [ -z "$KTZ" ] && KTZ=Europe/Vienna
 
     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
+
+    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
+
  fi
 }
 # }}}
@@ -2319,6 +2322,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(){