New bootoption micvol
[grml-autoconfig.git] / autoconfig.functions
1 #!/bin/zsh
2 # Filename:      autoconfig.functions
3 # Purpose:       basic system configuration and hardware setup for grml system
4 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 # Latest change: Don Nov 15 22:01:50 CET 2007 [mika]
8 ################################################################################
9
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
12 DEBUG="/dev/null"
13 KERNEL="$(uname -r)"
14 umask 022
15
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
18
19 # zsh stuff
20 iszsh(){
21 if [ -n "$ZSH_VERSION" ] ; then
22   return 0
23 else
24   return 1
25 fi
26 }
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
29 # }}}
30
31 ### {{{ Utility Functions
32
33 # Simple shell grep
34 stringinfile(){
35   case "$(cat $2)" in *$1*) return 0;; esac
36   return 1
37 }
38
39 # same for strings
40 stringinstring(){
41   case "$2" in *$1*) return 0;; esac
42   return 1
43 }
44
45 # Reread boot command line; echo last parameter's argument or return false.
46 getbootparam(){
47   stringinstring " $1=" "$CMDLINE" || return 1
48   result="${CMDLINE##*$1=}"
49   result="${result%%[   ]*}"
50   echo "$result"
51   return 0
52 }
53
54 # Check boot commandline for specified option
55 checkbootparam(){
56   stringinstring " $1" "$CMDLINE"
57   return "$?"
58 }
59
60 checkvalue(){
61   if [ "$1" = "yes" ] ; then
62     return 0
63   else
64     return 1
65   fi
66 }
67
68 checkgrmlsmall(){
69   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
70 }
71
72 checkgrmlusb(){
73   grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
74 }
75 ### }}}
76
77 # {{{ filesystems (proc, pts, sys) and fixes
78 mount_proc(){
79   [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
80 }
81
82 mount_pts(){
83   stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
84 }
85
86 mount_sys(){
87   [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
88 }
89 # }}}
90
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
95 # }}}
96
97 # {{{ Check if we are running from the grml-CD or HD
98 INSTALLED=""
99 [ -e /etc/grml_cd ] || INSTALLED="yes"
100
101 # testcd
102 TESTCD=""
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
104 # }}}
105
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
108   RC_NOCOLOR=yes
109   . /etc/grml/lsb-functions
110   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
111 else
112   . /etc/grml/lsb-functions
113   . /etc/grml_colors
114 fi
115 # }}}
116
117 # {{{ debug
118 config_debug(){
119  if checkbootparam "debug"; then
120    BOOTDEBUG="yes"
121  fi
122  if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
123    BOOTDEBUG="yes"
124  fi
125  rundebugshell(){
126   if [ -n "$BOOTDEBUG" ]; then
127     einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
128     eindent
129     if [ -r /etc/grml/screenrc ] ; then
130        einfo "Starting GNU screen to be able to use a full featured shell environment."
131        einfo "Just exit the shells (and therefore screen) to continue boot process..."
132        /bin/zsh -c "screen -c /etc/grml/screenrc"
133     else
134       einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135       einfo "Just exit the shell to continue boot process..."
136       /bin/zsh
137     fi
138     eoutdent
139   fi
140  }
141 }
142 # }}}
143
144 # {{{ log
145 config_log(){
146 if checkbootparam "log"; then
147   export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
148   touch $DEBUG
149   einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
150   eindent
151     einfo "Starting bootlogd."
152     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
153   eoutdent
154 else
155   DEBUG="/dev/null"
156 fi
157 }
158 # }}}
159
160 # {{{ set firmware timeout via bootparam
161 config_fwtimeout(){
162  if checkbootparam fwtimeout ; then
163    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
164    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
165    rmmod firmware_class 1>>$DEBUG 2>&1
166    modprobe firmware_class ; eend $?
167  fi
168  if [ -z "$TIMEOUT" ] ; then
169    TIMEOUT="100" # linux kernel default: 10
170  fi
171  if [ -f /sys/class/firmware/timeout ] ; then
172    einfo "Setting timeout for firmware loading to ${TIMEOUT}."
173    echo 100 > /sys/class/firmware/timeout ; eend $?
174  fi
175 }
176 # }}}
177
178 ### {{{ language configuration / localization
179 config_language(){
180
181  einfo "Activating language settings:"
182  eindent
183
184  # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
185  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
186
187  grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
188
189  # check for bootoption which overrides config from /etc/grml/autoconfig:
190  BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
191  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
192
193  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
194  if [ -z "$INSTALLED" ] ; then
195     [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
196  fi
197
198  # if bootoption lang is used update /etc/default/locale, otherwise *not*!
199  if [ -n "$BOOT_LANGUAGE" ] ; then
200     [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
201  fi
202
203  # set console font
204  if [ -z "$CONSOLEFONT" ] ; then
205     if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
206        # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
207        # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
208        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
209           CONSOLEFONT='Uni3-Terminus16'
210        else
211           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
212        fi
213     fi
214  fi
215
216  # export it now, so error messages get translated, too
217  if checkgrmlsmall ; then
218     export LANG='C' # grml-small does not provide any further locales
219  else
220     [ -r /etc/default/locale ] && . /etc/default/locale
221     export LANG LANGUAGE
222  fi
223
224  # configure keyboard layout, read in already set values first:
225  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
226
227  # now allow keyboard override by boot commandline for later use:
228  KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
229  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
230  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
231  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
232  [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
233
234  # modify /etc/sysconfig/keyboard only in live-cd mode:
235  if [ -z "$INSTALLED" ] ; then
236
237    local LANGUAGE="$BOOT_LANGUAGE"
238    . /etc/grml/language-functions
239    # allow setting xkeyboard explicitly different than console keyboard
240    KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
241    if [ -n "$KXKEYBOARD" ]; then
242       XKEYBOARD="$KXKEYBOARD"
243       KDEKEYBOARD="$KXKEYBOARD"
244    elif [ -n "$KKEYBOARD" ]; then
245       XKEYBOARD="$KKEYBOARD"
246       KDEKEYBOARD="$KKEYBOARD"
247    fi
248
249    # duplicate of previous code to make sure /etc/grml/language-functions
250    # does not overwrite our values....
251    # now allow keyboard override by boot commandline for later use:
252    KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
253    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
254    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
255    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
256    [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
257
258    # write keyboard related variables to file for later use
259    [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
260    if ! [ -e /etc/sysconfig/keyboard ] ; then
261       echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
262       echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
263       echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
264       echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
265    fi
266  fi
267
268  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
269
270  # activate unicode console if running within utf8 environment
271  if [ -r /etc/default/locale ] ; then
272     if grep -q "LANG=.*UTF" /etc/default/locale ; then
273        einfo "Setting up unicode environment."
274        unicode_start 2>>$DEBUG ; eend $?
275     fi
276  fi
277
278  # Set default keyboard before interactive setup
279  if [ -n "$KEYTABLE" ] ; then
280     einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281     loadkeys -q $KEYTABLE &
282     eend $?
283  fi
284
285  # we have to set up all consoles, therefore loop it over all ttys:
286  NUM_CONSOLES=`fgconsole --next-available`
287  NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
288  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
289
290  if [ -n "$CHARMAP" ] ; then
291     einfo "Running consolechars for ${CHARMAP}"
292     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
293         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
294     done
295     eend $RC
296  fi
297
298  if checkbootparam noconsolefont ; then
299     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
300  else
301     if [ -n "$CONSOLEFONT" ] ; then
302        einfo "Running consolechars using ${CONSOLEFONT}"
303        for vc in `seq 0 ${NUM_CONSOLES}`  ; do
304            consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
305        done
306        eend $?
307     fi
308  fi
309
310  eoutdent
311 }
312 # }}}
313
314 # {{{ Set hostname
315 config_hostname(){
316  if checkbootparam hostname ; then
317   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
318   einfo "Setting hostname to $HOSTNAME as requested."
319   sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
320   hostname $HOSTNAME ; eend $?
321  else
322   hostname --file /etc/hostname
323  fi
324 }
325 # }}}
326
327 # fstabuser (needed when running from harddisk with username != grml {{{
328 config_userfstab(){
329   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
330   if [ -n "$CONFIG_FSTAB_USER" ] ; then
331      fstabuser="$CONFIG_FSTAB_USER"
332   else
333      fstabuser=$(getent passwd 1000 | cut -d: -f1)
334   fi
335   # if not yet set fall back to default 'grml' user
336   [ -n "$fstabuser" ] || fstabuser='grml'
337 }
338 # }}}
339
340 # {{{ Set clock (Local time is more often used than GMT, so it is default)
341 config_time(){
342  # don't touch the files if running from harddisk:
343  if [ -z "$INSTALLED" ]; then
344     UTC=""
345     checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
346     checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
347     # hwclock uses the TZ variable
348     [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
349     [ -n "$TZ" ] || TZ=Europe/Vienna
350
351     if ! [ -r /dev/rtc ] ; then
352       ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
353     else
354       ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
355       if [ -n "$ERROR" ] ; then
356          eindent
357          ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
358          if [ -n "$ERROR" ] ; then
359             eerror "Problem running hwclock: $ERROR" ; eend 1
360          fi
361          eoutdent
362       fi
363     fi
364  fi
365 }
366 # }}}
367
368 # {{{ print kernel info
369 config_kernel(){
370   vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
371   [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
372   einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
373   if [ -r /proc/cpuinfo ] ; then
374      if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
375        eindent
376        einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
377        eoutdent
378      fi
379   fi
380   if [ -d /proc/xen ] ; then
381      eindent
382      einfo 'Running kernel featuring support for Xen detected' ; eend 0
383      eoutdent
384   fi
385 }
386 # }}}
387
388 # {{{ vmware specific stuff
389 config_vmware(){
390 if checkbootparam novmware ; then
391    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
392 else
393    if [ -z "$INSTALLED" ] ; then
394       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
395               if ! checkbootparam qemu ; then
396             if [ -r /etc/X11/xorg.conf.vmware ] ; then
397                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
398                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
399             fi
400          fi
401       fi
402    fi
403 fi
404 }
405 # }}}
406
407 # {{{ qemu specific stuff
408 config_qemu(){
409 if checkbootparam qemu ; then
410    if [ -r /etc/X11/xorg.conf.example ] ; then
411       einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
412       cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
413    fi
414 fi
415 }
416 # }}}
417
418 # {{{ ld.so.cache + depmod
419 config_ld_mod(){
420 if [ -n "$INSTALLED" ]; then
421  if ! [ -r /etc/grml.first.boot ] ; then
422   einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
423   eindent
424 # Regenerate ld.so.cache and module dependencies on HD
425     einfo "Running ldconfig" ; ldconfig  ; eend $?
426     einfo "Running depmod"   ; depmod -a ; eend $?
427     touch /etc/grml.first.boot
428     eend 0
429   eoutdent
430  fi
431 fi
432 }
433 # }}}
434
435 # update_progress {{{
436 update_progress(){
437   # be sure we are non-blocking
438   (echo "$1" > /etc/sysconfig/progress) &
439 }
440 # }}}
441
442 # {{{ timezone
443 config_timezone(){
444  # don't touch the files if running from harddisk:
445  if [ -z "$INSTALLED" ]; then
446     KTZ="$(getbootparam tz 2>>$DEBUG)"
447     if [ -n "$KTZ" ] ; then
448        einfo "Setting timezone."
449        [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
450        rm -f /etc/localtime
451        cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
452     fi
453  fi
454 }
455 # }}}
456
457 # small computer / nearly no ram {{{
458 config_small(){
459
460 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
461 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
462 eindent
463
464 if checkbootparam "small"; then
465   einfo "Information: ${RAM} kB of RAM available." ; eend 0
466   einfo "Bootoption small detected. Activating small system."
467   if [ -r /etc/inittab.small ] ; then
468     mv /etc/inittab /etc/inittab.normal
469     mv /etc/inittab.small /etc/inittab
470   else
471     sed -i 's/^9/#&/' /etc/inittab
472     sed -i 's/^10/#&/' /etc/inittab
473     sed -i 's/^11/#&/' /etc/inittab
474     sed -i 's/^12/#&/' /etc/inittab
475   fi
476   /sbin/telinit q ; eend $?
477 else
478   if checkgrmlsmall ; then
479     if [[ $RAM -lt 25000 ]] ; then
480       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
481       ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
482       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
483       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
484       /bin/zsh --login
485     else
486       einfo "Information: ${RAM} kB of RAM available." ; eend 0
487     fi
488   else
489     if [[ $RAM -lt 58000 ]] ; then
490       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
491       ewarn "At least 64MB of RAM should be available for grml." ; eend 1
492       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
493       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
494       /bin/zsh --login
495     else
496       einfo "Information: ${RAM} kB of RAM available." ; eend 0
497     fi
498   fi
499 fi
500 eoutdent
501 }
502 # }}}
503
504 # skip startup of w3m {{{
505 config_fast(){
506 if checkbootparam "fast"; then
507   ewarn "Bootoption fast detected. Skipping startup of w3m."
508     sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
509   /sbin/telinit q ; eend $?
510 fi
511 }
512 # }}}
513
514 # activate serial console {{{
515 config_console(){
516 if checkbootparam "console"; then
517   einfo "Bootoption (for serial) console detected."
518   eindent
519     if [ -r /etc/mgetty/mgetty.config ] ; then
520        MODE=$(getbootparam console | awk -F, '{print $2}')
521        MODE=${MODE%%n*}
522        [ -n "$MODE" ] || MODE=9600 # default mode
523        einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
524        sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
525     fi
526
527     einfo "Activating mgetty."
528     sed -i 's/^#T0/T0/' /etc/inittab
529     sed -i 's/^#T1/T1/' /etc/inittab
530     /sbin/telinit q ; eend $?
531   eoutdent
532 fi
533 }
534 # }}}
535
536 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
537 config_cdrom_perm(){
538 CDROMS=""
539 for DEVICE in /proc/ide/hd?; do
540  [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
541 done
542 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
543 }
544 # }}}
545
546 # {{{ Bring up loopback interface now
547 config_local_net(){
548  if [ -z "$INSTALLED" ] ; then
549     if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
550        grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
551     else
552        ifconfig lo up
553     fi
554  fi
555 }
556 # }}}
557
558 # firewire devices {{{
559 # the raw1394 driver does not yet export info into SYSFS,
560 # so let's create raw1394 device manually
561 # http://www.michael-prokop.at/blog/index.php?p=352
562 config_firewire_dev(){
563 if checkbootparam "nofirewiredev" ; then
564   ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
565 else
566 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
567   einfo "Creating some firewire devices (fix kernel 2.6-bug)."
568 #  cd /dev && MAKEDEV video1394 raw1394
569   [ -r /dev/raw1394 ]   || mknod /dev/raw1394 c 171 0
570   [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
571 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
572   [ -r /dev/dv1394 ]    || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
573   chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
574   chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
575 fi
576 #fi
577 }
578 # }}}
579
580 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
581 # otherwise we will get: passwd: Authentication token lock busy
582 config_fix_passwd(){
583  if [ -z "$INSTALLED" ] ; then
584   touch /etc/.pwd.lock
585  fi
586 }
587 # }}}
588
589 # {{{ CD Checker
590 config_testcd(){
591 if [ -n "$TESTCD" ]; then
592    einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
593    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
594    echo -n "${RED}"
595
596    # /linuxrc grml version:
597    [ -d /cdrom/GRML ]      && TESTCD_PATH=/cdrom/GRML
598    # live-initramfs version:
599    [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
600
601    if [ -n "$TESTCD_PATH" ] ; then
602       ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
603    else
604       echo "${RED} *** Error: Could not find md5sum file.                           ***"
605    fi
606
607    if [ "$RC" = "0" ]; then
608       einfo "Everything looks OK" ; eend 0
609    else
610       eerror 'Checksum failed for theses files:' ; eend 1
611       egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
612       eerror 'Data on the grml medium is possibly incomplete/damaged or...'
613       eerror '... RAM of your computer is broken.' ; eend 1
614       einfon "Hit return to continue, or press the reset button to quit."
615      read a
616    fi
617
618    eend 0
619 fi
620 }
621 # }}}
622
623 # {{{ hardware detection via discover
624 config_discover(){
625 if checkbootparam "nodisc" ; then
626   ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
627 else
628  if [ -x /sbin/discover ] ; then
629   einfo "Discovering hardware. Trying to load the following modules in background:"
630    eindent
631    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)"
632    eoutdent
633   /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
634   eend 0
635  else
636   eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
637  fi
638 fi
639 }
640 # }}}
641
642 # {{{ hardware detection via hwinfo
643 config_hwinfo(){
644 if checkbootparam hwinfo >>$DEBUG 2>&1; then
645   einfo "Discovering hardware via hwinfo:"
646   MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
647   echo -n "  Loading modules: "
648   for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
649   eend 0
650 fi
651 }
652 # }}}
653
654 # {{{ disable hotplug agents on request
655 config_hotplug_agent(){
656 if checkbootparam "noagent" ; then
657   AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
658   AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
659   AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
660   einfo "Disabling hotplug-agent(s) $AGENTNL"
661   for agent in $(echo -e $AGENTLIST) ; do
662     mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
663   done
664   [ "$?" == "0" ] ; eend $?
665 fi
666 }
667 # }}}
668
669 # {{{ blacklist of hotplug-modules
670 config_hotplug_blacklist(){
671 if checkbootparam "black" ; then
672   BLACK="$(getbootparam 'black' 2>>$DEBUG)"
673   BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
674   BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
675   einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
676   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
677   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
678   eend 0
679 fi
680 }
681 # }}}
682
683 # {{{ run hotplug
684 config_hotplug(){
685 if checkbootparam "nohotplug" ; then
686   ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
687 else
688   if [ -r /etc/init.d/hotplug ] ; then
689     einfo "Starting hotplug system in background."
690     /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
691     eend 0
692   elif [ -r /etc/init.d/hotplug-light ] ; then
693     einfo "Starting hotplug-light system in background."
694     /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
695     eend 0
696   else
697     ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
698   fi
699 fi
700 }
701 # }}}
702
703 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
704 config_blacklist(){
705 if checkbootparam "blacklist" ; then
706  if [ -z "$INSTALLED" ]; then
707   einfo "Bootoption blacklist found."
708   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
709   if [ -n "$BLACK" ] ; then
710     einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
711     echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
712     echo "blacklist $BLACK"     >> /etc/modprobe.d/grml
713     echo "alias     $BLACK off" >> /etc/modprobe.d/grml
714     echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
715   else
716    eerror "No given module for blacklist found. Blacklisting will not work therefore."
717   fi
718  else
719   ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
720   eindent
721    einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
722   eoutdent
723  fi
724 fi
725 }
726 # }}}
727
728 # {{{ ACPI
729 config_acpi_apm(){
730 if [ -d /proc/acpi ]; then
731   if checkbootparam "noacpi"; then
732     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
733   elif checkbootparam "nogrmlacpi" ; then
734     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
735   else
736     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
737     eindent
738     found=""
739     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
740       basename="${a##*/}"
741       basename="${basename%%.*}"
742       case "$basename" in *_acpi)
743        egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
744       esac
745       modprobe $basename >>$DEBUG 2>&1 && found="yes"
746       local BASE="$BASE $basename"
747     done
748     if [ -n "$found" ] ; then
749       einfo "$BASE"  ; eend 0
750     else
751       ewarn "(none)" ; eend 1
752     fi
753     if ! ps x | grep -q /usr/sbin/acpid ; then
754       if ! [ -r /var/run/dbus/pid ] ; then
755         einfo "Starting acpi daemon."
756         /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
757       else
758         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
759         eerror "Solution: please activate acpid via /etc/runlevel.conf"
760         eend 1
761       fi
762     else
763       ewarn "acpi daemon already running."
764       eend 0
765     fi
766     eoutdent
767   fi
768 else
769 # APM
770   if checkbootparam "noapm"; then
771     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
772   else
773     modprobe apm power_off=1 >>$DEBUG 2>&1
774     if [ "$?" = "0" ] ; then
775        if [ -x /etc/init.d/apmd ] ;then
776           einfo "APM Bios found, enabling power management functions."
777           /etc/init.d/apmd start ; eend $?
778        fi
779     else
780       eerror "Loading apm module failed." ; eend 1
781     fi
782   fi
783 fi
784 }
785 # }}}
786
787 # {{{ PCMCIA Check/Setup
788 # This needs to be done before other modules are being loaded (by hwsetup)
789 config_pcmcia(){
790 if checkbootparam "nopcmcia"; then
791   ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
792 else
793   if /usr/sbin/laptop-detect ; then
794     einfo "Detected Laptop - checking for PCMCIA." && eend 0
795     modprobe pcmcia_core >>$DEBUG 2>&1
796     # Try Cardbus or normal PCMCIA socket drivers
797     modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
798     if [ "$?" = "0" ]; then
799       modprobe ds >>$DEBUG 2>&1
800       if [ -d /proc/bus/pccard ] ; then
801        if [ -x /sbin/cardmgr ] ; then
802         einfo "PCMCIA found, starting cardmgr."
803         cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
804        else
805         eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
806        fi
807       fi
808     fi
809   fi
810 fi
811 }
812 # }}}
813
814 # {{{ run software synthesizer via speakup
815 config_swspeak(){
816 if checkbootparam swspeak ; then
817  if [ -d /proc/speakup/ ] ; then
818   einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
819   eindent
820    if [ -x /etc/init.d/speech-dispatcher ] ; then
821      einfo "Starting speech-dispatcher."
822      /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
823      einfo "Activating sftsyn in Kernel."
824      echo sftsyn >/proc/speakup/synth_name ; eend $?
825      einfo "Just run swspeak if you want to use software synthesizer via speakup."
826      flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
827    else
828     eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
829     flite -o play -t "speech-dispatcher not available. speakup will not work without it."
830    fi
831   eoutdent
832  else
833   eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
834   flite -o play -t "Kernel does not seem to support speakup. Sorry."
835  fi
836 fi
837 }
838 # }}}
839
840 # {{{ Check for blind option or brltty
841 config_blind(){
842 BLIND=""
843 checkbootparam "blind" && BLIND="yes"
844 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
845
846 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
847   if [ -x /sbin/brltty ]; then
848     # Blind option detected, start brltty now.
849     # modprobe serial_core parport_serial generic_serial && echo "done"
850     CMD=brltty
851     BRLTYPE=""
852     BRLDEV=""
853     BRLTEXT=""
854     if [ -n "$BRLTTY" ]; then
855       # Extra options
856       BRLTYPE="${BRLTTY%%,*}"
857       R="${BRLTTY#*,}"
858       if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
859         BRLTTY="$R"
860         BRLDEV="${BRLTTY%%,*}"
861         R="${BRLTTY#*,}"
862         if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
863           BRLTTY="$R"
864           BRLTEXT="${BRLTTY%%,*}"
865           R="${BRLTTY#*,}"
866         fi
867       fi
868     fi
869     [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
870     [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
871     [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
872     einfo "Starting braille-display manager."
873 #    ( exec $CMD & )
874     ( sh -c "$CMD" & )
875     sleep 2 && BLINDSOUND="yes"
876     eend 0
877   fi
878 fi
879 }
880 # }}}
881
882 # {{{ Interactive configuration
883 config_interactive(){
884   ewarn "config_interactive is deprecated nowadays."
885   ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
886 }
887 # }}}
888
889 # {{{ AGP
890 config_agp(){
891 if checkbootparam forceagp ; then
892 # Probe for AGP. Hope this can fail safely
893   stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
894 fi
895 }
896 # }}}
897
898 # {{{ automount(er)
899 config_automounter(){
900 if checkbootparam automounter ; then
901   RUNLEVEL="$(runlevel)"
902   AUTOMOUNTER=""
903   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
904
905 addautomount(){
906 # /dev/ice  options
907   d="${1##*/}"
908   if [ -n "$AUTOMOUNTER" ]; then
909     [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
910     [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
911     [ -L "/mnt/$d" ]      || ln -s "/mnt/auto/$d" "/mnt/$d"
912     anew="$d        -fstype=auto,$2 :$i"
913     stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
914     AUTOMOUNTS="$AUTOMOUNTS $d"
915     new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
916   else
917     [ -d /mnt/$d ] && mkdir -p /mnt/$d
918     new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
919   fi
920   stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
921 }
922
923   AUTOMOUNTS="floppy cdrom"
924 # Add new devices to /etc/fstab and /etc/auto.mnt
925   for i in /dev/cdrom?*; do
926     if [ -L $i ]; then
927       addautomount "$i" "ro"
928     fi
929   done
930 fi
931
932 if [ -n "$AUTOMOUNTER" ]; then
933 # Check for floppy dir, reinstall with automounter
934   [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
935   [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
936   [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
937   [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
938   [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
939   [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
940   rm -f /etc/fstab.new
941 # Replace paths from bootfloppy
942   sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
943   mv -f /etc/fstab.new /etc/fstab
944 # Start automounter now
945   einfo "Starting automounter for ${AUTOMOUNTS}."
946   /etc/init.d/autofs start >>$DEBUG ; eend $?
947 fi
948 }
949 # }}}
950
951 # {{{ Collect partitions from /proc/partitions first for enabling DMA
952 check_partitions(){
953 partitions=""
954 IDEDISKS=""
955 while read major minor blocks partition relax; do
956   partition="${partition##*/}"
957   [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
958   case "$partition" in
959     hd?) IDEDISKS="$IDEDISKS $partition";;                # IDE  Harddisk, entire disk
960     sd?) ;;                                               # SCSI Harddisk, entire disk
961 #    [hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
962     [hs]d*|ub*) partitions="$partitions /dev/$partition";;    # IDE, USB or SCSI disk partition
963   esac
964 done <<EOT
965 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
966 EOT
967 }
968 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
969 # }}}
970
971 # {{{ Enable DMA for all IDE drives now if not disabled
972 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
973 config_dma(){
974 if checkbootparam "nodma"; then
975   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
976 else
977   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
978     if test -d /proc/ide/$d; then
979       if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
980         MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
981         test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
982         einfo "Enabling DMA acceleration for: ${WHITE}$d        ${YELLOW}[${MODEL}]${NORMAL}"
983         echo "using_dma:1" >/proc/ide/$d/settings
984         eend 0
985       fi
986     fi
987   done
988 fi
989 }
990 # }}}
991
992 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
993 config_fstab(){
994
995 NOSWAP="yes" # we do not use swap by default!
996 if checkbootparam "swap" || checkbootparam "anyswap" ; then
997    NOSWAP=''
998    checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
999 fi
1000
1001 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1002   ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1003 else
1004   einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1005   iszsh && setopt nonomatch
1006   if [ -x /usr/sbin/rebuildfstab ] ; then
1007      config_userfstab || fstabuser=grml
1008      /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1009   else
1010      ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1011   fi
1012 fi # checkbootparam nofstab/forensic
1013
1014 # Scan for swap, config, homedir - but only in live-mode
1015 if [ -z "$INSTALLED" ] ; then
1016    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1017    GRML_IMG=""
1018    GRML_SWP=""
1019    HOMEDIR="$(getbootparam home)"
1020    if [ -n "$partitions" ]; then
1021       while read p m f relax; do
1022         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1023         partoptions="users,exec"
1024         fnew=""
1025         # it's a swap partition?
1026         case "$f" in swap)
1027           eindent
1028           if [ -n "$NOSWAP" ]; then
1029              ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1030              eend 0
1031           else
1032              case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1033                    S1SUSP|S2SUSP|pmdisk|[zZ]*)
1034                      if [ -n "$ANYSWAP" ] ; then
1035                         einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1036                         swapon $p 2>>$DEBUG ; eend $?
1037                      else
1038                         ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1039                      fi
1040                      ;;
1041                    *)
1042                      if [[ "$p" == LABEL* ]] ; then
1043                         p=$(blkid -t $p | awk -F: '{print $1}')
1044                      fi
1045                      if grep -q $p /proc/swaps ; then
1046                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1047                      else
1048                         if [ -b "$p" ] ; then
1049                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1050                         swapon $p 2>>$DEBUG ; eend $?
1051                         else
1052                         ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1053                         fi
1054                      fi
1055                      ;;
1056              esac # dd-check
1057           fi # -n "$NOSWAP
1058           eoutdent
1059           continue
1060           ;;
1061         esac # it's a swap partition?
1062
1063         # mount read-only
1064         MOUNTOPTS="ro"
1065         case "$f" in
1066           vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1067           ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1068           *) continue ;;
1069           # *) NONEFOUND='1'; continue ;;
1070         esac
1071
1072         # use a swapfile
1073         if [ -z "$NOSWAP" ] ; then
1074            mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1075            # Activate swapfile, if exists
1076            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1077         fi
1078         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1079            mount -o remount,rw $m && MOUNTED=1
1080            if swapon "$SWAPFILE" 2>>$DEBUG ; then
1081               eindent
1082                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1083               eoutdent
1084               fnew="$SWAPFILE swap swap defaults 0 0"
1085               stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1086               GRML_SWP="$GRML_SWP $SWAPFILE"
1087               eend 0
1088            fi
1089            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1090         fi
1091
1092         # use a image as home
1093         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1094         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1095            if [ -n "$HOMEDIR" ]; then
1096               if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1097                  continue
1098               fi
1099            fi
1100            if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1101               GRML_IMG="$IMAGE"
1102               mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1103            fi
1104         fi
1105         eend 0
1106
1107         # Umount, if not in use
1108         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1109
1110       done <<EOT
1111       $(cat /etc/fstab)
1112 EOT
1113    fi # -n $partitions
1114 fi # -z $INSTALLED
1115 }
1116 # }}}
1117
1118 # {{{ Mouse
1119 config_mouse(){
1120 if [ -n "$MOUSE_DEVICE" ] ; then
1121   einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1122 fi
1123 }
1124 # }}}
1125
1126 # {{{ IPv6 configuration
1127 # Load IPv6 kernel module and print IP adresses
1128 config_ipv6(){
1129 if checkbootparam "ipv6"; then
1130   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1131   modprobe ipv6
1132   # we probably need some time until stateless autoconfiguration has happened
1133   sleep 2
1134   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1135   for DEVICE in `echo "$NETDEVICES"`; do
1136     eindent
1137       einfo "$DEVICE:"
1138       ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1139       COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1140       eindent
1141         for ADDR in `echo "$ADDRESSES"` ; do
1142             einfo "$ADDR"
1143         done
1144         if [ "$COUNT" -eq "0" ] ; then
1145            einfo "(none)" ; eend 1
1146         fi
1147       eoutdent
1148     eoutdent
1149   done
1150   eend 0
1151 fi
1152 }
1153 # }}}
1154
1155 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1156 config_dhcp(){
1157 if checkbootparam "nodhcp"; then
1158   ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1159 else
1160   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1161   rm -rf /etc/network/status ; mkdir -p /etc/network/status
1162   for DEVICE in `echo "$NETDEVICES"` ; do
1163     einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1164     trap 2 3 11
1165     ifconfig $DEVICE up >>$DEBUG 2>&1
1166     ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1167     trap "" 2 3 11
1168     sleep 1
1169     eend 0
1170   done
1171   if [ -n "$INSTALLED" ] ; then
1172      ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1173      eend 0
1174   fi
1175 fi
1176 }
1177 # }}}
1178
1179 # {{{ helper functions
1180 findfile(){
1181 FOUND=""
1182 # search all partitions for a file in the root directory
1183 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1184 # See if it's already mounted
1185   [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
1186   if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1187     [ -f "$i/$1" ] && FOUND="$i/$1"
1188     umount -l "$i" 2>>$DEBUG
1189     [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1190   fi
1191 done
1192 return 2
1193 }
1194
1195 fstype(){
1196 case "$(file -s $1)" in
1197   *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1198   *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
1199   *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
1200   *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1201   *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1202   *data*)          echo "invalid"; return 0;;
1203   *) echo "auto"; return 0;;
1204 esac
1205 }
1206
1207 # Try to mount this filesystem read-only, without or with encryption
1208 trymount(){
1209 # Check if already mounted
1210 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1211 # Apparently, mount-aes DOES autodetect AES loopback files.
1212 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1213 # We need to mount crypto-loop files with initial rw support
1214 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1215 # Mount succeeded?
1216 [ "$RC" = "0" ] && return 0
1217 echo ""
1218 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1219 a="y"
1220 while [ "$a" != "n" -a "$a" != "N" ]; do
1221 # We need to mount crypto-loop files with initial rw support
1222  mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1223  echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1224  # Problem with ioctl() from getpasswd()?
1225  # read a
1226  read a
1227 done
1228 return 1
1229 }
1230 # }}}
1231
1232 # {{{ CPU-detection
1233 config_cpu(){
1234 if checkbootparam "nocpu"; then
1235   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1236 else
1237   # check module dependencies
1238   cpufreq_check() {
1239    if [ -e /lib64 ] ; then
1240       [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1241    else
1242       [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1243    fi
1244   }
1245
1246   if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1247      einfo "Detecting CPU:"
1248      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)
1249      echo $CPU | sed 's/ \{1,\}/ /g'
1250      eend 0
1251   else
1252      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
1253   fi
1254
1255   # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1256   # * it only if we have the according kernel modules available
1257   # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1258   # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1259   #   -> parse output of the initscript and output it according to our look'n'feel
1260   # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1261   if ! cpufreq_check ; then
1262     ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1263   else
1264     if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1265        # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1266        if [ -r /proc/acpi/battery/BAT0/info ] ; then
1267           if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
1268              einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1269              return 0
1270           fi
1271        fi
1272        einfo "Detected Laptop - trying to use cpu frequency scaling:"
1273        eindent
1274        if [ -x /etc/init.d/loadcpufreq ] ; then
1275           SKIP_CPU_GOVERNOR=''
1276           LOADCPUFREQ=$(mktemp)
1277           /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1278           if grep -q FATAL "$LOADCPUFREQ" ; then
1279              eindent
1280                SKIP_CPU_GOVERNOR=1
1281                oldIFS="$IFS"
1282                IFS="
1283 "
1284                 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1285                     eerror "$line" ; eend $RC
1286                 done
1287                 IFS="$oldIFS"
1288              eoutdent
1289            elif grep -q done "$LOADCPUFREQ" ; then
1290              MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1291              if [ -n "$MODULE" -a "$MODULE" != none ]; then
1292                 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1293              else
1294                 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1295              fi
1296           fi
1297           rm -f $LOADCPUFREQ
1298        elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1299           . /usr/bin/cpufreq-detect.sh
1300           if [ -n "$MODULE" -a "$MODULE" != none ]; then
1301              einfo "Loading modules ${MODULE}"
1302              modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1303              RC=$?
1304              if [[ $RC == 0 ]]; then
1305                 eend 0
1306              else
1307                 SKIP_CPU_GOVERNOR=1
1308                 eend $1
1309              fi
1310           else
1311              ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1312           fi # $MODULE
1313        fi # loadcpufreq
1314
1315        if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1316           einfo "Loading cpufreq_ondemand, setting ondemand governor"
1317           if modprobe cpufreq_ondemand ; RC=$? ; then
1318              for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1319                  echo ondemand > $file
1320              done
1321           fi
1322           eend $RC
1323        fi # cpu-governor
1324
1325        eoutdent
1326
1327     fi # laptop-detect
1328   fi # cpufreq_check
1329 fi # checkbootparam nocpu
1330 }
1331 # }}}
1332
1333 # {{{ autostart of ssh
1334 config_ssh(){
1335 if checkbootparam ssh ; then
1336   SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1337   einfo "Bootoption passwd found."
1338   if [ -n "$SSH_PASSWD" ] ; then
1339     echo "grml:$SSH_PASSWD" | chpasswd -m
1340     einfo "Starting secure shell server in background."
1341     /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1342     /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1343     eend 0
1344   else
1345     eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1346   fi
1347   eindent
1348     ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1349   eoutdent
1350 fi
1351 }
1352 # }}}
1353
1354 # {{{ set password for user grml
1355 config_passwd(){
1356 if checkbootparam passwd >>$DEBUG 2>&1; then
1357   einfo "Bootoption passwd found."
1358   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1359   if [ -n "$PASSWD" ] ; then
1360     echo "grml:$PASSWD" | chpasswd -m ; eend $?
1361   else
1362     eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1363   fi
1364   eindent
1365     ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1366   eoutdent
1367 fi
1368 }
1369 # }}}
1370
1371 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1372 config_homedir(){
1373 if checkbootparam home ; then
1374    HOMEDIR="$(getbootparam home)"
1375    MYHOMEDEVICE=""
1376    MYHOMEMOUNTPOINT=""
1377    MYHOMEDIR=""
1378    if [ -n "$HOMEDIR" ]; then
1379       einfo "Bootoption home detected." && eend 0
1380       case "$HOMEDIR" in
1381         /dev/*)
1382         MYHOMEDEVICE="${HOMEDIR##/dev/}"
1383         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1384         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1385         MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1386       ;;
1387         /mnt/*)
1388         MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1389         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1390         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1391         MYHOMEDIR="$HOMEDIR"
1392       ;;
1393         [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1394         MYHOMEDIR="$(findfile grml.img)"
1395         MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1396         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1397         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1398       ;;
1399       *)
1400         eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1401         eerror "Option ignored." ; eend 1
1402       ;;
1403       esac
1404    fi # -n $HOMEDIR
1405
1406    if [ -n "$MYHOMEDIR" ]; then
1407       if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1408          [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1409          while read device mountpoint fs relax; do
1410            case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1411              case "$fs" in
1412                *[Nn][Tt][Ff][Ss]*)
1413                  umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1414                  break
1415                  ;;
1416                *[Ff][Aa][Tt]*)
1417                  # Note: This currently won't work with encrypted partitions
1418                  umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1419                  if [ ! -f "$MYHOMEDIR" ]; then
1420                     ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1421                     ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1422                  fi
1423                  ;;
1424              esac
1425
1426              if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1427                 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1428                 if [ -f "$MYHOMEDIR" ]; then
1429                    # It's a loopback file, mount it over the /home/grml directory
1430                    trymount "$MYHOMEDIR" /home/grml
1431                    RC="$?"
1432                    [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1433                    RC="$?"
1434                 else
1435                    # Do a --bind mount
1436                    ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1437                    RC="$?"
1438                 fi # -f $MYHOMEDIR
1439
1440                 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1441
1442              fi #  mount -o remount,rw,...
1443            break
1444            ;;
1445            esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1446          done <<EOT
1447          $(cat /proc/mounts)
1448 EOT
1449      fi # if trymount ...
1450    fi # -n $MYHOMEDIR
1451 fi # checkbootparam home
1452 }
1453 # }}}
1454
1455 # {{{ Check for scripts on CD-ROM
1456 config_cdrom_scripts(){
1457 if checkbootparam "script"; then
1458   for script in /cdrom/scripts/* ; do
1459     einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1460     . $script
1461   done
1462 fi
1463 }
1464 # }}}
1465
1466 # {{{ Sound
1467 config_mixer(){
1468 if ! [ -x /usr/bin/aumix ] ; then
1469   eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1470 else
1471
1472   if ! [ -r /proc/asound/cards ] ; then
1473      ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1474      return
1475   fi
1476
1477   if checkbootparam vol ; then
1478     VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1479     if [ -z "$VOL" ] ; then
1480       eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1481       VOL='75' # default
1482     fi
1483   else
1484     VOL='75' # default
1485   fi
1486
1487   if checkbootparam nosound ; then
1488     einfo "Muting sound devices on request."
1489     # some IBM notebooks require the following stuff:
1490     if [ -x /usr/bin/amixer ] ; then
1491        if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1492           amixer set Front unmute 1>/dev/null
1493           amixer set Front 0% 1>/dev/null
1494        fi
1495     fi
1496     ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1497     if [ -n "$ERROR" ] ; then
1498        eindent
1499        eerror "Problem muting sound devices: $ERROR"
1500        eoutdent
1501     fi
1502     eend $RC
1503   elif [ -z "$INSTALLED" ]; then
1504       einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1505       # some IBM notebooks require the following stuff:
1506       if [ -x /usr/bin/amixer ] ; then
1507          if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1508             amixer set Front unmute 1>/dev/null
1509             amixer set Front ${VOL}% 1>/dev/null
1510          fi
1511       fi
1512       # by default assume '0' as volume for microphone:
1513       if checkbootparam micvol ; then
1514          MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1515       else
1516          MICVOL=0
1517       fi
1518
1519       # finally set the volumes:
1520       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1521       if [ -n "$ERROR" ] ; then
1522          eindent
1523          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1524          eoutdent
1525       fi
1526       eend $RC
1527   fi
1528
1529 fi
1530 }
1531 # }}}
1532
1533 # {{{ modem detection
1534 config_modem(){
1535 if checkbootparam "nomodem"; then
1536   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1537 else
1538   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1539      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1540         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1541         eend 0
1542      fi
1543   fi
1544 fi
1545 }
1546 # }}}
1547
1548 # {{{ keyboard add-ons
1549 config_setkeycodes(){
1550 if checkbootparam "setkeycodes" ; then
1551  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1552   # MS MM keyboard add-on
1553   # fix
1554   setkeycodes e001 126 &>/dev/null
1555   setkeycodes e059 127 &>/dev/null
1556   # fn keys
1557   setkeycodes e03b 59 &>/dev/null
1558   setkeycodes e008 60 &>/dev/null
1559   setkeycodes e007 61 &>/dev/null
1560   setkeycodes e03e 62 &>/dev/null
1561   setkeycodes e03f 63 &>/dev/null
1562   setkeycodes e040 64 &>/dev/null
1563   setkeycodes e041 65 &>/dev/null
1564   setkeycodes e042 66 &>/dev/null
1565   setkeycodes e043 67 &>/dev/null
1566   setkeycodes e023 68 &>/dev/null
1567   setkeycodes e057 87 &>/dev/null
1568   setkeycodes e058 88 &>/dev/null
1569   # hp keycodes
1570   setkeycodes e00a 89 e008 90 &>/dev/null
1571  eend 0
1572 fi
1573 }
1574 # }}}
1575
1576 # {{{ wondershaper
1577 config_wondershaper(){
1578  if checkbootparam "wondershaper" ; then
1579     WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1580     CMD=wondershaper
1581     DEVICE=""
1582     DOWNSTREAM=""
1583     UPSTREAM=""
1584     if [ -n "$WONDER" ]; then
1585       # Extra options
1586       DEVICE="${WONDER%%,*}"
1587       R="${WONDER#*,}"
1588       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1589         WONDER="$R"
1590         DOWNSTREAM="${WONDER%%,*}"
1591         R="${WONDER#*,}"
1592         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1593           WONDER="$R"
1594           UPSTREAM="${WONDER%%,*}"
1595           R="${WONDER#*,}"
1596         fi
1597       fi
1598     fi
1599     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1600     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1601     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1602     einfo "Starting wondershaper (${CMD}) in background."
1603     ( sh -c $CMD & ) && eend 0
1604  fi
1605 }
1606 # }}}
1607
1608 # {{{ syslog-ng
1609 config_syslog(){
1610  if checkbootparam "nosyslog"; then
1611   ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1612  else
1613   einfo "Starting syslog-ng in background."
1614   /etc/init.d/syslog-ng start 1>>$DEBUG &
1615   eend 0
1616  fi
1617 }
1618 # }}}
1619
1620 # {{{ gpm
1621 config_gpm(){
1622  if checkbootparam "nogpm"; then
1623   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1624  else
1625   einfo "Starting gpm in background."
1626 #  /etc/init.d/gpm start 1>>$DEBUG &
1627   ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1628   eend 0
1629  fi
1630 }
1631 # }}}
1632
1633 # {{{ services
1634 config_services(){
1635  if checkbootparam "services" ; then
1636     SERVICE="$(getbootparam services 2>>$DEBUG)"
1637     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1638     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1639     einfo "Starting service(s) ${SERVICENL} in background."
1640     for service in $(echo -e $SERVICELIST) ; do
1641        /etc/init.d/${service} start 1>>$DEBUG &
1642     done
1643     [ "$?" == "0" ] ; eend $?
1644  fi
1645 }
1646 # }}}
1647
1648 # {{{ config files
1649 config_netconfig(){
1650  if checkbootparam netconfig ; then
1651   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1652   CONFIGFILE='/tmp/netconfig.grml'
1653
1654   getconfig() {
1655   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
1656        --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1657   }
1658   einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1659   counter=10
1660   while ! getconfig && [[ "$counter" != 0 ]] ; do
1661     echo -n "Sleeping for 5 seconds and trying to get config again... "
1662     counter=$(( counter-1 ))
1663     echo "$counter tries left" ; sleep 1
1664   done
1665   if [ -r "$CONFIGFILE" ] ; then
1666     einfo "Downloading was successfull." ; eend 0
1667     einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1668     md5sum $CONFIGFILE ; eend 0
1669     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1670   else
1671     einfo "Sorry, could not fetch $CONFIG" ; eend 1
1672   fi
1673  fi
1674 }
1675 # }}}
1676
1677 # {{{ blindsound
1678 config_blindsound(){
1679  if checkbootparam "blind" ; then
1680     beep
1681     flite -o play -t "welcome to the gremel system"
1682  fi
1683 }
1684 # }}}
1685
1686 # {{{ welcome sound
1687 config_welcome(){
1688  if checkbootparam welcome ; then
1689   flite -o play -t "welcome to the gremel system"
1690  fi
1691 }
1692 # }}}
1693
1694 # {{{ fix/workaround for unionfs
1695 fix_unionfs(){
1696   if [ -z "$INSTALLED" ]; then
1697    touch /var/cache/apt/*cache.bin
1698   fi
1699 }
1700 # }}}
1701
1702 # {{{ create all /mnt-directories
1703 create_mnt_dirs(){
1704   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1705   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1706 }
1707 # }}}
1708
1709 # {{{ start X window system via grml-x
1710 config_x_startup(){
1711 if checkbootparam startx ; then
1712  if [ -x /usr/X11R6/bin/X ] ; then
1713   if [ -z "$INSTALLED" ] ; then
1714    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1715    if [ -z "$WINDOWMANAGER" ] ; then
1716      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1717      WINDOWMANAGER="wm-ng"
1718    else
1719      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1720    fi
1721    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1722    config_userfstab || fstabuser='grml'
1723  cat>|/etc/init.d/xstartup<<EOF
1724 #!/bin/sh
1725 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1726 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1727 EOF
1728    chmod 755 /etc/init.d/xstartup
1729
1730    # adjust inittab for xstartup
1731    if grep -q '^6:' /etc/inittab ; then
1732       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1733    else # just append tty6 to inittab if no definition is present:
1734       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1735    fi
1736
1737    /sbin/telinit q ; eend $?
1738
1739    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1740       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1741    else
1742       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1743    fi
1744
1745   else
1746     eerror "We are not running from CD - startx will not work, skipping it.
1747      Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1748   fi
1749  else
1750    eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1751    Boot parameter startx does not work therefore." ; eend 1
1752  fi
1753 fi
1754 }
1755 # }}}
1756
1757 # {{{ configuration framework
1758 config_extract(){
1759 if checkbootparam extract ; then
1760  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1761  EXTRACTOPTIONS="-- -x $EXTRACT"
1762 fi
1763 }
1764
1765 config_automount(){
1766 if checkbootparam noautoconfig || checkbootparam forensic ; then
1767   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1768 else
1769  if [ -z "$INSTALLED" ] ; then
1770   einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1771   eindent
1772   [ -d /mnt/grml ] || mkdir /mnt/grml
1773   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1774 # We do need the following fix so floppy disk is available to blkid in any case :-/
1775   if [ -r /dev/fd0 ] ; then
1776      einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1777 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1778      if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1779         blkid /dev/fd0 1>>$DEBUG 2>&1
1780      fi
1781   fi
1782   DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1783   [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1784   if [[ $RC == 0 ]]; then
1785     einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1786
1787     CONFIG=''
1788     CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1789     if [ -n "$CONFIG" ]; then
1790       einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1791       cd /
1792       unp $CONFIG $EXTRACTOPTIONS ; eend $?
1793     else
1794       ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1795     fi
1796
1797     SCRIPT=''
1798     SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1799     if [ -n "$SCRIPT" ]; then
1800       einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1801       $SCRIPT ; eend $?
1802     fi
1803     grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1804   else
1805     ewarn "No devices with label GRMLCFG found." ; eend 0
1806   fi
1807   eoutdent
1808  fi
1809 fi
1810 }
1811
1812 config_myconfig(){
1813
1814 if checkbootparam "config" ; then
1815   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1816   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1817   einfo "Bootoption config found. config is set to: $CONFIG"
1818   eindent
1819     einfo "Trying to extract configuration file ${CONFIG}:"
1820     cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1821   eoutdent
1822 fi
1823
1824 if checkbootparam myconfig ; then
1825  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1826  if [ -n "$MOUNTDEVICE" ]; then
1827    if checkbootparam file ; then
1828     FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1829     [ -n "$FILENAME" ] || FILENAME='config.tbz'
1830    fi
1831    [ -d /mnt/grml ] || mkdir /mnt/grml
1832    umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1833    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1834     if [[ $RC == 0 ]]; then
1835       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1836       eindent
1837       CONFIG=''
1838       CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1839       if [ -n "$CONFIG" ]; then
1840         einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1841         cd /
1842         unp $CONFIG $EXTRACTOPTIONS ; eend $?
1843       else
1844         ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1845       fi
1846
1847       SCRIPT=''
1848       SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1849       if [ -n "$SCRIPT" ]; then
1850         einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1851         $SCRIPT ; eend $?
1852       fi
1853       eoutdent
1854     else
1855       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1856     fi # mount $MOUNTDEVICE
1857    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1858  else
1859    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1860  fi # [ -n "$MOUNTDEVICE" ]
1861 fi # checkbootparam myconfig
1862
1863 if checkbootparam "partconf" ; then
1864  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1865  if [ -n "$MOUNTDEVICE" ]; then
1866    [ -d /mnt/grml ] || mkdir /mnt/grml
1867    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1868     if [[ $RC == 0 ]]; then
1869       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1870       einfo "Copying files from $MOUNTDEVICE over grml system."
1871       for file in `cat /etc/grml/partconf` ; do
1872         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1873         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1874       done && eend 0
1875     else
1876       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1877     fi # mount $MOUNTDEVICE
1878    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1879  else
1880    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1881  fi # [ -n "$MOUNTDEVICE" ]
1882 fi
1883 }
1884 # }}}
1885
1886 # {{{ /cdrom/.*-options
1887 config_debs(){
1888 if checkbootparam "debs" ; then
1889   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1890   einfo "Tring to install debian package(s) ${DEBS}"
1891   dpkg -i /cdrom/debs/$DEBS* ; eend $?
1892 fi
1893 }
1894
1895 config_scripts(){
1896 if checkbootparam "scripts" ; then
1897   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1898   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1899   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1900   sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1901 fi
1902 }
1903 # }}}
1904
1905 # {{{ distcc
1906 config_distcc(){
1907 if checkbootparam "distcc" ; then
1908  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1909  if [ -n "$OPTIONS" ]; then
1910     NET=""
1911     INTERFACE=""
1912     if [ -n "$OPTIONS" ]; then
1913       NET="${OPTIONS%%,*}"
1914       R="${OPTIONS#*,}"
1915       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1916         OPTIONS="$R"
1917         INTERFACE="${OPTIONS%%,*}"
1918         R="${OPTIONS#*,}"
1919       fi
1920     fi
1921  fi
1922  CONFIG=/etc/default/distcc
1923  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1924  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1925
1926  if [ -n "$INTERFACE" ] ; then
1927    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1928
1929    counter=10
1930    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1931      counter=$(( counter-1 ))
1932      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1933      sleep 3
1934      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1935    done
1936  fi
1937
1938  if [ -n "$IP" ] ; then
1939    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1940
1941    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1942    eindent
1943     id distccd >/dev/null 2>&1 || \
1944     (
1945       einfo "Creating distcc user" ; \
1946       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1947     )
1948
1949     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1950    /etc/init.d/distcc start 1>/dev/null ; eend $?
1951    eoutdent
1952  else
1953    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1954  fi
1955 fi
1956
1957 if checkbootparam "gcc"; then
1958  GCC="$(getbootparam gcc 2>>$DEBUG)"
1959  eindent
1960  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1961  eoutdent
1962  rm -f /usr/bin/gcc
1963  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1964 fi
1965
1966 if checkbootparam "gpp"; then
1967  GPP="$(getbootparam gpp 2>>$DEBUG)"
1968  eindent
1969   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1970   if [ -x /usr/bin/g++-${GPP} ] ; then
1971      rm -f /usr/bin/g++
1972      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1973   fi
1974   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1975   if [ -x /usr/bin/cpp-${GPP} ] ; then
1976      rm -f /usr/bin/cpp
1977      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1978   fi
1979  eoutdent
1980 fi
1981
1982 }
1983 # }}}
1984
1985 # {{{ load modules
1986 # Notice: use it only on live-cd system, if running from harddisk please
1987 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1988 # in /etc/runlevel.conf
1989 config_modules(){
1990 MODULES_FILE=/etc/grml/modules
1991 if checkbootparam nomodules ; then
1992   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1993 elif [ -z "$INSTALLED" ]; then
1994  if [ -r $MODULES_FILE ] ; then
1995   einfo "Loading modules specified in ${MODULES_FILE}:"
1996   eindent
1997   grep '^[^#]' $MODULES_FILE | \
1998   while read module args; do
1999     [ "$module" ] || continue
2000       einfo "${module}"
2001       modprobe $module $args ; eend $?
2002   done
2003   eoutdent
2004  else
2005   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2006  fi
2007 fi
2008 }
2009 # }}}
2010
2011 # {{{ 915resolution
2012 config_915resolution(){
2013 if checkbootparam "915resolution" ; then
2014  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2015   if [ -x /usr/sbin/915resolution ]; then
2016     CMD=915resolution
2017     MODE=""
2018     XRESO=""
2019     YRESO=""
2020     if [ -n "$OPTIONS" ]; then
2021       # Extra options
2022       MODE="${OPTIONS%%,*}"
2023       R="${OPTIONS#*,}"
2024       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2025         OPTIONS="$R"
2026         XRESO="${OPTIONS%%,*}"
2027         R="${OPTIONS#*,}"
2028         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2029           OPTIONS="$R"
2030           YRESO="${OPTIONS%%,*}"
2031           R="${OPTIONS#*,}"
2032         fi
2033       fi
2034     fi
2035     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2036     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2037     eend 0
2038   fi
2039 fi
2040 }
2041 # }}}
2042
2043 # {{{ SW-RAID
2044 config_swraid(){
2045   if [ -z "$INSTALLED" ] ; then
2046   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2047   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2048      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2049      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2050   else
2051     if ! [ -x /sbin/mdadm ] ; then
2052        eerror "mdadm not available, can not execute it." ; eend 1
2053     else
2054
2055        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2056        # find out whether we have a valid configuration file already
2057        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2058           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2059           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2060           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2061         else
2062           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2063        fi
2064
2065        if ! checkbootparam 'swraid' ; then
2066           eindent
2067           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2068           eoutdent
2069        else
2070           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2071           eindent
2072            IFSOLD=${IFS:-}
2073            IFS='
2074 '
2075            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2076                case $line in
2077                  *'No arrays found'*)
2078                    ewarn "$line" ; eend 0
2079                    ;;
2080                  *)
2081                    einfo "$line" ; eend 0
2082                    ;;
2083                esac
2084            done
2085            IFS=$IFSOLD
2086          eoutdent
2087
2088          if [ -r /proc/mdstat ] ; then
2089             eindent
2090             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2091             if [ -z "$MDSTAT" ] ; then
2092                ewarn "No active arrays found" ; eend 0
2093             else
2094                IFSOLD=${IFS:-}
2095                IFS='
2096 '
2097                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2098                    einfo "active arrays: $line" ; eend 0
2099                done
2100                IFS=$IFSOLD
2101             fi
2102             eoutdent
2103          fi # /proc/mdstat
2104        fi # bootoption swraid
2105
2106      fi # is /sbin/mdadm executable?
2107   fi # check for bootoptions
2108   fi # run only in live-cd mode
2109 }
2110 # }}}
2111
2112 # {{{ LVM (Logical Volumes)
2113 config_lvm(){
2114   if [ -z "$INSTALLED" ] ; then
2115   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2116   if checkbootparam 'nolvm' ; then
2117      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2118   else
2119     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2120     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2121        eerror "LVM not available, can not execute it." ; eend 1
2122     else
2123        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2124           einfo "You seem to have logical volumes (LVM) on your system."
2125           eindent
2126           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2127           eend 0
2128           if checkbootparam 'lvm' ; then
2129              einfo "Bootoption LVM found. Searching for logical volumes:"
2130              /etc/init.d/lvm2 start ; eend $?
2131           fi
2132           eoutdent
2133        fi
2134     fi # check for lvm binary
2135   fi # check for bootoption nolvm
2136   fi # run only in live-cd mode
2137 }
2138 # }}}
2139
2140 # {{{ debnet: setup network based on an existing one found on a partition
2141 config_debnet(){
2142 if checkbootparam "debnet" ; then
2143  iszsh && setopt shwordsplit
2144  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2145  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2146  FOUND_DEBNET=""
2147
2148  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2149  eindent
2150  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2151     for i in $DEVICES; do
2152      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2153          einfo "Scanning on $i"
2154        if [ -f /mnt/etc/network/interfaces ]; then
2155          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2156          FOUND_DEBNET="$i"
2157          break
2158        fi
2159        umount /mnt
2160      fi
2161     done
2162
2163    if [ -n "$FOUND_DEBNET" ]; then
2164      einfo "Stopping network."
2165        pump -k 1>/dev/null 2>&1
2166        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2167      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2168        rm -rf /etc/network/run
2169        cp -a /mnt/etc/network /etc
2170        rm -rf /etc/network/run
2171        mkdir /etc/network/run
2172        umount /mnt ; eend $?
2173      einfo "Starting network."
2174        /etc/init.d/networking start ; eend $?
2175    else
2176      eerror "/etc/network/interfaces not found." ; eend 1
2177    fi
2178    eoutdent
2179  else
2180   eerror "Error: /mnt already mounted." ; eend 1
2181  fi
2182 fi
2183 }
2184 # }}}
2185
2186 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2187 config_ipw3945() {
2188   if grep -q ipw3945 /proc/modules ; then
2189      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2190         ewarn "Broken ipw3945 network interface found, reloading module."
2191         rmmod ipw3945
2192         modprobe ipw3945
2193         eend $?
2194      fi
2195   fi
2196 }
2197 # }}}
2198
2199 # {{{ disable console blanking
2200 config_blanking(){
2201 if checkbootparam "noblank" ; then
2202   einfo "Bootoption noblank found. Disabling monitor blanking."
2203   setterm -blank 0 ; eend $?
2204 fi
2205 }
2206 # }}}
2207
2208 # {{{ grml2hd: automatic installation
2209 config_grml2hd(){
2210
2211 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2212
2213 if checkbootparam "user" ; then
2214    NEWUSER=''
2215    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2216    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2217 fi
2218
2219 if checkbootparam "filesystem" ; then
2220    FILESYSTEM=''
2221    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2222    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2223 fi
2224
2225 if checkbootparam "partition" ; then
2226    PARTITION=''
2227    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2228    # notice: the following checks whether the given partition is available, if not the skip
2229    # execution of grml2hd as it might result in data loss...
2230    if [ -r $PARTITION ] ; then
2231       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2232    else
2233       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2234    fi
2235 fi
2236
2237 if checkbootparam "mbr" ; then
2238    BOOT_PARTITION=''
2239    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2240    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2241 fi
2242
2243 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2244 #!/bin/sh
2245 GRML2HD_NONINTERACTIVE='yes' grml2hd
2246 EOF
2247
2248 chmod 755 /usr/bin/grml2hd_noninteractive
2249 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2250 if [ -z "$GRML2HD_FAIL" ] ; then
2251    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2252 else
2253    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2254 fi
2255
2256 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2257 }
2258 # }}}
2259
2260 # {{{ debootstrap: automatic installation
2261 config_debootstrap(){
2262
2263 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2264
2265 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2266
2267 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2268    eindent
2269    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2270    eoutdent
2271    exit 1
2272 fi
2273
2274 if checkbootparam "target" ; then
2275   TARGET=''
2276   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2277   # notice: the following checks whether the given partition is available, if not the skip
2278   # execution of grml-debootstrap as it might result in data loss...
2279   if ! [ -r "$TARGET" ] ; then
2280      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2281   fi
2282 else
2283   eindent
2284   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2285   eoutdent
2286   exit 1
2287 fi
2288
2289 if checkbootparam "grub" ; then
2290   GRUB=''
2291   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2292 fi
2293
2294 if checkbootparam "groot" ; then
2295   GROOT=''
2296   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2297 fi
2298
2299 if checkbootparam "release" ; then
2300   RELEASE=''
2301   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2302 fi
2303
2304 if checkbootparam "mirror" ; then
2305   MIRROR=''
2306   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2307 fi
2308
2309 if checkbootparam "boot_append" ; then
2310   BOOT_APPEND=''
2311   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2312 fi
2313
2314 if checkbootparam "password" ; then
2315   PASSWORD=''
2316   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2317 fi
2318
2319 # now check which options are available
2320 if [ -n "TARGET" ] ; then
2321    TARGETCMD="--target $TARGET"
2322 else
2323    TARGETCMD=''
2324    eindent
2325    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2326    eoutdent
2327    exit 1
2328 fi
2329 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2330 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2331 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2332 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2333 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2334 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2335
2336 # and finally write script and execute it
2337 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2338 #!/bin/sh
2339 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2340 EOF
2341
2342 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2343
2344 screen /usr/bin/grml-debootstrap_noninteractive
2345 einfo "Invoking a shell, just exit to continue booting..."
2346 /bin/zsh
2347
2348 fi # stringinstring "BOOT_IMAGE=debian2hd
2349 }
2350 # }}}
2351
2352 # {{{ Support customization
2353 config_distri(){
2354 if checkbootparam "distri"; then
2355   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2356   if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2357      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2358      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2359      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2360      cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2361   fi
2362 fi
2363 }
2364 # }}}
2365
2366 ### {{{ backwards compatible stuff
2367 config_environment(){
2368   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2369 }
2370 config_keyboard(){
2371   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2372 }
2373 # }}}
2374
2375 ## END OF FILE #################################################################
2376 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3