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