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