Wrap flite calls through a wrapper function.
[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 /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 /proc/modules ; then
844          einfo "Kernel supports speakup." ; eend 0
845          eindent
846          if [ -x /etc/init.d/speech-dispatcher ] ; then
847             einfo "Starting speech-dispatcher."
848             /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
849             einfo "Activating sftsyn in Kernel."
850             echo sftsyn >/proc/speakup/synth_name ; eend $?
851             einfo "Just run swspeak if you want to use software synthesizer via speakup."
852             flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
853          else
854             eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
855             flitewrapper "speech-dispatcher not available. speakup will not work without it."
856          fi
857          eoutdent
858       else
859          eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
860          flitewrapper "Kernel does not seem to support speakup. Sorry."
861       fi
862    fi
863 }
864 # }}}
865
866 # {{{ support hardware synthesizer via speakup
867 config_hwspeak(){
868    if checkbootparam hwspeak ; then
869       einfo "Bootoption hwspeak found."
870
871       if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
872          ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
873          eindent
874          for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
875                          sed 's#.*speakup/##g ; s#.ko$##g' | \
876                          grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
877             einfo "Trying to load $module"
878             modprobe $module
879             eend $?
880          done
881          eoutdent
882       fi
883
884       if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
885          einfo "Kernel should support speakup now." ; eend 0
886          flitewrapper "Kernel should support speakup now."
887       else
888          eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
889          flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
890       fi
891    fi
892 }
893 # }}}
894
895 # {{{ Check for blind option or brltty
896 config_blind(){
897 BLIND=""
898 checkbootparam "blind" && BLIND="yes"
899 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
900
901 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
902   if [ -x /sbin/brltty ]; then
903     # Blind option detected, start brltty now.
904     # modprobe serial_core parport_serial generic_serial && echo "done"
905     CMD=brltty
906     BRLTYPE=""
907     BRLDEV=""
908     BRLTEXT=""
909     if [ -n "$BRLTTY" ]; then
910       # Extra options
911       BRLTYPE="${BRLTTY%%,*}"
912       R="${BRLTTY#*,}"
913       if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
914         BRLTTY="$R"
915         BRLDEV="${BRLTTY%%,*}"
916         R="${BRLTTY#*,}"
917         if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
918           BRLTTY="$R"
919           BRLTEXT="${BRLTTY%%,*}"
920           R="${BRLTTY#*,}"
921         fi
922       fi
923     fi
924     [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
925     [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
926     [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
927     einfo "Starting braille-display manager."
928 #    ( exec $CMD & )
929     ( sh -c "$CMD" & )
930     sleep 2 && BLINDSOUND="yes"
931     eend 0
932   fi
933 fi
934 }
935 # }}}
936
937 # {{{ Interactive configuration
938 config_interactive(){
939   ewarn "config_interactive is deprecated nowadays."
940   ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
941 }
942 # }}}
943
944 # {{{ AGP
945 config_agp(){
946 if checkbootparam forceagp ; then
947 # Probe for AGP. Hope this can fail safely
948   stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
949 fi
950 }
951 # }}}
952
953 # {{{ automount(er)
954 config_automounter(){
955 if checkbootparam automounter ; then
956   RUNLEVEL="$(runlevel)"
957   AUTOMOUNTER=""
958   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
959
960 addautomount(){
961 # /dev/ice  options
962   d="${1##*/}"
963   if [ -n "$AUTOMOUNTER" ]; then
964     [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
965     [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
966     [ -L "/mnt/$d" ]      || ln -s "/mnt/auto/$d" "/mnt/$d"
967     anew="$d        -fstype=auto,$2 :$i"
968     stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
969     AUTOMOUNTS="$AUTOMOUNTS $d"
970     new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
971   else
972     [ -d /mnt/$d ] && mkdir -p /mnt/$d
973     new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
974   fi
975   stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
976 }
977
978   AUTOMOUNTS="floppy cdrom"
979 # Add new devices to /etc/fstab and /etc/auto.mnt
980   for i in /dev/cdrom?*; do
981     if [ -L $i ]; then
982       addautomount "$i" "ro"
983     fi
984   done
985 fi
986
987 if [ -n "$AUTOMOUNTER" ]; then
988 # Check for floppy dir, reinstall with automounter
989   [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
990   [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
991   [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
992   [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
993   [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
994   [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
995   rm -f /etc/fstab.new
996 # Replace paths from bootfloppy
997   sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
998   mv -f /etc/fstab.new /etc/fstab
999 # Start automounter now
1000   einfo "Starting automounter for ${AUTOMOUNTS}."
1001   /etc/init.d/autofs start >>$DEBUG ; eend $?
1002 fi
1003 }
1004 # }}}
1005
1006 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1007 check_partitions(){
1008 partitions=""
1009 IDEDISKS=""
1010 while read major minor blocks partition relax; do
1011   partition="${partition##*/}"
1012   [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1013   case "$partition" in
1014     hd?) IDEDISKS="$IDEDISKS $partition";;                # IDE  Harddisk, entire disk
1015     sd?) ;;                                               # SCSI Harddisk, entire disk
1016 #    [hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
1017     [hs]d*|ub*) partitions="$partitions /dev/$partition";;    # IDE, USB or SCSI disk partition
1018   esac
1019 done <<EOT
1020 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1021 EOT
1022 }
1023 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1024 # }}}
1025
1026 # {{{ Enable DMA for all IDE drives now if not disabled
1027 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1028 config_dma(){
1029 if checkbootparam "nodma"; then
1030   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1031 else
1032   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1033     if test -d /proc/ide/$d; then
1034       if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1035         MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1036         test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1037         einfo "Enabling DMA acceleration for: ${WHITE}$d        ${YELLOW}[${MODEL}]${NORMAL}"
1038         echo "using_dma:1" >/proc/ide/$d/settings
1039         eend 0
1040       fi
1041     fi
1042   done
1043 fi
1044 }
1045 # }}}
1046
1047 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1048 config_fstab(){
1049
1050 NOSWAP="yes" # we do not use swap by default!
1051 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1052    NOSWAP=''
1053    checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1054 fi
1055
1056 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1057   ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1058 else
1059   einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1060   iszsh && setopt nonomatch
1061   if [ -x /usr/sbin/rebuildfstab ] ; then
1062      config_userfstab || fstabuser=grml
1063      /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1064   else
1065      ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1066   fi
1067 fi # checkbootparam nofstab/forensic
1068
1069 # Scan for swap, config, homedir - but only in live-mode
1070 if [ -z "$INSTALLED" ] ; then
1071    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1072    GRML_IMG=""
1073    GRML_SWP=""
1074    HOMEDIR="$(getbootparam home)"
1075    if [ -n "$partitions" ]; then
1076       while read p m f relax; do
1077         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1078         partoptions="users,exec"
1079         fnew=""
1080         # it's a swap partition?
1081         case "$f" in swap)
1082           eindent
1083           if [ -n "$NOSWAP" ]; then
1084              ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1085              eend 0
1086           else
1087              case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1088                    S1SUSP|S2SUSP|pmdisk|[zZ]*)
1089                      if [ -n "$ANYSWAP" ] ; then
1090                         einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1091                         swapon $p 2>>$DEBUG ; eend $?
1092                      else
1093                         ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1094                      fi
1095                      ;;
1096                    *)
1097                      if [[ "$p" == LABEL* ]] ; then
1098                         p=$(blkid -t $p | awk -F: '{print $1}')
1099                      fi
1100                      if grep -q $p /proc/swaps ; then
1101                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1102                      else
1103                         if [ -b "$p" ] ; then
1104                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1105                         swapon $p 2>>$DEBUG ; eend $?
1106                         else
1107                         ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1108                         fi
1109                      fi
1110                      ;;
1111              esac # dd-check
1112           fi # -n "$NOSWAP
1113           eoutdent
1114           continue
1115           ;;
1116         esac # it's a swap partition?
1117
1118         # mount read-only
1119         MOUNTOPTS="ro"
1120         case "$f" in
1121           vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1122           ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1123           *) continue ;;
1124           # *) NONEFOUND='1'; continue ;;
1125         esac
1126
1127         # use a swapfile
1128         if [ -z "$NOSWAP" ] ; then
1129            mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1130            # Activate swapfile, if exists
1131            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1132         fi
1133         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1134            mount -o remount,rw $m && MOUNTED=1
1135            if swapon "$SWAPFILE" 2>>$DEBUG ; then
1136               eindent
1137                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1138               eoutdent
1139               fnew="$SWAPFILE swap swap defaults 0 0"
1140               stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1141               GRML_SWP="$GRML_SWP $SWAPFILE"
1142               eend 0
1143            fi
1144            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1145         fi
1146
1147         # use a image as home
1148         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1149         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1150            if [ -n "$HOMEDIR" ]; then
1151               if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1152                  continue
1153               fi
1154            fi
1155            if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1156               GRML_IMG="$IMAGE"
1157               mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1158            fi
1159         fi
1160         eend 0
1161
1162         # Umount, if not in use
1163         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1164
1165       done <<EOT
1166       $(cat /etc/fstab)
1167 EOT
1168    fi # -n $partitions
1169 fi # -z $INSTALLED
1170 }
1171 # }}}
1172
1173 # {{{ Mouse
1174 config_mouse(){
1175 if [ -n "$MOUSE_DEVICE" ] ; then
1176   einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1177 fi
1178 }
1179 # }}}
1180
1181 # {{{ IPv6 configuration
1182 # Load IPv6 kernel module and print IP adresses
1183 config_ipv6(){
1184 if checkbootparam "ipv6"; then
1185   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1186   modprobe ipv6
1187   # we probably need some time until stateless autoconfiguration has happened
1188   sleep 2
1189   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1190   for DEVICE in `echo "$NETDEVICES"`; do
1191     eindent
1192       einfo "$DEVICE:"
1193       ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1194       COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1195       eindent
1196         for ADDR in `echo "$ADDRESSES"` ; do
1197             einfo "$ADDR"
1198         done
1199         if [ "$COUNT" -eq "0" ] ; then
1200            einfo "(none)" ; eend 1
1201         fi
1202       eoutdent
1203     eoutdent
1204   done
1205   eend 0
1206 fi
1207 }
1208 # }}}
1209
1210 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1211 config_dhcp(){
1212 if checkbootparam "nodhcp"; then
1213   ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1214 else
1215   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1216   rm -rf /etc/network/status ; mkdir -p /etc/network/status
1217   for DEVICE in `echo "$NETDEVICES"` ; do
1218     einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1219     trap 2 3 11
1220     ifconfig $DEVICE up >>$DEBUG 2>&1
1221     ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1222     trap "" 2 3 11
1223     sleep 1
1224     eend 0
1225   done
1226   if [ -n "$INSTALLED" ] ; then
1227      ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1228      eend 0
1229   fi
1230 fi
1231 }
1232 # }}}
1233
1234 # {{{ helper functions
1235 findfile(){
1236 FOUND=""
1237 # search all partitions for a file in the root directory
1238 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1239 # See if it's already mounted
1240   [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
1241   if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1242     [ -f "$i/$1" ] && FOUND="$i/$1"
1243     umount -l "$i" 2>>$DEBUG
1244     [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1245   fi
1246 done
1247 return 2
1248 }
1249
1250 fstype(){
1251 case "$(file -s $1)" in
1252   *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1253   *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
1254   *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
1255   *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1256   *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1257   *data*)          echo "invalid"; return 0;;
1258   *) echo "auto"; return 0;;
1259 esac
1260 }
1261
1262 # Try to mount this filesystem read-only, without or with encryption
1263 trymount(){
1264 # Check if already mounted
1265 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1266 # Apparently, mount-aes DOES autodetect AES loopback files.
1267 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1268 # We need to mount crypto-loop files with initial rw support
1269 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1270 # Mount succeeded?
1271 [ "$RC" = "0" ] && return 0
1272 echo ""
1273 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1274 a="y"
1275 while [ "$a" != "n" -a "$a" != "N" ]; do
1276 # We need to mount crypto-loop files with initial rw support
1277  mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1278  echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1279  # Problem with ioctl() from getpasswd()?
1280  # read a
1281  read a
1282 done
1283 return 1
1284 }
1285 # }}}
1286
1287 # {{{ CPU-detection
1288 config_cpu(){
1289 if checkbootparam "nocpu"; then
1290   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1291 else
1292   # check module dependencies
1293   cpufreq_check() {
1294    if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1295       if [ -e /lib64 ] ; then
1296          [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1297       else
1298          [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1299       fi
1300    fi
1301   }
1302
1303   if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1304      einfo "Detecting CPU:"
1305      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)
1306      echo $CPU | sed 's/ \{1,\}/ /g'
1307      eend 0
1308   else
1309      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
1310   fi
1311
1312   # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1313   # * it only if we have the according kernel modules available
1314   # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1315   # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1316   #   -> parse output of the initscript and output it according to our look'n'feel
1317   # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1318   if ! cpufreq_check ; then
1319     ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1320   else
1321     if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1322        # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1323        if [ -r /proc/acpi/battery/BAT0/info ] ; then
1324           if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
1325              einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1326              return 0
1327           fi
1328        fi
1329        einfo "Detected Laptop - trying to use cpu frequency scaling:"
1330        eindent
1331        if [ -x /etc/init.d/loadcpufreq ] ; then
1332           SKIP_CPU_GOVERNOR=''
1333           LOADCPUFREQ=$(mktemp)
1334           /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1335           if grep -q FATAL "$LOADCPUFREQ" ; then
1336              eindent
1337                SKIP_CPU_GOVERNOR=1
1338                oldIFS="$IFS"
1339                IFS="
1340 "
1341                 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1342                     eerror "$line" ; eend $RC
1343                 done
1344                 IFS="$oldIFS"
1345              eoutdent
1346            elif grep -q done "$LOADCPUFREQ" ; then
1347              MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1348              if [ -n "$MODULE" -a "$MODULE" != none ]; then
1349                 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1350              else
1351                 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1352              fi
1353           fi
1354           rm -f $LOADCPUFREQ
1355        elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1356           . /usr/bin/cpufreq-detect.sh
1357           if [ -n "$MODULE" -a "$MODULE" != none ]; then
1358              einfo "Loading modules ${MODULE}"
1359              modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1360              RC=$?
1361              if [[ $RC == 0 ]]; then
1362                 eend 0
1363              else
1364                 SKIP_CPU_GOVERNOR=1
1365                 eend $1
1366              fi
1367           else
1368              ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1369           fi # $MODULE
1370        fi # loadcpufreq
1371
1372        if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1373           einfo "Loading cpufreq_ondemand, setting ondemand governor"
1374           if modprobe cpufreq_ondemand ; RC=$? ; then
1375              for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1376                  echo ondemand > $file
1377              done
1378           fi
1379           eend $RC
1380        fi # cpu-governor
1381
1382        eoutdent
1383
1384     fi # laptop-detect
1385   fi # cpufreq_check
1386 fi # checkbootparam nocpu
1387 }
1388 # }}}
1389
1390 # {{{ autostart of ssh
1391 config_ssh(){
1392 if checkbootparam ssh ; then
1393    SSH_PASSWD=''
1394    SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1395    einfo "Bootoption ssh found, trying to set password for user grml."
1396    eindent
1397    if [ -z "$SSH_PASSWD" ] ; then
1398       if [ -x /usr/bin/apg ] ; then
1399          SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1400       elif [ -x /usr/bin/gpw ] ; then
1401          SSH_PASSWD="$(gpw 1)"
1402       elif [ -x /usr/bin/pwgen ] ; then
1403          SSH_PASSWD="$(pwgen -1 8)"
1404       elif [ -x /usr/bin/hexdump ] ; then
1405          SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1406       elif [ -n "$RANDOM" ] ; then
1407          SSH_PASSWD="grml${RANDOM}"
1408       else
1409          SSH_PASSWD=''
1410          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1411          eend 1
1412       fi
1413
1414       if [ -n "$SSH_PASSWD" ] ; then
1415          ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1416       fi
1417    fi
1418    eoutdent
1419
1420    # finally check if we have a password we can use:
1421    if [ -n "$SSH_PASSWD" ] ; then
1422       echo "grml:$SSH_PASSWD" | chpasswd -m
1423    fi
1424
1425    einfo 'Starting secure shell server in background.'
1426    /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1427    /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1428    eend $?
1429
1430    eindent
1431    ewarn 'Warning: please change the password for user grml as soon as possible!'
1432    eoutdent
1433 fi
1434 }
1435 # }}}
1436
1437 # {{{ set password for user grml
1438 config_passwd(){
1439 if checkbootparam passwd >>$DEBUG 2>&1; then
1440   einfo "Bootoption passwd found."
1441   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1442   if [ -n "$PASSWD" ] ; then
1443     echo "grml:$PASSWD" | chpasswd -m ; eend $?
1444   else
1445     eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1446   fi
1447   eindent
1448     ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1449   eoutdent
1450 fi
1451 }
1452 # }}}
1453
1454 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1455 config_homedir(){
1456 if checkbootparam home ; then
1457    HOMEDIR="$(getbootparam home)"
1458    MYHOMEDEVICE=""
1459    MYHOMEMOUNTPOINT=""
1460    MYHOMEDIR=""
1461    if [ -n "$HOMEDIR" ]; then
1462       einfo "Bootoption home detected." && eend 0
1463       case "$HOMEDIR" in
1464         /dev/*)
1465         MYHOMEDEVICE="${HOMEDIR##/dev/}"
1466         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1467         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1468         MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1469       ;;
1470         /mnt/*)
1471         MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1472         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1473         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1474         MYHOMEDIR="$HOMEDIR"
1475       ;;
1476         [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1477         MYHOMEDIR="$(findfile grml.img)"
1478         MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1479         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1480         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1481       ;;
1482       *)
1483         eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1484         eerror "Option ignored." ; eend 1
1485       ;;
1486       esac
1487    fi # -n $HOMEDIR
1488
1489    if [ -n "$MYHOMEDIR" ]; then
1490       if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1491          [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1492          while read device mountpoint fs relax; do
1493            case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1494              case "$fs" in
1495                *[Nn][Tt][Ff][Ss]*)
1496                  umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1497                  break
1498                  ;;
1499                *[Ff][Aa][Tt]*)
1500                  # Note: This currently won't work with encrypted partitions
1501                  umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1502                  if [ ! -f "$MYHOMEDIR" ]; then
1503                     ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1504                     ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1505                  fi
1506                  ;;
1507              esac
1508
1509              if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1510                 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1511                 if [ -f "$MYHOMEDIR" ]; then
1512                    # It's a loopback file, mount it over the /home/grml directory
1513                    trymount "$MYHOMEDIR" /home/grml
1514                    RC="$?"
1515                    [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1516                    RC="$?"
1517                 else
1518                    # Do a --bind mount
1519                    ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1520                    RC="$?"
1521                 fi # -f $MYHOMEDIR
1522
1523                 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1524
1525              fi #  mount -o remount,rw,...
1526            break
1527            ;;
1528            esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1529          done <<EOT
1530          $(cat /proc/mounts)
1531 EOT
1532      fi # if trymount ...
1533    fi # -n $MYHOMEDIR
1534 fi # checkbootparam home
1535 }
1536 # }}}
1537
1538 # {{{ Check for scripts on CD-ROM
1539 config_cdrom_scripts(){
1540 if checkbootparam "script"; then
1541    for script in "${LIVECD_PATH}"/scripts/* ; do
1542        einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1543        . $script
1544    done
1545 fi
1546 }
1547 # }}}
1548
1549 # {{{ Sound
1550 config_mixer(){
1551 if ! [ -x /usr/bin/aumix ] ; then
1552   eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1553 else
1554
1555   if ! [ -r /proc/asound/cards ] ; then
1556      ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1557      return
1558   fi
1559
1560   if checkbootparam vol ; then
1561     VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1562     if [ -z "$VOL" ] ; then
1563       eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1564       VOL='75' # default
1565     fi
1566   else
1567     VOL='75' # default
1568   fi
1569
1570   if checkbootparam nosound ; then
1571     einfo "Muting sound devices on request."
1572     # some IBM notebooks require the following stuff:
1573     if [ -x /usr/bin/amixer ] ; then
1574        if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1575           amixer set Front unmute 1>/dev/null
1576           amixer set Front 0% 1>/dev/null
1577        fi
1578     fi
1579     ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1580     if [ -n "$ERROR" ] ; then
1581        eindent
1582        eerror "Problem muting sound devices: $ERROR"
1583        eoutdent
1584     fi
1585     eend $RC
1586   elif [ -z "$INSTALLED" ]; then
1587       einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1588       # some IBM notebooks require the following stuff:
1589       if [ -x /usr/bin/amixer ] ; then
1590          if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1591             amixer set Front unmute 1>/dev/null
1592             amixer set Front ${VOL}% 1>/dev/null
1593          fi
1594       fi
1595       # by default assume '0' as volume for microphone:
1596       if checkbootparam micvol ; then
1597          MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1598       else
1599          MICVOL=0
1600       fi
1601
1602       # finally set the volumes:
1603       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1604       if [ -n "$ERROR" ] ; then
1605          eindent
1606          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1607          eoutdent
1608       fi
1609       eend $RC
1610   fi
1611
1612 fi
1613 }
1614 # }}}
1615
1616 # {{{ modem detection
1617 config_modem(){
1618 if checkbootparam "nomodem"; then
1619   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1620 else
1621   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1622      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1623         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1624         eend 0
1625      fi
1626   fi
1627 fi
1628 }
1629 # }}}
1630
1631 # {{{ keyboard add-ons
1632 config_setkeycodes(){
1633 if checkbootparam "setkeycodes" ; then
1634  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1635   # MS MM keyboard add-on
1636   # fix
1637   setkeycodes e001 126 &>/dev/null
1638   setkeycodes e059 127 &>/dev/null
1639   # fn keys
1640   setkeycodes e03b 59 &>/dev/null
1641   setkeycodes e008 60 &>/dev/null
1642   setkeycodes e007 61 &>/dev/null
1643   setkeycodes e03e 62 &>/dev/null
1644   setkeycodes e03f 63 &>/dev/null
1645   setkeycodes e040 64 &>/dev/null
1646   setkeycodes e041 65 &>/dev/null
1647   setkeycodes e042 66 &>/dev/null
1648   setkeycodes e043 67 &>/dev/null
1649   setkeycodes e023 68 &>/dev/null
1650   setkeycodes e057 87 &>/dev/null
1651   setkeycodes e058 88 &>/dev/null
1652   # hp keycodes
1653   setkeycodes e00a 89 e008 90 &>/dev/null
1654  eend 0
1655 fi
1656 }
1657 # }}}
1658
1659 # {{{ wondershaper
1660 config_wondershaper(){
1661  if checkbootparam "wondershaper" ; then
1662     WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1663     CMD=wondershaper
1664     DEVICE=""
1665     DOWNSTREAM=""
1666     UPSTREAM=""
1667     if [ -n "$WONDER" ]; then
1668       # Extra options
1669       DEVICE="${WONDER%%,*}"
1670       R="${WONDER#*,}"
1671       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1672         WONDER="$R"
1673         DOWNSTREAM="${WONDER%%,*}"
1674         R="${WONDER#*,}"
1675         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1676           WONDER="$R"
1677           UPSTREAM="${WONDER%%,*}"
1678           R="${WONDER#*,}"
1679         fi
1680       fi
1681     fi
1682     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1683     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1684     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1685     einfo "Starting wondershaper (${CMD}) in background."
1686     ( sh -c $CMD & ) && eend 0
1687  fi
1688 }
1689 # }}}
1690
1691 # {{{ syslog-ng
1692 config_syslog(){
1693  if checkbootparam "nosyslog"; then
1694     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1695  else
1696     SYSLOGD=''
1697     [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1698     [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
1699     [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
1700     [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
1701     [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1702
1703     if [ -z "$SYSLOGD" ] ; then
1704        eerror "No syslog daemon found." ; eend 1
1705     else
1706        einfo "Starting $SYSLOGD in background."
1707        /etc/init.d/$SYSLOGD start 1>>$DEBUG &
1708        eend 0
1709     fi
1710  fi
1711 }
1712 # }}}
1713
1714 # {{{ gpm
1715 config_gpm(){
1716  if checkbootparam "nogpm"; then
1717   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1718  else
1719    if ! [ -r /dev/input/mice ] ; then
1720       eerror "No mouse found - not starting GPM." ; eend 1
1721    else
1722       einfo "Starting gpm in background."
1723       /etc/init.d/gpm start 1>>$DEBUG &
1724       # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1725       eend 0
1726    fi
1727  fi
1728 }
1729 # }}}
1730
1731 # {{{ services
1732 config_services(){
1733  if checkbootparam "services" ; then
1734     SERVICE="$(getbootparam services 2>>$DEBUG)"
1735     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1736     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1737     einfo "Starting service(s) ${SERVICENL} in background."
1738     for service in $(echo -e $SERVICELIST) ; do
1739        /etc/init.d/${service} start 1>>$DEBUG &
1740     done
1741     [ "$?" == "0" ] ; eend $?
1742  fi
1743 }
1744 # }}}
1745
1746 # {{{ config files
1747 config_netconfig(){
1748  if checkbootparam netconfig ; then
1749   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1750   CONFIGFILE='/tmp/netconfig.grml'
1751
1752   getconfig() {
1753   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
1754        --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1755   }
1756   einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1757   counter=10
1758   while ! getconfig && [[ "$counter" != 0 ]] ; do
1759     echo -n "Sleeping for 5 seconds and trying to get config again... "
1760     counter=$(( counter-1 ))
1761     echo "$counter tries left" ; sleep 1
1762   done
1763   if [ -r "$CONFIGFILE" ] ; then
1764     einfo "Downloading was successfull." ; eend 0
1765     einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1766     md5sum $CONFIGFILE ; eend 0
1767     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1768   else
1769     einfo "Sorry, could not fetch $CONFIG" ; eend 1
1770   fi
1771  fi
1772 }
1773 # }}}
1774
1775 # {{{ blindsound
1776 config_blindsound(){
1777  if checkbootparam "blind" ; then
1778     beep
1779     flitewrapper "welcome to the gremel system"
1780  fi
1781 }
1782 # }}}
1783
1784 # {{{ welcome sound
1785 config_welcome(){
1786  if checkbootparam welcome ; then
1787     flitewrapper "welcome to the gremel system"
1788  fi
1789 }
1790 # }}}
1791
1792 # {{{ fix/workaround for unionfs
1793 fix_unionfs(){
1794   if [ -z "$INSTALLED" ]; then
1795    touch /var/cache/apt/*cache.bin
1796   fi
1797 }
1798 # }}}
1799
1800 # {{{ create all /mnt-directories
1801 create_mnt_dirs(){
1802   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1803   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1804 }
1805 # }}}
1806
1807 # {{{ start X window system via grml-x
1808 config_x_startup(){
1809 if checkbootparam startx ; then
1810  if [ -x /usr/X11R6/bin/X ] ; then
1811   if [ -z "$INSTALLED" ] ; then
1812    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1813    if [ -z "$WINDOWMANAGER" ] ; then
1814      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1815      WINDOWMANAGER="wm-ng"
1816    else
1817      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1818    fi
1819    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1820    config_userfstab || fstabuser='grml'
1821  cat>|/etc/init.d/xstartup<<EOF
1822 #!/bin/sh
1823 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1824 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1825 EOF
1826    chmod 755 /etc/init.d/xstartup
1827
1828    # adjust inittab for xstartup
1829    if grep -q '^6:' /etc/inittab ; then
1830       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1831    else # just append tty6 to inittab if no definition is present:
1832       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1833    fi
1834
1835    /sbin/telinit q ; eend $?
1836
1837    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1838       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1839    else
1840       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1841    fi
1842
1843   else
1844     eerror "We are not running from CD - startx will not work, skipping it.
1845      Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1846   fi
1847  else
1848    eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1849    Boot parameter startx does not work therefore." ; eend 1
1850  fi
1851 fi
1852 }
1853 # }}}
1854
1855 # {{{ configuration framework
1856 config_extract(){
1857 if checkbootparam extract ; then
1858  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1859  EXTRACTOPTIONS="-- -x $EXTRACT"
1860 fi
1861 }
1862
1863 config_automount(){
1864 if checkbootparam noautoconfig || checkbootparam forensic ; then
1865   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1866 else
1867  if [ -z "$INSTALLED" ] ; then
1868   einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1869   eindent
1870   [ -d /mnt/grml ] || mkdir /mnt/grml
1871   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1872 # We do need the following fix so floppy disk is available to blkid in any case :-/
1873   if [ -r /dev/fd0 ] ; then
1874      einfo "Floppy device detected. Trying to access floppy disk."
1875 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1876      if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1877         blkid /dev/fd0 1>>$DEBUG 2>&1
1878      fi
1879   fi
1880   DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1881   [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1882   if [[ $RC == 0 ]]; then
1883     einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1884
1885     CONFIG=''
1886     CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1887     if [ -n "$CONFIG" ]; then
1888       einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1889       cd /
1890       unp $CONFIG $EXTRACTOPTIONS ; eend $?
1891     else
1892       ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1893     fi
1894
1895     SCRIPT=''
1896     SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1897     if [ -n "$SCRIPT" ]; then
1898       einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1899       $SCRIPT ; eend $?
1900     fi
1901     grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1902   else
1903     ewarn "No devices with label GRMLCFG found." ; eend 0
1904   fi
1905   eoutdent
1906  fi
1907 fi
1908 }
1909
1910 config_myconfig(){
1911
1912 if checkbootparam "config" ; then
1913   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1914   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1915   einfo "Bootoption config found. config is set to: $CONFIG"
1916   eindent
1917     einfo "Trying to extract configuration file ${CONFIG}:"
1918     cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1919   eoutdent
1920 fi
1921
1922 if checkbootparam myconfig ; then
1923  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1924  if [ -n "$MOUNTDEVICE" ]; then
1925    if checkbootparam file ; then
1926     FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1927     [ -n "$FILENAME" ] || FILENAME='config.tbz'
1928    fi
1929    [ -d /mnt/grml ] || mkdir /mnt/grml
1930    umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1931    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1932     if [[ $RC == 0 ]]; then
1933       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1934       eindent
1935       CONFIG=''
1936       CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1937       if [ -n "$CONFIG" ]; then
1938         einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1939         cd /
1940         unp $CONFIG $EXTRACTOPTIONS ; eend $?
1941       else
1942         ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1943       fi
1944
1945       SCRIPT=''
1946       SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1947       if [ -n "$SCRIPT" ]; then
1948         einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1949         $SCRIPT ; eend $?
1950       fi
1951       eoutdent
1952     else
1953       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1954     fi # mount $MOUNTDEVICE
1955    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1956  else
1957    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1958  fi # [ -n "$MOUNTDEVICE" ]
1959 fi # checkbootparam myconfig
1960
1961 if checkbootparam "partconf" ; then
1962  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1963  if [ -n "$MOUNTDEVICE" ]; then
1964    [ -d /mnt/grml ] || mkdir /mnt/grml
1965    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1966     if [[ $RC == 0 ]]; then
1967       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1968       einfo "Copying files from $MOUNTDEVICE over grml system."
1969       for file in `cat /etc/grml/partconf` ; do
1970         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1971         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1972       done && eend 0
1973     else
1974       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1975     fi # mount $MOUNTDEVICE
1976    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1977  else
1978    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1979  fi # [ -n "$MOUNTDEVICE" ]
1980 fi
1981 }
1982 # }}}
1983
1984 # {{{ /cdrom/.*-options
1985 config_debs(){
1986 if checkbootparam "debs" ; then
1987    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1988    einfo "Tring to install debian package(s) ${DEBS}"
1989    dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
1990 fi
1991 }
1992
1993 config_scripts(){
1994 if checkbootparam "scripts" ; then
1995    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1996    [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1997    einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1998    sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
1999 fi
2000 }
2001 # }}}
2002
2003 # {{{ mypath
2004 config_mypath(){
2005 if checkbootparam "mypath" ; then
2006    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2007    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2008    touch /etc/grml/my_path
2009    chmod 644 /etc/grml/my_path
2010    # make sure the directories exist:
2011    eindent
2012    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2013        if ! [ -d "$i" ] ; then
2014           einfo "Creating directory $i"
2015           mkdir -p "$i" ; eend $?
2016        fi
2017    done
2018    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2019    eoutdent
2020 fi
2021 }
2022 # }}}
2023
2024 # {{{ distcc
2025 config_distcc(){
2026 if checkbootparam "distcc" ; then
2027  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2028  if [ -n "$OPTIONS" ]; then
2029     NET=""
2030     INTERFACE=""
2031     if [ -n "$OPTIONS" ]; then
2032       NET="${OPTIONS%%,*}"
2033       R="${OPTIONS#*,}"
2034       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2035         OPTIONS="$R"
2036         INTERFACE="${OPTIONS%%,*}"
2037         R="${OPTIONS#*,}"
2038       fi
2039     fi
2040  fi
2041  CONFIG=/etc/default/distcc
2042  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
2043  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2044
2045  if [ -n "$INTERFACE" ] ; then
2046    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2047
2048    counter=10
2049    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2050      counter=$(( counter-1 ))
2051      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2052      sleep 3
2053      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2054    done
2055  fi
2056
2057  if [ -n "$IP" ] ; then
2058    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
2059
2060    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2061    eindent
2062     id distccd >/dev/null 2>&1 || \
2063     (
2064       einfo "Creating distcc user" ; \
2065       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2066     )
2067
2068     einfo "Starting distcc for network ${NET}, listening on ${IP}."
2069    /etc/init.d/distcc start 1>/dev/null ; eend $?
2070    eoutdent
2071  else
2072    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2073  fi
2074 fi
2075
2076 if checkbootparam "gcc"; then
2077  GCC="$(getbootparam gcc 2>>$DEBUG)"
2078  eindent
2079  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2080  eoutdent
2081  rm -f /usr/bin/gcc
2082  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2083 fi
2084
2085 if checkbootparam "gpp"; then
2086  GPP="$(getbootparam gpp 2>>$DEBUG)"
2087  eindent
2088   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2089   if [ -x /usr/bin/g++-${GPP} ] ; then
2090      rm -f /usr/bin/g++
2091      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2092   fi
2093   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2094   if [ -x /usr/bin/cpp-${GPP} ] ; then
2095      rm -f /usr/bin/cpp
2096      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2097   fi
2098  eoutdent
2099 fi
2100
2101 }
2102 # }}}
2103
2104 # {{{ load modules
2105 # Notice: use it only on live-cd system, if running from harddisk please
2106 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2107 # in /etc/runlevel.conf
2108 config_modules(){
2109 MODULES_FILE=/etc/grml/modules
2110 if checkbootparam nomodules ; then
2111   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2112 elif [ -z "$INSTALLED" ]; then
2113  if [ -r $MODULES_FILE ] ; then
2114   einfo "Loading modules specified in ${MODULES_FILE}:"
2115   eindent
2116   grep '^[^#]' $MODULES_FILE | \
2117   while read module args; do
2118     [ "$module" ] || continue
2119       einfo "${module}"
2120       modprobe $module $args ; eend $?
2121   done
2122   eoutdent
2123  else
2124   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2125  fi
2126 fi
2127 }
2128 # }}}
2129
2130 # {{{ 915resolution
2131 config_915resolution(){
2132 if checkbootparam "915resolution" ; then
2133  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2134   if [ -x /usr/sbin/915resolution ]; then
2135     CMD=915resolution
2136     MODE=""
2137     XRESO=""
2138     YRESO=""
2139     if [ -n "$OPTIONS" ]; then
2140       # Extra options
2141       MODE="${OPTIONS%%,*}"
2142       R="${OPTIONS#*,}"
2143       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2144         OPTIONS="$R"
2145         XRESO="${OPTIONS%%,*}"
2146         R="${OPTIONS#*,}"
2147         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2148           OPTIONS="$R"
2149           YRESO="${OPTIONS%%,*}"
2150           R="${OPTIONS#*,}"
2151         fi
2152       fi
2153     fi
2154     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2155     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2156     eend 0
2157   fi
2158 fi
2159 }
2160 # }}}
2161
2162 # {{{ SW-RAID
2163 config_swraid(){
2164   if [ -z "$INSTALLED" ] ; then
2165   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2166   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2167      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2168      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2169   else
2170     if ! [ -x /sbin/mdadm ] ; then
2171        eerror "mdadm not available, can not execute it." ; eend 1
2172     else
2173
2174        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2175        # find out whether we have a valid configuration file already
2176        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2177           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2178           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2179           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2180         else
2181           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2182        fi
2183
2184        if ! checkbootparam 'swraid' ; then
2185           eindent
2186           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2187           eoutdent
2188        else
2189           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2190           eindent
2191            IFSOLD=${IFS:-}
2192            IFS='
2193 '
2194            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2195                case $line in
2196                  *'No arrays found'*)
2197                    ewarn "$line" ; eend 0
2198                    ;;
2199                  *)
2200                    einfo "$line" ; eend 0
2201                    ;;
2202                esac
2203            done
2204            IFS=$IFSOLD
2205          eoutdent
2206
2207          if [ -r /proc/mdstat ] ; then
2208             eindent
2209             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2210             if [ -z "$MDSTAT" ] ; then
2211                ewarn "No active arrays found" ; eend 0
2212             else
2213                IFSOLD=${IFS:-}
2214                IFS='
2215 '
2216                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2217                    einfo "active arrays: $line" ; eend 0
2218                done
2219                IFS=$IFSOLD
2220             fi
2221             eoutdent
2222          fi # /proc/mdstat
2223        fi # bootoption swraid
2224
2225      fi # is /sbin/mdadm executable?
2226   fi # check for bootoptions
2227   fi # run only in live-cd mode
2228 }
2229 # }}}
2230
2231 # {{{ LVM (Logical Volumes)
2232 config_lvm(){
2233   if [ -z "$INSTALLED" ] ; then
2234   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2235   if checkbootparam 'nolvm' ; then
2236      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2237   else
2238     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2239     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2240        eerror "LVM not available, can not execute it." ; eend 1
2241     else
2242        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2243           einfo "You seem to have logical volumes (LVM) on your system."
2244           eindent
2245           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2246           eend 0
2247           if checkbootparam 'lvm' ; then
2248              einfo "Bootoption LVM found. Searching for logical volumes:"
2249              /etc/init.d/lvm2 start ; eend $?
2250           fi
2251           eoutdent
2252        fi
2253     fi # check for lvm binary
2254   fi # check for bootoption nolvm
2255   fi # run only in live-cd mode
2256 }
2257 # }}}
2258
2259 # {{{ debnet: setup network based on an existing one found on a partition
2260 config_debnet(){
2261 if checkbootparam "debnet" ; then
2262  iszsh && setopt shwordsplit
2263  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2264  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2265  FOUND_DEBNET=""
2266
2267  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2268  eindent
2269  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2270     for i in $DEVICES; do
2271      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2272          einfo "Scanning on $i"
2273        if [ -f /mnt/etc/network/interfaces ]; then
2274          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2275          FOUND_DEBNET="$i"
2276          break
2277        fi
2278        umount /mnt
2279      fi
2280     done
2281
2282    if [ -n "$FOUND_DEBNET" ]; then
2283      einfo "Stopping network."
2284        pump -k 1>/dev/null 2>&1
2285        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2286      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2287        rm -rf /etc/network/run
2288        cp -a /mnt/etc/network /etc
2289        rm -rf /etc/network/run
2290        mkdir /etc/network/run
2291        umount /mnt ; eend $?
2292      einfo "Starting network."
2293        /etc/init.d/networking start ; eend $?
2294    else
2295      eerror "/etc/network/interfaces not found." ; eend 1
2296    fi
2297    eoutdent
2298  else
2299   eerror "Error: /mnt already mounted." ; eend 1
2300  fi
2301 fi
2302 }
2303 # }}}
2304
2305 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2306 config_ipw3945() {
2307   if grep -q ipw3945 /proc/modules ; then
2308      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2309         ewarn "Broken ipw3945 network interface found, reloading module."
2310         rmmod ipw3945
2311         modprobe ipw3945
2312         eend $?
2313      fi
2314   fi
2315 }
2316 # }}}
2317
2318 # {{{ disable console blanking
2319 config_blanking(){
2320 if checkbootparam "noblank" ; then
2321   einfo "Bootoption noblank found. Disabling monitor blanking."
2322   setterm -blank 0 ; eend $?
2323 fi
2324 }
2325 # }}}
2326
2327 # {{{ grml2hd: automatic installation
2328 config_grml2hd(){
2329
2330 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2331
2332 if checkbootparam "user" ; then
2333    NEWUSER=''
2334    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2335    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2336 fi
2337
2338 if checkbootparam "filesystem" ; then
2339    FILESYSTEM=''
2340    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2341    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2342 fi
2343
2344 if checkbootparam "partition" ; then
2345    PARTITION=''
2346    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2347    # notice: the following checks whether the given partition is available, if not the skip
2348    # execution of grml2hd as it might result in data loss...
2349    if [ -r $PARTITION ] ; then
2350       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2351    else
2352       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2353    fi
2354 fi
2355
2356 if checkbootparam "mbr" ; then
2357    BOOT_PARTITION=''
2358    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2359    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2360 fi
2361
2362 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2363 #!/bin/sh
2364 GRML2HD_NONINTERACTIVE='yes' grml2hd
2365 EOF
2366
2367 chmod 755 /usr/bin/grml2hd_noninteractive
2368 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2369 if [ -z "$GRML2HD_FAIL" ] ; then
2370    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2371 else
2372    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2373 fi
2374
2375 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2376 }
2377 # }}}
2378
2379 # {{{ debootstrap: automatic installation
2380 config_debootstrap(){
2381
2382 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2383
2384 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2385
2386 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2387    eindent
2388    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2389    eoutdent
2390    exit 1
2391 fi
2392
2393 if checkbootparam "target" ; then
2394   TARGET=''
2395   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2396   # notice: the following checks whether the given partition is available, if not the skip
2397   # execution of grml-debootstrap as it might result in data loss...
2398   if ! [ -r "$TARGET" ] ; then
2399      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2400   fi
2401 else
2402   eindent
2403   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2404   eoutdent
2405   exit 1
2406 fi
2407
2408 if checkbootparam "grub" ; then
2409   GRUB=''
2410   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2411 fi
2412
2413 if checkbootparam "groot" ; then
2414   GROOT=''
2415   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2416 fi
2417
2418 if checkbootparam "release" ; then
2419   RELEASE=''
2420   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2421 fi
2422
2423 if checkbootparam "mirror" ; then
2424   MIRROR=''
2425   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2426 fi
2427
2428 if checkbootparam "boot_append" ; then
2429   BOOT_APPEND=''
2430   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2431 fi
2432
2433 if checkbootparam "password" ; then
2434   PASSWORD=''
2435   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2436 fi
2437
2438 # now check which options are available
2439 if [ -n "TARGET" ] ; then
2440    TARGETCMD="--target $TARGET"
2441 else
2442    TARGETCMD=''
2443    eindent
2444    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2445    eoutdent
2446    exit 1
2447 fi
2448 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2449 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2450 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2451 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2452 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2453 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2454
2455 # and finally write script and execute it
2456 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2457 #!/bin/sh
2458 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2459 EOF
2460
2461 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2462
2463 screen /usr/bin/grml-debootstrap_noninteractive
2464 einfo "Invoking a shell, just exit to continue booting..."
2465 /bin/zsh
2466
2467 fi # stringinstring "BOOT_IMAGE=debian2hd
2468 }
2469 # }}}
2470
2471 # {{{ Support customization
2472 config_distri(){
2473 if checkbootparam "distri"; then
2474   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2475   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2476      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2477      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2478      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2479      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2480   fi
2481 fi
2482 }
2483 # }}}
2484
2485 ### {{{ backwards compatible stuff
2486 config_environment(){
2487   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2488 }
2489 config_keyboard(){
2490   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2491 }
2492 # }}}
2493
2494 ## END OF FILE #################################################################
2495 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3