dc446e4d62728612da2300a828ebbc763fbe6c2f
[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 11:46:04 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       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1513       if [ -n "$ERROR" ] ; then
1514          eindent
1515          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1516          eoutdent
1517       fi
1518       eend $RC
1519   fi
1520
1521 fi
1522 }
1523 # }}}
1524
1525 # {{{ modem detection
1526 config_modem(){
1527 if checkbootparam "nomodem"; then
1528   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1529 else
1530   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1531      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1532         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1533         eend 0
1534      fi
1535   fi
1536 fi
1537 }
1538 # }}}
1539
1540 # {{{ keyboard add-ons
1541 config_setkeycodes(){
1542 if checkbootparam "setkeycodes" ; then
1543  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1544   # MS MM keyboard add-on
1545   # fix
1546   setkeycodes e001 126 &>/dev/null
1547   setkeycodes e059 127 &>/dev/null
1548   # fn keys
1549   setkeycodes e03b 59 &>/dev/null
1550   setkeycodes e008 60 &>/dev/null
1551   setkeycodes e007 61 &>/dev/null
1552   setkeycodes e03e 62 &>/dev/null
1553   setkeycodes e03f 63 &>/dev/null
1554   setkeycodes e040 64 &>/dev/null
1555   setkeycodes e041 65 &>/dev/null
1556   setkeycodes e042 66 &>/dev/null
1557   setkeycodes e043 67 &>/dev/null
1558   setkeycodes e023 68 &>/dev/null
1559   setkeycodes e057 87 &>/dev/null
1560   setkeycodes e058 88 &>/dev/null
1561   # hp keycodes
1562   setkeycodes e00a 89 e008 90 &>/dev/null
1563  eend 0
1564 fi
1565 }
1566 # }}}
1567
1568 # {{{ wondershaper
1569 config_wondershaper(){
1570  if checkbootparam "wondershaper" ; then
1571     WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1572     CMD=wondershaper
1573     DEVICE=""
1574     DOWNSTREAM=""
1575     UPSTREAM=""
1576     if [ -n "$WONDER" ]; then
1577       # Extra options
1578       DEVICE="${WONDER%%,*}"
1579       R="${WONDER#*,}"
1580       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1581         WONDER="$R"
1582         DOWNSTREAM="${WONDER%%,*}"
1583         R="${WONDER#*,}"
1584         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1585           WONDER="$R"
1586           UPSTREAM="${WONDER%%,*}"
1587           R="${WONDER#*,}"
1588         fi
1589       fi
1590     fi
1591     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1592     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1593     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1594     einfo "Starting wondershaper (${CMD}) in background."
1595     ( sh -c $CMD & ) && eend 0
1596  fi
1597 }
1598 # }}}
1599
1600 # {{{ syslog-ng
1601 config_syslog(){
1602  if checkbootparam "nosyslog"; then
1603   ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1604  else
1605   einfo "Starting syslog-ng in background."
1606   /etc/init.d/syslog-ng start 1>>$DEBUG &
1607   eend 0
1608  fi
1609 }
1610 # }}}
1611
1612 # {{{ gpm
1613 config_gpm(){
1614  if checkbootparam "nogpm"; then
1615   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1616  else
1617   einfo "Starting gpm in background."
1618 #  /etc/init.d/gpm start 1>>$DEBUG &
1619   ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1620   eend 0
1621  fi
1622 }
1623 # }}}
1624
1625 # {{{ services
1626 config_services(){
1627  if checkbootparam "services" ; then
1628     SERVICE="$(getbootparam services 2>>$DEBUG)"
1629     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1630     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1631     einfo "Starting service(s) ${SERVICENL} in background."
1632     for service in $(echo -e $SERVICELIST) ; do
1633        /etc/init.d/${service} start 1>>$DEBUG &
1634     done
1635     [ "$?" == "0" ] ; eend $?
1636  fi
1637 }
1638 # }}}
1639
1640 # {{{ config files
1641 config_netconfig(){
1642  if checkbootparam netconfig ; then
1643   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1644   CONFIGFILE='/tmp/netconfig.grml'
1645
1646   getconfig() {
1647   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
1648        --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1649   }
1650   einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1651   counter=10
1652   while ! getconfig && [[ "$counter" != 0 ]] ; do
1653     echo -n "Sleeping for 5 seconds and trying to get config again... "
1654     counter=$(( counter-1 ))
1655     echo "$counter tries left" ; sleep 1
1656   done
1657   if [ -r "$CONFIGFILE" ] ; then
1658     einfo "Downloading was successfull." ; eend 0
1659     einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1660     md5sum $CONFIGFILE ; eend 0
1661     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1662   else
1663     einfo "Sorry, could not fetch $CONFIG" ; eend 1
1664   fi
1665  fi
1666 }
1667 # }}}
1668
1669 # {{{ blindsound
1670 config_blindsound(){
1671  if checkbootparam "blind" ; then
1672     beep
1673     flite -o play -t "welcome to the gremel system"
1674  fi
1675 }
1676 # }}}
1677
1678 # {{{ welcome sound
1679 config_welcome(){
1680  if checkbootparam welcome ; then
1681   flite -o play -t "welcome to the gremel system"
1682  fi
1683 }
1684 # }}}
1685
1686 # {{{ fix/workaround for unionfs
1687 fix_unionfs(){
1688   if [ -z "$INSTALLED" ]; then
1689    touch /var/cache/apt/*cache.bin
1690   fi
1691 }
1692 # }}}
1693
1694 # {{{ create all /mnt-directories
1695 create_mnt_dirs(){
1696   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1697   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1698 }
1699 # }}}
1700
1701 # {{{ start X window system via grml-x
1702 config_x_startup(){
1703 if checkbootparam startx ; then
1704  if [ -x /usr/X11R6/bin/X ] ; then
1705   if [ -z "$INSTALLED" ] ; then
1706    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1707    if [ -z "$WINDOWMANAGER" ] ; then
1708      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1709      WINDOWMANAGER="wm-ng"
1710    else
1711      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1712    fi
1713    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1714    config_userfstab || fstabuser='grml'
1715  cat>|/etc/init.d/xstartup<<EOF
1716 #!/bin/sh
1717 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1718 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1719 EOF
1720    chmod 755 /etc/init.d/xstartup
1721
1722    # adjust inittab for xstartup
1723    if grep -q '^6:' /etc/inittab ; then
1724       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1725    else # just append tty6 to inittab if no definition is present:
1726       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1727    fi
1728
1729    /sbin/telinit q ; eend $?
1730
1731    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1732       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1733    else
1734       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1735    fi
1736
1737   else
1738     eerror "We are not running from CD - startx will not work, skipping it.
1739      Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1740   fi
1741  else
1742    eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1743    Boot parameter startx does not work therefore." ; eend 1
1744  fi
1745 fi
1746 }
1747 # }}}
1748
1749 # {{{ configuration framework
1750 config_extract(){
1751 if checkbootparam extract ; then
1752  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1753  EXTRACTOPTIONS="-- -x $EXTRACT"
1754 fi
1755 }
1756
1757 config_automount(){
1758 if checkbootparam noautoconfig || checkbootparam forensic ; then
1759   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1760 else
1761  if [ -z "$INSTALLED" ] ; then
1762   einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1763   eindent
1764   [ -d /mnt/grml ] || mkdir /mnt/grml
1765   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1766 # We do need the following fix so floppy disk is available to blkid in any case :-/
1767   if [ -r /dev/fd0 ] ; then
1768      einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1769 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1770      if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1771         blkid /dev/fd0 1>>$DEBUG 2>&1
1772      fi
1773   fi
1774   DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1775   [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1776   if [[ $RC == 0 ]]; then
1777     einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1778
1779     CONFIG=''
1780     CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1781     if [ -n "$CONFIG" ]; then
1782       einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1783       cd /
1784       unp $CONFIG $EXTRACTOPTIONS ; eend $?
1785     else
1786       ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1787     fi
1788
1789     SCRIPT=''
1790     SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1791     if [ -n "$SCRIPT" ]; then
1792       einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1793       $SCRIPT ; eend $?
1794     fi
1795     grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1796   else
1797     ewarn "No devices with label GRMLCFG found." ; eend 0
1798   fi
1799   eoutdent
1800  fi
1801 fi
1802 }
1803
1804 config_myconfig(){
1805
1806 if checkbootparam "config" ; then
1807   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1808   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1809   einfo "Bootoption config found. config is set to: $CONFIG"
1810   eindent
1811     einfo "Trying to extract configuration file ${CONFIG}:"
1812     cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1813   eoutdent
1814 fi
1815
1816 if checkbootparam myconfig ; then
1817  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1818  if [ -n "$MOUNTDEVICE" ]; then
1819    if checkbootparam file ; then
1820     FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1821     [ -n "$FILENAME" ] || FILENAME='config.tbz'
1822    fi
1823    [ -d /mnt/grml ] || mkdir /mnt/grml
1824    umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1825    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1826     if [[ $RC == 0 ]]; then
1827       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1828       eindent
1829       CONFIG=''
1830       CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1831       if [ -n "$CONFIG" ]; then
1832         einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1833         cd /
1834         unp $CONFIG $EXTRACTOPTIONS ; eend $?
1835       else
1836         ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1837       fi
1838
1839       SCRIPT=''
1840       SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1841       if [ -n "$SCRIPT" ]; then
1842         einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1843         $SCRIPT ; eend $?
1844       fi
1845       eoutdent
1846     else
1847       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1848     fi # mount $MOUNTDEVICE
1849    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1850  else
1851    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1852  fi # [ -n "$MOUNTDEVICE" ]
1853 fi # checkbootparam myconfig
1854
1855 if checkbootparam "partconf" ; then
1856  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1857  if [ -n "$MOUNTDEVICE" ]; then
1858    [ -d /mnt/grml ] || mkdir /mnt/grml
1859    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1860     if [[ $RC == 0 ]]; then
1861       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1862       einfo "Copying files from $MOUNTDEVICE over grml system."
1863       for file in `cat /etc/grml/partconf` ; do
1864         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1865         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1866       done && eend 0
1867     else
1868       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1869     fi # mount $MOUNTDEVICE
1870    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1871  else
1872    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1873  fi # [ -n "$MOUNTDEVICE" ]
1874 fi
1875 }
1876 # }}}
1877
1878 # {{{ /cdrom/.*-options
1879 config_debs(){
1880 if checkbootparam "debs" ; then
1881   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1882   einfo "Tring to install debian package(s) ${DEBS}"
1883   dpkg -i /cdrom/debs/$DEBS* ; eend $?
1884 fi
1885 }
1886
1887 config_scripts(){
1888 if checkbootparam "scripts" ; then
1889   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1890   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1891   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1892   sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1893 fi
1894 }
1895 # }}}
1896
1897 # {{{ distcc
1898 config_distcc(){
1899 if checkbootparam "distcc" ; then
1900  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1901  if [ -n "$OPTIONS" ]; then
1902     NET=""
1903     INTERFACE=""
1904     if [ -n "$OPTIONS" ]; then
1905       NET="${OPTIONS%%,*}"
1906       R="${OPTIONS#*,}"
1907       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1908         OPTIONS="$R"
1909         INTERFACE="${OPTIONS%%,*}"
1910         R="${OPTIONS#*,}"
1911       fi
1912     fi
1913  fi
1914  CONFIG=/etc/default/distcc
1915  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1916  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1917
1918  if [ -n "$INTERFACE" ] ; then
1919    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1920
1921    counter=10
1922    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1923      counter=$(( counter-1 ))
1924      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1925      sleep 3
1926      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1927    done
1928  fi
1929
1930  if [ -n "$IP" ] ; then
1931    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1932
1933    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1934    eindent
1935     id distccd >/dev/null 2>&1 || \
1936     (
1937       einfo "Creating distcc user" ; \
1938       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1939     )
1940
1941     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1942    /etc/init.d/distcc start 1>/dev/null ; eend $?
1943    eoutdent
1944  else
1945    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1946  fi
1947 fi
1948
1949 if checkbootparam "gcc"; then
1950  GCC="$(getbootparam gcc 2>>$DEBUG)"
1951  eindent
1952  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1953  eoutdent
1954  rm -f /usr/bin/gcc
1955  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1956 fi
1957
1958 if checkbootparam "gpp"; then
1959  GPP="$(getbootparam gpp 2>>$DEBUG)"
1960  eindent
1961   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1962   if [ -x /usr/bin/g++-${GPP} ] ; then
1963      rm -f /usr/bin/g++
1964      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1965   fi
1966   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1967   if [ -x /usr/bin/cpp-${GPP} ] ; then
1968      rm -f /usr/bin/cpp
1969      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1970   fi
1971  eoutdent
1972 fi
1973
1974 }
1975 # }}}
1976
1977 # {{{ load modules
1978 # Notice: use it only on live-cd system, if running from harddisk please
1979 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1980 # in /etc/runlevel.conf
1981 config_modules(){
1982 MODULES_FILE=/etc/grml/modules
1983 if checkbootparam nomodules ; then
1984   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1985 elif [ -z "$INSTALLED" ]; then
1986  if [ -r $MODULES_FILE ] ; then
1987   einfo "Loading modules specified in ${MODULES_FILE}:"
1988   eindent
1989   grep '^[^#]' $MODULES_FILE | \
1990   while read module args; do
1991     [ "$module" ] || continue
1992       einfo "${module}"
1993       modprobe $module $args ; eend $?
1994   done
1995   eoutdent
1996  else
1997   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1998  fi
1999 fi
2000 }
2001 # }}}
2002
2003 # {{{ 915resolution
2004 config_915resolution(){
2005 if checkbootparam "915resolution" ; then
2006  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2007   if [ -x /usr/sbin/915resolution ]; then
2008     CMD=915resolution
2009     MODE=""
2010     XRESO=""
2011     YRESO=""
2012     if [ -n "$OPTIONS" ]; then
2013       # Extra options
2014       MODE="${OPTIONS%%,*}"
2015       R="${OPTIONS#*,}"
2016       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2017         OPTIONS="$R"
2018         XRESO="${OPTIONS%%,*}"
2019         R="${OPTIONS#*,}"
2020         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2021           OPTIONS="$R"
2022           YRESO="${OPTIONS%%,*}"
2023           R="${OPTIONS#*,}"
2024         fi
2025       fi
2026     fi
2027     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2028     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2029     eend 0
2030   fi
2031 fi
2032 }
2033 # }}}
2034
2035 # {{{ SW-RAID
2036 config_swraid(){
2037   if [ -z "$INSTALLED" ] ; then
2038   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2039   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2040      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2041      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2042   else
2043     if ! [ -x /sbin/mdadm ] ; then
2044        eerror "mdadm not available, can not execute it." ; eend 1
2045     else
2046
2047        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2048        # find out whether we have a valid configuration file already
2049        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2050           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2051           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2052           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2053         else
2054           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2055        fi
2056
2057        if ! checkbootparam 'swraid' ; then
2058           eindent
2059           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2060           eoutdent
2061        else
2062           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2063           eindent
2064            IFSOLD=${IFS:-}
2065            IFS='
2066 '
2067            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2068                case $line in
2069                  *'No arrays found'*)
2070                    ewarn "$line" ; eend 0
2071                    ;;
2072                  *)
2073                    einfo "$line" ; eend 0
2074                    ;;
2075                esac
2076            done
2077            IFS=$IFSOLD
2078          eoutdent
2079
2080          if [ -r /proc/mdstat ] ; then
2081             eindent
2082             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2083             if [ -z "$MDSTAT" ] ; then
2084                ewarn "No active arrays found" ; eend 0
2085             else
2086                IFSOLD=${IFS:-}
2087                IFS='
2088 '
2089                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2090                    einfo "active arrays: $line" ; eend 0
2091                done
2092                IFS=$IFSOLD
2093             fi
2094             eoutdent
2095          fi # /proc/mdstat
2096        fi # bootoption swraid
2097
2098      fi # is /sbin/mdadm executable?
2099   fi # check for bootoptions
2100   fi # run only in live-cd mode
2101 }
2102 # }}}
2103
2104 # {{{ LVM (Logical Volumes)
2105 config_lvm(){
2106   if [ -z "$INSTALLED" ] ; then
2107   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2108   if checkbootparam 'nolvm' ; then
2109      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2110   else
2111     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2112     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2113        eerror "LVM not available, can not execute it." ; eend 1
2114     else
2115        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2116           einfo "You seem to have logical volumes (LVM) on your system."
2117           eindent
2118           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2119           eend 0
2120           if checkbootparam 'lvm' ; then
2121              einfo "Bootoption LVM found. Searching for logical volumes:"
2122              /etc/init.d/lvm2 start ; eend $?
2123           fi
2124           eoutdent
2125        fi
2126     fi # check for lvm binary
2127   fi # check for bootoption nolvm
2128   fi # run only in live-cd mode
2129 }
2130 # }}}
2131
2132 # {{{ debnet: setup network based on an existing one found on a partition
2133 config_debnet(){
2134 if checkbootparam "debnet" ; then
2135  iszsh && setopt shwordsplit
2136  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2137  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2138  FOUND_DEBNET=""
2139
2140  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2141  eindent
2142  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2143     for i in $DEVICES; do
2144      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2145          einfo "Scanning on $i"
2146        if [ -f /mnt/etc/network/interfaces ]; then
2147          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2148          FOUND_DEBNET="$i"
2149          break
2150        fi
2151        umount /mnt
2152      fi
2153     done
2154
2155    if [ -n "$FOUND_DEBNET" ]; then
2156      einfo "Stopping network."
2157        pump -k 1>/dev/null 2>&1
2158        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2159      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2160        rm -rf /etc/network/run
2161        cp -a /mnt/etc/network /etc
2162        rm -rf /etc/network/run
2163        mkdir /etc/network/run
2164        umount /mnt ; eend $?
2165      einfo "Starting network."
2166        /etc/init.d/networking start ; eend $?
2167    else
2168      eerror "/etc/network/interfaces not found." ; eend 1
2169    fi
2170    eoutdent
2171  else
2172   eerror "Error: /mnt already mounted." ; eend 1
2173  fi
2174 fi
2175 }
2176 # }}}
2177
2178 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2179 config_ipw3945() {
2180   if grep -q ipw3945 /proc/modules ; then
2181      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2182         ewarn "Broken ipw3945 network interface found, reloading module."
2183         rmmod ipw3945
2184         modprobe ipw3945
2185         eend $?
2186      fi
2187   fi
2188 }
2189 # }}}
2190
2191 # {{{ disable console blanking
2192 config_blanking(){
2193 if checkbootparam "noblank" ; then
2194   einfo "Bootoption noblank found. Disabling monitor blanking."
2195   setterm -blank 0 ; eend $?
2196 fi
2197 }
2198 # }}}
2199
2200 # {{{ grml2hd: automatic installation
2201 config_grml2hd(){
2202
2203 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2204
2205 if checkbootparam "user" ; then
2206    NEWUSER=''
2207    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2208    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2209 fi
2210
2211 if checkbootparam "filesystem" ; then
2212    FILESYSTEM=''
2213    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2214    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2215 fi
2216
2217 if checkbootparam "partition" ; then
2218    PARTITION=''
2219    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2220    # notice: the following checks whether the given partition is available, if not the skip
2221    # execution of grml2hd as it might result in data loss...
2222    if [ -r $PARTITION ] ; then
2223       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2224    else
2225       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2226    fi
2227 fi
2228
2229 if checkbootparam "mbr" ; then
2230    BOOT_PARTITION=''
2231    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2232    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2233 fi
2234
2235 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2236 #!/bin/sh
2237 GRML2HD_NONINTERACTIVE='yes' grml2hd
2238 EOF
2239
2240 chmod 755 /usr/bin/grml2hd_noninteractive
2241 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2242 if [ -z "$GRML2HD_FAIL" ] ; then
2243    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2244 else
2245    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2246 fi
2247
2248 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2249 }
2250 # }}}
2251
2252 # {{{ debootstrap: automatic installation
2253 config_debootstrap(){
2254
2255 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2256
2257 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2258
2259 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2260    eindent
2261    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2262    eoutdent
2263    exit 1
2264 fi
2265
2266 if checkbootparam "target" ; then
2267   TARGET=''
2268   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2269   # notice: the following checks whether the given partition is available, if not the skip
2270   # execution of grml-debootstrap as it might result in data loss...
2271   if ! [ -r "$TARGET" ] ; then
2272      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2273   fi
2274 else
2275   eindent
2276   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2277   eoutdent
2278   exit 1
2279 fi
2280
2281 if checkbootparam "grub" ; then
2282   GRUB=''
2283   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2284 fi
2285
2286 if checkbootparam "groot" ; then
2287   GROOT=''
2288   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2289 fi
2290
2291 if checkbootparam "release" ; then
2292   RELEASE=''
2293   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2294 fi
2295
2296 if checkbootparam "mirror" ; then
2297   MIRROR=''
2298   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2299 fi
2300
2301 if checkbootparam "boot_append" ; then
2302   BOOT_APPEND=''
2303   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2304 fi
2305
2306 if checkbootparam "password" ; then
2307   PASSWORD=''
2308   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2309 fi
2310
2311 # now check which options are available
2312 if [ -n "TARGET" ] ; then
2313    TARGETCMD="--target $TARGET"
2314 else
2315    TARGETCMD=''
2316    eindent
2317    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2318    eoutdent
2319    exit 1
2320 fi
2321 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2322 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2323 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2324 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2325 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2326 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2327
2328 # and finally write script and execute it
2329 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2330 #!/bin/sh
2331 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2332 EOF
2333
2334 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2335
2336 screen /usr/bin/grml-debootstrap_noninteractive
2337 einfo "Invoking a shell, just exit to continue booting..."
2338 /bin/zsh
2339
2340 fi # stringinstring "BOOT_IMAGE=debian2hd
2341 }
2342 # }}}
2343
2344 # {{{ Support customization
2345 config_distri(){
2346 if checkbootparam "distri"; then
2347   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2348   if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2349      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2350      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2351      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2352      cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2353   fi
2354 fi
2355 }
2356 # }}}
2357
2358 ### {{{ backwards compatible stuff
2359 config_environment(){
2360   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2361 }
2362 config_keyboard(){
2363   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2364 }
2365 # }}}
2366
2367 ## END OF FILE #################################################################
2368 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3