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