Added tag 0.7.27 for changeset 841020ec07bf0fd6217d446e803a177a320aea61
[grml-autoconfig.git] / autoconfig.functions
index 26ef566..f7d2af3 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 22 14:01:33 CEST 2007 [mika]
+# Latest change: Son Sep 30 14:15:11 CEST 2007 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -96,7 +96,7 @@ CMDLINE="$(cat /proc/cmdline)"
 
 # {{{ Check if we are running from the grml-CD or HD
 INSTALLED=""
-[ -e /GRML/etc/grml_cd ] || INSTALLED="yes"
+[ -e /etc/grml_cd ] || INSTALLED="yes"
 
 # testcd
 TESTCD=""
@@ -157,11 +157,6 @@ fi
 }
 # }}}
 
-# {{{ Check if we are in interactive startup mode
-INTERACTIVE=""
-stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes"
-# }}}
-
 # {{{ set firmware timeout via bootparam
 config_fwtimeout(){
  if checkbootparam fwtimeout ; then
@@ -262,10 +257,12 @@ config_language(){
 
    # write keyboard related variables to file for later use
    [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
-   echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
-   echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
-   echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
-   echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
+   if ! [ -e /etc/sysconfig/keyboard ] ; then
+      echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
+      echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
+      echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
+      echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
+   fi
  fi
 
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
@@ -273,20 +270,16 @@ config_language(){
  # activate unicode console if running within utf8 environment
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
-       if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
-          ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
-       else
-          einfo "Setting up unicode environment."
-          unicode_start 2>>$DEBUG ; eend $?
-       fi
+       einfo "Setting up unicode environment."
+       unicode_start 2>>$DEBUG ; eend $?
     fi
  fi
 
  # Set default keyboard before interactive setup
  if [ -n "$KEYTABLE" ] ; then
-  einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
-  loadkeys -q $KEYTABLE &
-  eend $?
+    einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
+    loadkeys -q $KEYTABLE &
+    eend $?
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
@@ -444,11 +437,13 @@ update_progress(){
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-  einfo "Setting timezone."
-  KTZ="$(getbootparam tz 2>>$DEBUG)"
-  [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
-  rm -f /etc/localtime
-  cp "/usr/share/zoneinfo/$TZ" /etc/localtime && eend 0
+    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 $?
+    fi
  fi
 }
 # }}}
@@ -588,21 +583,33 @@ config_fix_passwd(){
 # {{{ CD Checker
 config_testcd(){
 if [ -n "$TESTCD" ]; then
-  einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
-  einfo "Reading files and checking against GRML/md5sums, this may take a while..."
-  echo -n "${RED}"
-  ( cd /cdrom/GRML/ ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
-  if [ "$?" = "0" ]; then
-    echo " ${GREEN}Everything looks OK${NORMAL}"
-    else
-    echo "${RED} *** CHECKSUM FAILED FOR THESE FILES:                          ***"
-    egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
-    echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
-    echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM.                             ***${NORMAL}"
-    echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}\a\a\a "
-    read a
-  fi
-  eend 0
+   einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
+   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=$? )
+   else
+      echo "${RED} *** Error: Could not find md5sum file.                           ***"
+   fi
+
+   if [ "$RC" = "0" ]; then
+      einfo "Everything looks OK" ; eend 0
+   else
+      eerror 'Checksum failed for theses files:' ; eend 1
+      egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
+      eerror 'Data on the grml medium is possibly incomplete/damaged or...'
+      eerror '... RAM of your computer is broken.' ; eend 1
+      einfon "Hit return to continue, or press the reset button to quit."
+     read a
+   fi
+
+   eend 0
 fi
 }
 # }}}
@@ -700,7 +707,7 @@ if checkbootparam "blacklist" ; then
     echo "alias     $BLACK off" >> /etc/modprobe.d/grml
     echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
   else
-   eerror "No given module for blacklist found. Blacklisting will not work therefor."
+   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
@@ -716,9 +723,11 @@ fi
 config_acpi_apm(){
 if [ -d /proc/acpi ]; then
   if checkbootparam "noacpi"; then
-    ewarn "Skipping ACPI Bios detection as requested on boot commandline." ; eend 0
+    ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
+  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: "
+    einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
     eindent
     found=""
     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
@@ -735,10 +744,10 @@ if [ -d /proc/acpi ]; then
     else
       ewarn "(none)" ; eend 1
     fi
-    if ! [ -S /var/run/acpid.socket ] ; then
+    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 >>$DEBUG ; eend $?
+        /etc/init.d/acpid start 1>>$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"
@@ -866,24 +875,8 @@ fi
 
 # {{{ Interactive configuration
 config_interactive(){
-if [ -n "$INTERACTIVE" ] ; then
-einfo "Entering interactive configuration second stage."
-
-  echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}"
-  echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] "
-  read a
-  [ "$a" != "n" ] && /usr/sbin/dpkg-reconfigure console-data ; eend $?
-
-  echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] "
-  read a
-  [ "$a" != "n" ] && alsaconf && ( exec aumix -m 0 >>$DEBUG 2>&1 & ) ; eend $?
-
-  echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] "
-  read a
-  [ "$a" != "n" ] && xorgcfg -textmode ; eend $?
-  echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}"
-fi
-eend 0
+  ewarn "config_interactive is deprecated nowadays."
+  ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
 }
 # }}}
 
@@ -994,12 +987,12 @@ fi
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
-if checkbootparam "swap" -o checkbootparam "anyswap" ; then
+if checkbootparam "swap" || checkbootparam "anyswap" ; then
    NOSWAP=''
    checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
-if checkbootparam "nofstab" -o 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)"
@@ -1046,8 +1039,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
@@ -1068,14 +1065,16 @@ if [ -z "$INSTALLED" ] ; then
 
         # 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"
@@ -1163,6 +1162,10 @@ else
     sleep 1
     eend 0
   done
+  if [ -n "$INSTALLED" ] ; then
+     ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
+     eend 0
+  fi
 fi
 }
 # }}}
@@ -1243,28 +1246,78 @@ 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) and 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
-    if /usr/sbin/laptop-detect ; then
+    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:"
-       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
@@ -1410,6 +1463,11 @@ if ! [ -x /usr/bin/aumix ] ; then
   eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
 else
 
+  if ! [ -r /proc/asound/cards ] ; then
+     ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
+     return
+  fi
+
   if checkbootparam vol ; then
     VOL="$(getbootparam 'vol' 2>>$DEBUG)"
     if [ -z "$VOL" ] ; then
@@ -1448,7 +1506,7 @@ else
       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
       if [ -n "$ERROR" ] ; then
          eindent
-         eerror "Problem setting mixer volumes: $ERROR"
+         eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
          eoutdent
       fi
       eend $RC
@@ -1464,11 +1522,10 @@ 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
-   if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
-     einfo "AC97 modem controller detected. Starting sl-modem-daemon in background."
-     /etc/init.d/sl-modem-daemon start >>$DEBUG &
-     eend 0
-   fi
+     if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
+        einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
+        eend 0
+     fi
   fi
 fi
 }
@@ -1692,7 +1749,7 @@ fi
 }
 
 config_automount(){
-if checkbootparam noautoconfig -o checkbootparam forensic ; then
+if checkbootparam noautoconfig || checkbootparam forensic ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
@@ -1973,8 +2030,8 @@ fi
 config_swraid(){
   if [ -z "$INSTALLED" ] ; then
   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
-  if checkbootparam 'noraid'   -o checkbootparam 'noswraid' -o \
-     checkbootparam 'forensic' -o checkbootparam 'raid=noautodetect' ; then
+  if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
+     checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
     if ! [ -x /sbin/mdadm ] ; then
@@ -2038,6 +2095,34 @@ 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
+    # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
+    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
+          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
@@ -2084,6 +2169,19 @@ fi
 }
 # }}}
 
+# {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
+config_ipw3945() {
+  if grep -q ipw3945 /proc/modules ; then
+     if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
+        ewarn "Broken ipw3945 network interface found, reloading module."
+        rmmod ipw3945
+        modprobe ipw3945
+        eend $?
+     fi
+  fi
+}
+# }}}
+
 # {{{ disable console blanking
 config_blanking(){
 if checkbootparam "noblank" ; then
@@ -2261,4 +2359,4 @@ config_keyboard(){
 # }}}
 
 ## END OF FILE #################################################################
-# vim:foldmethod=marker
+# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3