Support multiple modules in bootoption blacklist
[grml-autoconfig.git] / autoconfig.functions
index fe4caf5..5442b8c 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.
 # 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: Mit Jul 11 19:34:06 CEST 2007 [mika]
+# Latest change: Mon Jän 14 21:34:16 CET 2008 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
 ################################################################################
 
 # {{{ 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=""
 
 # {{{ 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=""
 
 # 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
 # {{{ 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
 
    # 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
  fi
 
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
@@ -273,39 +270,44 @@ 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
  # 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
     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:
  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=$(fgconsole --next-available)
+ NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ CUR_CONSOLE=$(fgconsole)
+
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
+    [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
     eend $RC
  fi
     eend $RC
  fi
- if [ -n "$CONSOLEFONT" ] ; then
-    einfo "Running consolechars using ${CONSOLEFONT}"
-    for vc in `seq 0 ${NUM_CONSOLES}`  ; do
-        consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
-    done
-    eend $?
+
+ if checkbootparam noconsolefont ; then
+    ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
+ else
+    if [ -n "$CONSOLEFONT" ] ; then
+       einfo "Running consolechars using ${CONSOLEFONT}"
+       for vc in `seq 0 ${NUM_CONSOLES}`  ; do
+           consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
+       done
+       [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+       eend $?
+    fi
  fi
 
  eoutdent
  fi
 
  eoutdent
@@ -393,12 +395,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
@@ -433,22 +440,17 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# update_progress {{{
-update_progress(){
-  # be sure we are non-blocking
-  (echo "$1" > /etc/sysconfig/progress) &
-}
-# }}}
-
 # {{{ timezone
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
 # {{{ timezone
 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
 }
 # }}}
  fi
 }
 # }}}
@@ -588,21 +590,33 @@ config_fix_passwd(){
 # {{{ CD Checker
 config_testcd(){
 if [ -n "$TESTCD" ]; then
 # {{{ 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
 }
 # }}}
 fi
 }
 # }}}
@@ -694,18 +708,20 @@ if checkbootparam "blacklist" ; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
   if [ -n "$BLACK" ] ; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
   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 /etc/modprobe.d/grml."
+        echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
+        echo "blacklist $module"     >> /etc/modprobe.d/grml
+        echo "alias     $module off" >> /etc/modprobe.d/grml
+        echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; 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
@@ -716,9 +732,11 @@ fi
 config_acpi_apm(){
 if [ -d /proc/acpi ]; then
   if checkbootparam "noacpi"; then
 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
   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
     eindent
     found=""
     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
@@ -735,10 +753,10 @@ if [ -d /proc/acpi ]; then
     else
       ewarn "(none)" ; eend 1
     fi
     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."
       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"
       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 +884,8 @@ fi
 
 # {{{ Interactive configuration
 config_interactive(){
 
 # {{{ 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 +996,12 @@ fi
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
 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
 
    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)"
   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)"
@@ -1169,6 +1171,10 @@ else
     sleep 1
     eend 0
   done
     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
 }
 # }}}
 fi
 }
 # }}}
@@ -1506,7 +1512,15 @@ else
             amixer set Front ${VOL}% 1>/dev/null
          fi
       fi
             amixer set Front ${VOL}% 1>/dev/null
          fi
       fi
-      ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
+      # by default assume '0' as volume for microphone:
+      if checkbootparam micvol ; then
+         MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+      else
+         MICVOL=0
+      fi
+
+      # finally set the volumes:
+      ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
       if [ -n "$ERROR" ] ; then
          eindent
          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
       if [ -n "$ERROR" ] ; then
          eindent
          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
@@ -1525,11 +1539,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
   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
 }
   fi
 fi
 }
@@ -1753,7 +1766,7 @@ fi
 }
 
 config_automount(){
 }
 
 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
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
@@ -2034,8 +2047,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
 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
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
     if ! [ -x /sbin/mdadm ] ; then
@@ -2106,7 +2119,8 @@ config_lvm(){
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
   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
+    # 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
        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
@@ -2172,6 +2186,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
 # {{{ disable console blanking
 config_blanking(){
 if checkbootparam "noblank" ; then
@@ -2349,4 +2376,4 @@ config_keyboard(){
 # }}}
 
 ## END OF FILE #################################################################
 # }}}
 
 ## END OF FILE #################################################################
-# vim:foldmethod=marker expandtab ai ft=zsh
+# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3