config_lvm(): check for 'No volume groups found'
[grml-autoconfig.git] / autoconfig.functions
index e21481d..07c3344 100755 (executable)
@@ -4,7 +4,7 @@
 # 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: Son Apr 15 12:20:14 CEST 2007 [mika]
+# Latest change: Mit Jul 04 12:02:35 CEST 2007 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -1046,8 +1046,12 @@ if [ -z "$INSTALLED" ] ; then
                      if grep -q $p /proc/swaps ; then
                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
                      else
+                        if [ -b "$p" ] ; then
                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
                         swapon $p 2>>$DEBUG ; eend $?
+                        else
+                        ewarn "$p is not a valid block device - not using it therefore." ; eend 0
+                        fi
                      fi
                      ;;
              esac # dd-check
@@ -1065,17 +1069,19 @@ if [ -z "$INSTALLED" ] ; then
           *) continue ;;
           # *) NONEFOUND='1'; continue ;;
         esac
-   
+
         # use a swapfile
         if [ -z "$NOSWAP" ] ; then
-           mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG || continue
+           mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
            # Activate swapfile, if exists
            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
         fi
         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
            mount -o remount,rw $m && MOUNTED=1
            if swapon "$SWAPFILE" 2>>$DEBUG ; then
-              einfo "Using GRML swapfile ${SWAPFILE}."
+              eindent
+                einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
+              eoutdent
               fnew="$SWAPFILE swap swap defaults 0 0"
               stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
               GRML_SWP="$GRML_SWP $SWAPFILE"
@@ -1083,7 +1089,7 @@ if [ -z "$INSTALLED" ] ; then
            fi
            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
         fi
-   
+
         # use a image as home
         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
@@ -1098,10 +1104,10 @@ if [ -z "$INSTALLED" ] ; then
            fi
         fi
         eend 0
-   
+
         # Umount, if not in use
         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
-   
+
       done <<EOT
       $(cat /etc/fstab)
 EOT
@@ -1243,28 +1249,71 @@ else
      einfo "Detecting CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0
   fi
 
+  # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
+  # * it only if we have the according kernel modules available
+  # * cpufreq only on laptops (check via /usr/sbin/laptop-detect)
+  # * 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 ; then
+    if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
        einfo "Detected Laptop - trying to use cpu frequency scaling:"
-       if [ -r /usr/bin/cpufreq-detect.sh ] ; then
-          eindent
+       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} and cpufreq_ondemand, setting ondemand governor"
+             einfo "Loading modules ${MODULE}"
              modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
-             if modprobe cpufreq_ondemand && RC=0 || RC=1 ; then
-                for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
-                    echo ondemand > $file
-                done
+             RC=$?
+             if [[ $RC == 0 ]]; then
+                eend 0
+             else
+                SKIP_CPU_GOVERNOR=1
+                eend $1
              fi
-             eend $RC
           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
-          eoutdent
-       fi # cpufreq-detect
+          eend $RC
+       fi # cpu-governor
+
+       eoutdent
+
     fi # laptop-detect
   fi # cpufreq_check
 fi # checkbootparam nocpu
@@ -1657,11 +1706,9 @@ 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
-   elif grep -q '^# 6' /etc/inittab ; then # no tty6? assume customized grml-small:
-      sed -i 's#^6:.*#6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"#' /etc/inittab
-   else # just append tty6 to inittab if it isn't present at all
+   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
+   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
    fi
 
@@ -2040,6 +2087,33 @@ config_swraid(){
 }
 # }}}
 
+# {{{ 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
+  if checkbootparam 'nolvm' ; then
+     ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
+  else
+    if ! [ -x /sbin/lvm -a -x /etc/init.d/lvm2 -a -x /sbin/lvdisplay ] ; 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
+          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."
+          eend 0
+          if checkbootparam 'lvm' ; then
+             einfo "Bootoption LVM found. Searching for logical volumes:"
+             /etc/init.d/lvm2 start ; eend $?
+          fi
+          eoutdent
+       fi
+    fi # check for lvm binary
+  fi # check for bootoption nolvm
+  fi # run only in live-cd mode
+}
+# }}}
+
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam "debnet" ; then
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
+if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
+
 if checkbootparam "user" ; then
-  NEWUSER=''
-  NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
-  sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
+   NEWUSER=''
+   NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
+   sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
 if checkbootparam "filesystem" ; then
-  FILESYSTEM=''
-  FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
-  sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
+   FILESYSTEM=''
+   FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
+   sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
 fi
 
 if checkbootparam "partition" ; then
-  PARTITION=''
-  PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
-  # notice: the following checks whether the given partition is available, if not the skip
-  # execution of grml2hd as it might result in data loss...
-  if [ -r $PARTITION ] ; then
-    sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
-  else
-    ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
-  fi
+   PARTITION=''
+   PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
+   # notice: the following checks whether the given partition is available, if not the skip
+   # execution of grml2hd as it might result in data loss...
+   if [ -r $PARTITION ] ; then
+      sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
+   else
+      ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
+   fi
 fi
 
 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
 fi
 
-if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
-  cat>|/usr/bin/grml2hd_noninteractive<<EOF
+cat>|/usr/bin/grml2hd_noninteractive<<EOF
 #!/bin/sh
 GRML2HD_NONINTERACTIVE='yes' grml2hd
 EOF
-  chmod 755 /usr/bin/grml2hd_noninteractive
-  einfo "Bootparameter grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
-  if [ -z "$GRML2HD_FAIL" ] ; then
-    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
-  else
-    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
+
+chmod 755 /usr/bin/grml2hd_noninteractive
+einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
+if [ -z "$GRML2HD_FAIL" ] ; then
+   screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
+else
+   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 ...
+}
+# }}}
+
+# {{{ debootstrap: automatic installation
+config_debootstrap(){
+
+if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
+
+einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
+
+if ! [ -x /usr/sbin/grml-debootstrap ] ; then
+   eindent
+   eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
+   eoutdent
+   exit 1
+fi
+
+if checkbootparam "target" ; then
+  TARGET=''
+  TARGET="$(getbootparam 'target' 2>>$DEBUG)"
+  # notice: the following checks whether the given partition is available, if not the skip
+  # execution of grml-debootstrap as it might result in data loss...
+  if ! [ -r "$TARGET" ] ; then
+     eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
   fi
+else
+  eindent
+  eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
+  eoutdent
+  exit 1
+fi
+
+if checkbootparam "grub" ; then
+  GRUB=''
+  GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
+fi
+
+if checkbootparam "groot" ; then
+  GROOT=''
+  GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
 fi
+
+if checkbootparam "release" ; then
+  RELEASE=''
+  RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
+fi
+
+if checkbootparam "mirror" ; then
+  MIRROR=''
+  MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
+fi
+
+if checkbootparam "boot_append" ; then
+  BOOT_APPEND=''
+  BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
+fi
+
+if checkbootparam "password" ; then
+  PASSWORD=''
+  PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
+fi
+
+# now check which options are available
+if [ -n "TARGET" ] ; then
+   TARGETCMD="--target $TARGET"
+else
+   TARGETCMD=''
+   eindent
+   eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
+   eoutdent
+   exit 1
+fi
+[ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
+[ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
+[ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
+[ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
+[ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
+[ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
+
+# and finally write script and execute it
+cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
+#!/bin/sh
+AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
+EOF
+
+chmod 750  /usr/bin/grml-debootstrap_noninteractive
+
+screen /usr/bin/grml-debootstrap_noninteractive
+einfo "Invoking a shell, just exit to continue booting..."
+/bin/zsh
+
+fi # stringinstring "BOOT_IMAGE=debian2hd
 }
 # }}}
 
@@ -2150,6 +2319,8 @@ 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
+     # 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
   fi
 fi
@@ -2166,4 +2337,4 @@ config_keyboard(){
 # }}}
 
 ## END OF FILE #################################################################
-# vim:foldmethod=marker
+# vim:foldmethod=marker expandtab ai ft=zsh