e69ab0d08e228198abb0c201872261c855d98567
[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 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
633 # otherwise we will get: passwd: Authentication token lock busy
634 config_fix_passwd(){
635  if [ -z "$INSTALLED" ] ; then
636   touch /etc/.pwd.lock
637  fi
638 }
639 # }}}
640
641 # {{{ CD Checker
642 config_testcd(){
643 if [ -n "$TESTCD" ]; then
644    einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
645    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
646    echo -n "${RED}"
647
648    if [ -n "${LIVECD_PATH}"/GRML ] ; then
649       ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
650    else
651       echo "${RED} *** Error: Could not find md5sum file.                           ***"
652    fi
653
654    if [ "$RC" = "0" ]; then
655       einfo "Everything looks OK" ; eend 0
656    else
657       eerror 'Checksum failed for theses files:' ; eend 1
658       egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
659       eerror 'Data on the grml medium is possibly incomplete/damaged or...'
660       eerror '... RAM of your computer is broken.' ; eend 1
661       einfon "Hit return to continue, or press the reset button to quit."
662      read a
663    fi
664
665    eend 0
666 fi
667 }
668 # }}}
669
670 # {{{ hardware detection via hwinfo
671 config_hwinfo(){
672 if checkbootparam 'hwinfo' >>$DEBUG 2>&1; then
673   einfo "Discovering hardware via hwinfo:"
674   MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
675   echo -n "  Loading modules: "
676   for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
677   eend 0
678 fi
679 }
680 # }}}
681
682 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
683 config_blacklist(){
684 if checkbootparam 'blacklist' ; then
685  if [ -z "$INSTALLED" ]; then
686   einfo "Bootoption blacklist found."
687   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
688   BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
689   if [ -n "$BLACK" ] ; then
690     for module in $(echo ${BLACK//,/ }) ; do
691         einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
692         echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
693         echo "blacklist $module"     >> "$BLACKLIST_FILE"
694         echo "alias     $module off" >> "$BLACKLIST_FILE"
695         echo "# end   entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
696     done
697   else
698    eerror "No given module for blacklist found. Blacklisting will not work therefore."
699   fi
700  else
701   ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
702   eindent
703    einfo "Please blacklist the module(s) manually using the 'blacklist' script."
704   eoutdent
705  fi
706 fi
707 }
708 # }}}
709
710 # {{{ ACPI
711 config_acpi_apm(){
712 if [ -d /proc/acpi ]; then
713   if checkbootparam 'noacpi'; then
714     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
715   elif checkbootparam 'nogrmlacpi' ; then
716     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
717   else
718     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
719     eindent
720     found=""
721     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
722       basename="${a##*/}"
723       basename="${basename%%.*}"
724       case "$basename" in *_acpi)
725        egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
726       esac
727       modprobe $basename >>$DEBUG 2>&1 && found="yes"
728       local BASE="$BASE $basename"
729     done
730     if [ -n "$found" ] ; then
731       einfo "$BASE"  ; eend 0
732     else
733       ewarn "(none)" ; eend 1
734     fi
735     if ! ps x | grep -q /usr/sbin/acpid ; then
736       if ! [ -r /var/run/dbus/pid ] ; then
737         einfo "Starting acpi daemon."
738         /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
739       else
740         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
741         eerror "Solution: please activate acpid via /etc/runlevel.conf"
742         eend 1
743       fi
744     else
745       ewarn "acpi daemon already running."
746       eend 0
747     fi
748     eoutdent
749   fi
750 else
751 # APM
752   if checkbootparam 'noapm'; then
753     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
754   else
755     modprobe apm power_off=1 >>$DEBUG 2>&1
756     if [ "$?" = "0" ] ; then
757        if [ -x /etc/init.d/apmd ] ;then
758           einfo "APM Bios found, enabling power management functions."
759           /etc/init.d/apmd start ; eend $?
760        fi
761     else
762       eerror "Loading apm module failed." ; eend 1
763     fi
764   fi
765 fi
766 }
767 # }}}
768
769 # {{{ run software synthesizer via speakup
770 config_swspeak(){
771    if checkbootparam 'swspeak' ; then
772       einfo "Bootoption swspeak found."
773
774       if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
775          ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
776          eindent
777          einfo "Loading speakup_soft"
778          if modprobe speakup_soft ; then
779             eend 0
780          else
781             flitewrapper "Fatal error setting up software speakup"
782             eend 1
783             return 1
784          fi
785          eoutdent
786       fi
787
788       if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
789          einfo "Kernel supports speakup." ; eend 0
790          eindent
791             einfo "Just run swspeak if you want to use software synthesizer via speakup."
792             flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
793          eoutdent
794       else
795          eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
796          flitewrapper "Kernel does not seem to support speakup. Sorry."
797       fi
798    fi
799 }
800 # }}}
801
802 # {{{ support hardware synthesizer via speakup
803 config_hwspeak(){
804    if checkbootparam 'speakup.synth' ; then
805       einfo "Bootoption speakup.synth found."
806       eindent
807
808       module="$(getbootparam 'speakup.synth' 2>>$DEBUG)"
809       if [ -z "$module" ] ; then
810          eerror "Sorry, no speakup module specified for bootoption speakup.synth."
811          flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
812       else
813          einfo "Trying to load $module"
814          modprobe "speakup_${module}"
815          eend $?
816       fi
817
818       if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
819          einfo "Kernel should support speakup now." ; eend 0
820          flitewrapper "Kernel should support speakup now."
821       else
822          eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
823          flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
824       fi
825
826       eoutdent
827
828    # hwspeak:
829    elif checkbootparam 'hwspeak' ; then
830       einfo "Bootoption hwspeak found."
831
832       if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
833          ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
834          eindent
835          if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
836             eerror "Kernel does not provide speakup modules, sorry." ; eend 1
837          else
838            for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
839                            sed 's#.*speakup/##g ; s#.ko$##g' | \
840                            grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
841               einfo "Trying to load $module"
842               modprobe $module
843               eend $?
844            done
845          fi
846          eoutdent
847       fi
848
849       if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
850          einfo "Kernel should support speakup now." ; eend 0
851          flitewrapper "Kernel should support speakup now."
852       else
853          eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
854          flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
855       fi
856    fi
857 }
858 # }}}
859
860 # {{{ Check for blind option or brltty
861 config_blind(){
862 BLIND=""
863 checkbootparam 'blind' && BLIND="yes"
864 BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)"
865
866 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
867   if [ -x /sbin/brltty ]; then
868     # Blind option detected, start brltty now.
869     # modprobe serial_core parport_serial generic_serial && echo "done"
870     CMD=brltty
871     BRLTYPE=""
872     BRLDEV=""
873     BRLTEXT=""
874     if [ -n "$BRLTTY" ]; then
875       # Extra options
876       BRLTYPE="${BRLTTY%%,*}"
877       R="${BRLTTY#*,}"
878       if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
879         BRLTTY="$R"
880         BRLDEV="${BRLTTY%%,*}"
881         R="${BRLTTY#*,}"
882         if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
883           BRLTTY="$R"
884           BRLTEXT="${BRLTTY%%,*}"
885           R="${BRLTTY#*,}"
886         fi
887       fi
888     fi
889     [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
890     [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
891     [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
892     einfo "Starting braille-display manager."
893 #    ( exec $CMD & )
894     ( sh -c "$CMD" & )
895     sleep 2 && BLINDSOUND="yes"
896     eend 0
897   fi
898 fi
899 }
900 # }}}
901
902 # {{{ AGP
903 config_agp(){
904 if checkbootparam 'forceagp' ; then
905 # Probe for AGP. Hope this can fail safely
906   grep -q "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
907 fi
908 }
909 # }}}
910
911 # {{{ automount(er)
912 config_automounter(){
913 if checkbootparam 'automounter' ; then
914   RUNLEVEL="$(runlevel)"
915   AUTOMOUNTER=""
916   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
917
918 addautomount(){
919 # /dev/ice  options
920   d="${1##*/}"
921   if [ -n "$AUTOMOUNTER" ]; then
922     [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
923     [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
924     [ -L "/mnt/$d" ]      || ln -s "/mnt/auto/$d" "/mnt/$d"
925     anew="$d        -fstype=auto,$2 :$i"
926     grep -q "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
927     AUTOMOUNTS="$AUTOMOUNTS $d"
928     new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
929   else
930     [ -d /mnt/$d ] && mkdir -p /mnt/$d
931     new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
932   fi
933   grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
934 }
935
936   AUTOMOUNTS="floppy cdrom"
937 # Add new devices to /etc/fstab and /etc/auto.mnt
938   for i in /dev/cdrom?*; do
939     if [ -L $i ]; then
940       addautomount "$i" "ro"
941     fi
942   done
943 fi
944
945 if [ -n "$AUTOMOUNTER" ]; then
946 # Check for floppy dir, reinstall with automounter
947   [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
948   [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
949   [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
950   [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
951   [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
952   [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
953   rm -f /etc/fstab.new
954 # Replace paths from bootfloppy
955   sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
956   mv -f /etc/fstab.new /etc/fstab
957 # Start automounter now
958   einfo "Starting automounter for ${AUTOMOUNTS}."
959   /etc/init.d/autofs start >>$DEBUG ; eend $?
960 fi
961 }
962 # }}}
963
964 # {{{ Collect partitions from /proc/partitions first for enabling DMA
965 check_partitions(){
966 partitions=""
967 IDEDISKS=""
968 while read major minor blocks partition relax; do
969   partition="${partition##*/}"
970   [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
971   case "$partition" in
972     hd?) IDEDISKS="$IDEDISKS $partition";;                # IDE  Harddisk, entire disk
973     sd?) ;;                                               # SCSI Harddisk, entire disk
974 #    [hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
975     [hs]d*|ub*) partitions="$partitions /dev/$partition";;    # IDE, USB or SCSI disk partition
976   esac
977 done <<EOT
978 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
979 EOT
980 }
981 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
982 # }}}
983
984 # {{{ Enable DMA for all IDE drives now if not disabled
985 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
986 config_dma(){
987 if checkbootparam 'nodma'; then
988   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
989 else
990   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
991     if test -d /proc/ide/$d; then
992       if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
993         MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
994         test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
995         einfo "Enabling DMA acceleration for: ${WHITE}$d        ${YELLOW}[${MODEL}]${NORMAL}"
996         echo "using_dma:1" >/proc/ide/$d/settings
997         eend 0
998       fi
999     fi
1000   done
1001 fi
1002 }
1003 # }}}
1004
1005 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1006 config_fstab(){
1007
1008 NOSWAP="yes" # we do not use swap by default!
1009 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
1010    NOSWAP=''
1011    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
1012 fi
1013
1014 # Scan for swap, config, homedir - but only in live-mode
1015 if [ -z "$INSTALLED" ] ; then
1016    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1017    GRML_IMG=""
1018    GRML_SWP=""
1019    HOMEDIR="$(getbootparam 'home')"
1020    if [ -n "$partitions" ]; then
1021       while read p m f relax; do
1022         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1023         partoptions="users,exec"
1024         fnew=""
1025         # it's a swap partition?
1026         case "$f" in swap)
1027           eindent
1028           if [ -n "$NOSWAP" ]; then
1029              ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1030              eend 0
1031           else
1032              case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1033                    S1SUSP|S2SUSP|pmdisk|[zZ]*)
1034                      if [ -n "$ANYSWAP" ] ; then
1035                         einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1036                         swapon $p 2>>$DEBUG ; eend $?
1037                      else
1038                         ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1039                      fi
1040                      ;;
1041                    *)
1042                      if [[ "$p" == LABEL* ]] ; then
1043                         p=$(blkid -t $p | awk -F: '{print $1}')
1044                      fi
1045                      if grep -q $p /proc/swaps ; then
1046                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1047                      else
1048                         if [ -b "$p" ] ; then
1049                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1050                         swapon $p 2>>$DEBUG ; eend $?
1051                         else
1052                         ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1053                         fi
1054                      fi
1055                      ;;
1056              esac # dd-check
1057           fi # -n "$NOSWAP
1058           eoutdent
1059           continue
1060           ;;
1061         esac # it's a swap partition?
1062
1063         # mount read-only
1064         MOUNTOPTS="ro"
1065         case "$f" in
1066           vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1067           ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1068           *) continue ;;
1069           # *) NONEFOUND='1'; continue ;;
1070         esac
1071
1072         # use a swapfile
1073         if [ -z "$NOSWAP" ] ; then
1074            mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1075            # Activate swapfile, if exists
1076            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1077         fi
1078         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1079            mount -o remount,rw $m && MOUNTED=1
1080            if swapon "$SWAPFILE" 2>>$DEBUG ; then
1081               eindent
1082                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1083               eoutdent
1084               fnew="$SWAPFILE swap swap defaults 0 0"
1085               grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1086               GRML_SWP="$GRML_SWP $SWAPFILE"
1087               eend 0
1088            fi
1089            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1090         fi
1091
1092         # use a image as home
1093         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1094         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1095            if [ -n "$HOMEDIR" ]; then
1096               if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1097                  continue
1098               fi
1099            fi
1100            if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1101               GRML_IMG="$IMAGE"
1102               mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1103            fi
1104         fi
1105         eend 0
1106
1107         # Umount, if not in use
1108         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1109
1110       done <<EOT
1111       $(cat /etc/fstab)
1112 EOT
1113    fi # -n $partitions
1114 fi # -z $INSTALLED
1115 }
1116 # }}}
1117
1118 # {{{ Mouse
1119 config_mouse(){
1120 if [ -n "$MOUSE_DEVICE" ] ; then
1121   einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1122 fi
1123 }
1124 # }}}
1125
1126 # {{{ IPv6 configuration
1127 # Load IPv6 kernel module and print IP adresses
1128 config_ipv6(){
1129 if checkbootparam 'ipv6'; then
1130   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1131   modprobe ipv6
1132   # we probably need some time until stateless autoconfiguration has happened
1133   sleep 2
1134   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1135   for DEVICE in `echo "$NETDEVICES"`; do
1136     eindent
1137       einfo "$DEVICE:"
1138       ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1139       COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1140       eindent
1141         for ADDR in `echo "$ADDRESSES"` ; do
1142             einfo "$ADDR"
1143         done
1144         if [ "$COUNT" -eq "0" ] ; then
1145            einfo "(none)" ; eend 1
1146         fi
1147       eoutdent
1148     eoutdent
1149   done
1150   eend 0
1151 fi
1152 }
1153 # }}}
1154
1155 # {{{ CPU-detection
1156 config_cpu(){
1157 if checkbootparam 'nocpu'; then
1158   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1159   return 0
1160 fi
1161
1162 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
1163    einfo "Detecting CPU:"
1164    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)
1165    echo $CPU | sed 's/ \{1,\}/ /g'
1166    eend 0
1167 else
1168    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
1169 fi
1170
1171 # Virtual Box supports ACPI and laptop-detect would return with '0', so check for it:
1172 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
1173    einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1174    return 0
1175 fi
1176
1177 if [ -x /etc/init.d/loadcpufreq ] ; then
1178    einfo "Trying to set up cpu frequency scaling:"
1179    eindent
1180    SKIP_CPU_GOVERNOR=''
1181    LOADCPUFREQ=$(mktemp)
1182    /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1183    if grep -q FATAL "$LOADCPUFREQ" ; then
1184       eindent
1185         SKIP_CPU_GOVERNOR=1
1186         oldIFS="$IFS"
1187         IFS="
1188 "
1189          for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1190              eerror "$line" ; eend $RC
1191          done
1192          IFS="$oldIFS"
1193       eoutdent
1194    elif grep -q done "$LOADCPUFREQ" ; then
1195       MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1196       if [ -n "$MODULE" -a "$MODULE" != none ]; then
1197          einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1198       else
1199          ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1200       fi
1201    fi
1202
1203    rm -f $LOADCPUFREQ
1204
1205    if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1206       einfo "Loading cpufreq_ondemand, setting ondemand governor"
1207       RC=0
1208       if modprobe cpufreq_ondemand ; RC=$? ; then
1209          for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1210             echo ondemand > $file
1211          done
1212       fi
1213       eend $RC
1214    fi # cpu-governor
1215
1216    eoutdent
1217 fi
1218 }
1219 # }}}
1220
1221 # {{{ autostart of ssh
1222 config_ssh(){
1223 if checkbootparam 'ssh' ; then
1224    SSH_PASSWD=''
1225    SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1226    einfo "Bootoption ssh found, trying to set password for user grml."
1227    eindent
1228    if [ -z "$SSH_PASSWD" ] ; then
1229       if [ -x /usr/bin/apg ] ; then
1230          SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1231       elif [ -x /usr/bin/gpw ] ; then
1232          SSH_PASSWD="$(gpw 1)"
1233       elif [ -x /usr/bin/pwgen ] ; then
1234          SSH_PASSWD="$(pwgen -1 8)"
1235       elif [ -x /usr/bin/hexdump ] ; then
1236          SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1237       elif [ -n "$RANDOM" ] ; then
1238          SSH_PASSWD="grml${RANDOM}"
1239       else
1240          SSH_PASSWD=''
1241          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1242          eend 1
1243       fi
1244
1245       if [ -n "$SSH_PASSWD" ] ; then
1246          ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1247       fi
1248    fi
1249    eoutdent
1250
1251    # finally check if we have a password we can use:
1252    if [ -n "$SSH_PASSWD" ] ; then
1253       # chpasswd sucks, seriously.
1254       if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1255         echo "grml:$SSH_PASSWD" | chpasswd -m
1256       else
1257         echo "grml:$SSH_PASSWD" | chpasswd
1258       fi
1259    fi
1260
1261    einfo 'Starting secure shell server in background.'
1262    /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1263    /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1264    eend $?
1265
1266    eindent
1267    ewarn 'Warning: please change the password for user grml as soon as possible!'
1268    eoutdent
1269 fi
1270 }
1271 # }}}
1272
1273 # {{{ autostart of x11vnc
1274 config_vnc(){
1275
1276 USER=grml # TODO: make it dynamically configurable
1277 if checkbootparam 'vnc' ; then
1278    VNC_PASSWD=''
1279    VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1280    einfo "Bootoption vnc found, trying to set password for user $USER."
1281    eindent
1282    if [ -z "$VNC_PASSWD" ] ; then
1283       if [ -x /usr/bin/apg ] ; then
1284          VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1285       elif [ -x /usr/bin/gpw ] ; then
1286          VNC_PASSWD="$(gpw 1)"
1287       elif [ -x /usr/bin/pwgen ] ; then
1288          VNC_PASSWD="$(pwgen -1 8)"
1289       elif [ -x /usr/bin/hexdump ] ; then
1290          VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1291       elif [ -n "$RANDOM" ] ; then
1292          VNC_PASSWD="${USER}${RANDOM}"
1293       else
1294          VNC_PASSWD=''
1295          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1296          eend 1
1297       fi
1298
1299       if [ -n "$VNC_PASSWD" ] ; then
1300          ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1301       fi
1302    fi
1303    eoutdent
1304
1305    # finally check if we have a password we can use:
1306    if [ -n "$VNC_PASSWD" ] ; then
1307
1308       VNCDIR="/home/${USER}/.vnc"
1309       [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1310
1311       if [ ! -x /usr/bin/x11vnc ] ; then
1312          eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1313          eend 1
1314       else
1315          /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1316          /bin/chown -R "$USER": "$VNCDIR"
1317       fi
1318    fi
1319    if checkbootparam 'vnc_connect' ; then
1320       VNC_CONNECT=''
1321       VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1322       einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1323       #store the options in a file
1324       VNCDIR="/home/${USER}/.vnc"
1325       [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1326       echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1327    fi
1328 fi
1329 }
1330 # }}}
1331
1332 # {{{ set password for user grml
1333 config_passwd(){
1334 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1335   einfo "Bootoption passwd found."
1336   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1337   if [ -n "$PASSWD" ] ; then
1338     echo "grml:$PASSWD" | chpasswd -m ; eend $?
1339   else
1340     eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1341   fi
1342   eindent
1343     ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1344   eoutdent
1345 fi
1346 }
1347 # }}}
1348
1349 # {{{ Sound
1350 config_mixer () {
1351    if ! [ -x /usr/bin/amixer ] ; then
1352       eerror "amixer binary not available. Can not set sound volumes therefore."
1353       eend 1
1354    else
1355       if ! [ -r /proc/asound/cards ] ; then
1356          ewarn "No soundcard present, skipping mixer settings therefore."
1357          eend 0
1358          return
1359       fi
1360
1361       for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1362          einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1363          eindent
1364
1365          if checkbootparam 'vol' ; then
1366             VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1367             if [ -z "$VOL" ] ; then
1368                eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1369                VOL='75'
1370                eend 1
1371             fi
1372          else
1373             VOL='75'
1374          fi
1375
1376          if checkbootparam 'nosound' ; then
1377             einfo "Muting sound devices on request."
1378             ERROR=$(amixer -q set Master mute)
1379             RC=$?
1380             if [ -n "$ERROR" ] ; then
1381                eindent
1382                eerror "Problem muting sound devices: $ERROR"
1383                eoutdent
1384             fi
1385             eend $RC
1386          elif [ -z "$INSTALLED" ] ; then
1387             einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1388
1389             if checkbootparam 'micvol' ; then
1390                MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1391             else
1392                MICVOL=0
1393             fi
1394
1395             for CONTROL in Master PCM ; do
1396                if amixer -q | grep -q "Simple mixer control '$CONTROL'" ; then
1397                   amixer -q set "${CONTROL}" "${VOL}"%
1398                   eend $?
1399                fi
1400             done
1401
1402             if [ ${MICVOL} -ne 0 ] ; then
1403                einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1404                amixer -q set "Mic" $MICVOL &> /dev/null
1405                eend $?
1406             fi
1407          fi # checkbootparam 'nosound'
1408          eoutdent
1409       done
1410    fi
1411 }
1412 # }}}
1413
1414 # {{{ modem detection
1415 config_modem(){
1416 if checkbootparam 'nomodem'; then
1417   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1418 else
1419   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1420      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1421         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1422         eend 0
1423      fi
1424   fi
1425 fi
1426 }
1427 # }}}
1428
1429 # {{{ wondershaper
1430 config_wondershaper(){
1431  if checkbootparam 'wondershaper' ; then
1432     WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1433     CMD=wondershaper
1434     DEVICE=""
1435     DOWNSTREAM=""
1436     UPSTREAM=""
1437     if [ -n "$WONDER" ]; then
1438       # Extra options
1439       DEVICE="${WONDER%%,*}"
1440       R="${WONDER#*,}"
1441       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1442         WONDER="$R"
1443         DOWNSTREAM="${WONDER%%,*}"
1444         R="${WONDER#*,}"
1445         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1446           WONDER="$R"
1447           UPSTREAM="${WONDER%%,*}"
1448           R="${WONDER#*,}"
1449         fi
1450       fi
1451     fi
1452     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1453     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1454     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1455     einfo "Starting wondershaper (${CMD}) in background."
1456     ( sh -c $CMD & ) && eend 0
1457  fi
1458 }
1459 # }}}
1460
1461 # {{{ syslog-ng
1462 config_syslog(){
1463  if checkbootparam 'nosyslog'; then
1464     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1465  else
1466     SYSLOGD=''
1467     [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1468     [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
1469     [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
1470     [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
1471     [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1472
1473     if [ -z "$SYSLOGD" ] ; then
1474        eerror "No syslog daemon found." ; eend 1
1475     else
1476        einfo "Starting $SYSLOGD in background."
1477        /etc/init.d/$SYSLOGD start >>$DEBUG &
1478        eend 0
1479     fi
1480  fi
1481 }
1482 # }}}
1483
1484 # {{{ gpm
1485 config_gpm(){
1486  if checkbootparam 'nogpm'; then
1487   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1488  else
1489    if ! [ -r /dev/input/mice ] ; then
1490       eerror "No mouse found - not starting GPM." ; eend 1
1491    else
1492       einfo "Starting gpm in background."
1493       /etc/init.d/gpm start >>$DEBUG &
1494       # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1495       eend 0
1496    fi
1497  fi
1498 }
1499 # }}}
1500
1501 # {{{ services
1502 config_services(){
1503  if checkbootparam 'services' ; then
1504     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1505     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1506     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1507     einfo "Starting service(s) ${SERVICENL} in background."
1508     for service in $(echo -e $SERVICELIST) ; do
1509        /etc/init.d/${service} start >>$DEBUG &
1510     done
1511     [ "$?" == "0" ] ; eend $?
1512  fi
1513 }
1514 # }}}
1515
1516 # {{{ remote files
1517 get_remote_file() {
1518   [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1519   SOURCE=$(eval echo "$1")
1520   TARGET="$2"
1521   getconfig() {
1522   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
1523        --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1524   }
1525   einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1526   counter=10
1527   while ! getconfig && [[ "$counter" != 0 ]] ; do
1528     echo -n "Sleeping for 1 second and trying to get config again... "
1529     counter=$(( counter-1 ))
1530     echo "$counter tries left" ; sleep 1
1531   done
1532   if [ -s "$TARGET" ] ; then
1533     einfo "Downloading was successfull." ; eend 0
1534     einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1535     md5sum ${TARGET} ; eend 0
1536     return 0;
1537   else
1538     einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1539     return 1;
1540  fi
1541 }
1542 # }}}
1543
1544 # {{{ config files
1545 config_netconfig(){
1546  if checkbootparam 'netconfig' ; then
1547   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1548   CONFIGFILE='/tmp/netconfig.grml'
1549
1550   if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1551     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1552   fi
1553
1554  fi
1555 }
1556 # }}}
1557
1558 # {{{ remote scripts
1559 config_netscript() {
1560  if checkbootparam 'netscript' ; then
1561   CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1562   SCRIPTFILE='/tmp/netscript.grml'
1563
1564   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1565     chmod +x ${SCRIPTFILE}
1566     einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1567   fi
1568
1569  fi
1570 }
1571 # }}}
1572
1573 # {{{ blindsound
1574 config_blindsound(){
1575  if checkbootparam 'blind' ; then
1576     beep
1577     flitewrapper "welcome to the gremel system"
1578  fi
1579 }
1580 # }}}
1581
1582 # {{{ welcome sound
1583 config_welcome(){
1584  if checkbootparam 'welcome' ; then
1585     flitewrapper "welcome to the gremel system"
1586  fi
1587 }
1588 # }}}
1589
1590 # {{{ fix/workaround for unionfs
1591 fix_unionfs(){
1592   if [ -z "$INSTALLED" ]; then
1593    touch /var/cache/apt/*cache.bin
1594   fi
1595 }
1596 # }}}
1597
1598 # {{{ start X window system via grml-x
1599 config_x_startup(){
1600 # make sure we start X only if startx is used *before* a nostartx option
1601 # so it's possible to disable automatic X startup using nostart
1602 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1603  if [ -x "$(which X)" ] ; then
1604   if [ -z "$INSTALLED" ] ; then
1605    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1606    if [ -z "$WINDOWMANAGER" ] ; then
1607      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1608      WINDOWMANAGER="wm-ng"
1609    else
1610      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1611    fi
1612    einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1613    config_userfstab || fstabuser='grml'
1614  cat>|/etc/init.d/xstartup<<EOF
1615 #!/bin/sh
1616 su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
1617 EOF
1618    chmod 755 /etc/init.d/xstartup
1619
1620    # adjust inittab for xstartup
1621    if grep -q '^6:' /etc/inittab ; then
1622       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
1623    else # just append tty6 to inittab if no definition is present:
1624       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1625    fi
1626
1627    /sbin/telinit q ; eend $?
1628
1629    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1630       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1631    else
1632       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1633    fi
1634
1635   else
1636     eerror "We are not running in live mode - startx will not work, skipping it."
1637     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1638   fi
1639  else
1640    eerror "/usr/X11R6/bin/X is not present on this grml flavour."
1641    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
1642  fi
1643 fi
1644 }
1645 # }}}
1646
1647 # {{{ configuration framework
1648 config_extract(){
1649 if checkbootparam 'extract' ; then
1650  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1651  EXTRACTOPTIONS="-- -x $EXTRACT"
1652 fi
1653 }
1654
1655 config_finddcsdir() {
1656 #  - If no GRMLCFG partition is found and noautoconfig is _not_ given
1657 #    on the command line, nothing is changed and the dcs files are
1658 #    searched within the .iso, $dcs-dir is set to the root directory
1659 #    within the .iso
1660 #  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1661 #    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1662 #    set, $dcs-dir is set to the root directory within the .iso.
1663 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
1664 #    foo, even if a GRMLCFG partition is present.
1665 DCSDIR=""
1666 DCSMP="/mnt/grml"
1667 # autoconfig, see issue673
1668 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1669 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1670 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1671   ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1672 else
1673   if [ -z "$INSTALLED" ] ; then
1674     if checkbootparam 'myconfig' ; then
1675       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1676       if [ -z "$DCSDEVICE" ]; then
1677         eerror "Error: No device for bootoption myconfig provided." ; eend 1
1678       fi # [ -z "$DCSDEVICE" ]
1679     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1680       einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1681       eindent
1682       # We do need the following fix so floppy disk is available to blkid in any case :-/
1683       if [ -r /dev/fd0 ] ; then
1684         einfo "Floppy device detected. Trying to access floppy disk."
1685         if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
1686            blkid /dev/fd0 >>$DEBUG 2>&1
1687         fi
1688       fi
1689       DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1690       if [ -n "$DCSDEVICE" ]; then
1691         DCSMP="/mnt/grmlcfg"
1692       fi
1693       eoutdent
1694     fi
1695
1696     # if not specified/present then assume default:
1697     if [ -z "$DCSDEVICE" ]; then
1698       DCSDIR="/live/image"
1699     else
1700       eindent
1701       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1702       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1703       if [ -n "$DCSDIR" ]; then
1704         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1705       else
1706         [ -d $DCSMP ] || mkdir $DCSMP
1707         umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1708         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
1709         if [[ $RC == 0 ]]; then
1710           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1711         else
1712           eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1713         fi
1714         DCSDIR="$DCSMP"
1715       fi
1716       eoutdent
1717     fi
1718   fi
1719 fi
1720
1721 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
1722   einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1723 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1724   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1725 fi
1726 }
1727
1728
1729 config_partconf() {
1730 if checkbootparam 'partconf' ; then
1731  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1732  if [ -n "$MOUNTDEVICE" ]; then
1733    [ -d /mnt/grml ] || mkdir /mnt/grml
1734    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1735     if [[ $RC == 0 ]]; then
1736       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1737       einfo "Copying files from $MOUNTDEVICE over grml system."
1738       for file in `cat /etc/grml/partconf` ; do
1739         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1740         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1741       done && eend 0
1742     else
1743       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1744     fi # mount $MOUNTDEVICE
1745    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1746  else
1747    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1748  fi # [ -n "$MOUNTDEVICE" ]
1749 fi
1750 }
1751 # }}}
1752
1753 # {{{ /cdrom/.*-options
1754 config_debs(){
1755 if checkbootparam 'debs' ; then
1756    iszsh && setopt localoptions shwordsplit
1757    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1758    if [ -z "$DEBS" ] ; then
1759       DEBS="*.deb"
1760    fi
1761    if ! echo $DEBS | grep -q '/'; then
1762      # backwards compatibility: if no path is given get debs from debs/
1763      DEBS="debs/$DEBS"
1764    fi
1765    einfo "Tring to install debian package(s) ${DEBS}"
1766    DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1767    dpkg -i $DEBS ; eend $?
1768 fi
1769 }
1770
1771 config_scripts(){
1772 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1773    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1774    if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1775      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1776    fi
1777    if ! echo $SCRIPTS | grep -q '/'; then
1778      # backwards compatibility: if no path is given get scripts from scripts/
1779      SCRIPTS="scripts/$SCRIPTS"
1780    fi
1781    if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1782      # we are executing from a GRMLCFG labeled fs
1783      # kick everything we have done before and start over
1784      SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1785    fi
1786    if [ -n "$SCRIPTS" ]; then
1787      SCRIPTS="${DCSDIR}/$SCRIPTS"
1788      if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1789        einfo "Trying to execute ${SCRIPTS}"
1790        sh -c $SCRIPTS
1791      elif [ -d "$SCRIPTS" ]; then
1792        einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1793        run-parts $SCRIPTS
1794      else
1795        einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1796        sh -c $SCRIPTS
1797      fi
1798    fi
1799 fi
1800 }
1801
1802 config_config(){
1803 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1804   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1805   if [ -z "$CONFIG" ]; then
1806     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1807   fi
1808   if [ -n "$CONFIG" ]; then
1809     if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1810       einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1811
1812       cp -a ${DCSDIR}/${CONFIG}/* /
1813     elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1814       einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1815
1816       cd /
1817       unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1818     else
1819       ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1820     fi
1821   fi
1822 fi
1823 }
1824 # }}}
1825
1826 # {{{ confing_umount_dcsdir
1827 config_umount_dcsdir(){
1828    # umount $DCSMP if it was mounted by finddcsdir
1829    grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1830 }
1831 # }}}
1832
1833 # {{{ mypath
1834 config_mypath(){
1835 if checkbootparam 'mypath' ; then
1836    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1837    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1838    touch /etc/grml/my_path
1839    chmod 644 /etc/grml/my_path
1840    # make sure the directories exist:
1841    eindent
1842    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1843        if ! [ -d "$i" ] ; then
1844           einfo "Creating directory $i"
1845           mkdir -p "$i" ; eend $?
1846        fi
1847    done
1848    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1849    eoutdent
1850 fi
1851 }
1852 # }}}
1853
1854 # {{{ distcc
1855 config_distcc(){
1856 if checkbootparam 'distcc' ; then
1857  OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1858  if [ -n "$OPTIONS" ]; then
1859     NET=""
1860     INTERFACE=""
1861     if [ -n "$OPTIONS" ]; then
1862       NET="${OPTIONS%%,*}"
1863       R="${OPTIONS#*,}"
1864       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1865         OPTIONS="$R"
1866         INTERFACE="${OPTIONS%%,*}"
1867         R="${OPTIONS#*,}"
1868       fi
1869     fi
1870  fi
1871  CONFIG=/etc/default/distcc
1872  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1873  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1874
1875  if [ -n "$INTERFACE" ] ; then
1876    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1877
1878    counter=10
1879    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1880      counter=$(( counter-1 ))
1881      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1882      sleep 3
1883      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1884    done
1885  fi
1886
1887  if [ -n "$IP" ] ; then
1888    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1889
1890    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1891    eindent
1892     id distccd >/dev/null 2>&1 || \
1893     (
1894       einfo "Creating distcc user" ; \
1895       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1896     )
1897
1898     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1899    /etc/init.d/distcc start >/dev/null ; eend $?
1900    eoutdent
1901  else
1902    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1903  fi
1904 fi
1905
1906 if checkbootparam 'gcc'; then
1907  GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
1908  eindent
1909  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1910  eoutdent
1911  rm -f /usr/bin/gcc
1912  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1913 fi
1914
1915 if checkbootparam 'gpp'; then
1916  GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
1917  eindent
1918   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1919   if [ -x /usr/bin/g++-${GPP} ] ; then
1920      rm -f /usr/bin/g++
1921      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1922   fi
1923   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1924   if [ -x /usr/bin/cpp-${GPP} ] ; then
1925      rm -f /usr/bin/cpp
1926      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1927   fi
1928  eoutdent
1929 fi
1930
1931 }
1932 # }}}
1933
1934 # {{{ load modules
1935 # Notice: use it only on live-cd system, if running from harddisk please
1936 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1937 # in /etc/runlevel.conf
1938 config_modules(){
1939 MODULES_FILE=/etc/grml/modules
1940 if checkbootparam 'nomodules' ; then
1941   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1942 elif [ -z "$INSTALLED" ]; then
1943  if [ -r $MODULES_FILE ] ; then
1944   einfo "Loading modules specified in ${MODULES_FILE}:"
1945   eindent
1946   grep '^[^#]' $MODULES_FILE | \
1947   while read module args; do
1948     [ "$module" ] || continue
1949       einfo "${module}"
1950       modprobe $module $args ; eend $?
1951   done
1952   eoutdent
1953  else
1954   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1955  fi
1956 fi
1957 }
1958 # }}}
1959
1960 # {{{ 915resolution
1961 config_915resolution(){
1962 if checkbootparam '915resolution' ; then
1963  OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)"
1964   if [ -x /usr/sbin/915resolution ]; then
1965     CMD=915resolution
1966     MODE=""
1967     XRESO=""
1968     YRESO=""
1969     if [ -n "$OPTIONS" ]; then
1970       # Extra options
1971       MODE="${OPTIONS%%,*}"
1972       R="${OPTIONS#*,}"
1973       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1974         OPTIONS="$R"
1975         XRESO="${OPTIONS%%,*}"
1976         R="${OPTIONS#*,}"
1977         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1978           OPTIONS="$R"
1979           YRESO="${OPTIONS%%,*}"
1980           R="${OPTIONS#*,}"
1981         fi
1982       fi
1983     fi
1984     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
1985     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
1986     eend 0
1987   fi
1988 fi
1989 }
1990 # }}}
1991
1992 # {{{ SW-RAID
1993 config_swraid(){
1994   [ -n "$INSTALLED" ] && return 0
1995
1996   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
1997   if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
1998      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
1999      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2000   else
2001     if ! [ -x /sbin/mdadm ] ; then
2002        eerror "mdadm not available, can not execute it." ; eend 1
2003     else
2004
2005        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2006        # find out whether we have a valid configuration file already
2007        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2008           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2009           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2010           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2011         else
2012           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2013        fi
2014
2015        if ! checkbootparam 'swraid' ; then
2016           eindent
2017           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2018           eoutdent
2019        else
2020           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2021           eindent
2022            IFSOLD=${IFS:-}
2023            IFS='
2024 '
2025            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2026                case $line in
2027                  *'No arrays found'*)
2028                    ewarn "$line" ; eend 0
2029                    ;;
2030                  *)
2031                    einfo "$line" ; eend 0
2032                    ;;
2033                esac
2034            done
2035            IFS=$IFSOLD
2036          eoutdent
2037
2038          if [ -r /proc/mdstat ] ; then
2039             eindent
2040             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2041             if [ -z "$MDSTAT" ] ; then
2042                ewarn "No active arrays found" ; eend 0
2043             else
2044                IFSOLD=${IFS:-}
2045                IFS='
2046 '
2047                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2048                    einfo "active arrays: $line" ; eend 0
2049                done
2050                IFS=$IFSOLD
2051             fi
2052             eoutdent
2053          fi # /proc/mdstat
2054        fi # bootoption swraid
2055
2056      fi # is /sbin/mdadm executable?
2057   fi # check for bootoptions
2058 }
2059 # }}}
2060
2061 # {{{ dmraid
2062 config_dmraid(){
2063   [ -n "$INSTALLED" ] && return 0
2064
2065   if checkbootparam 'nodmraid' ; then
2066     ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
2067     return 0
2068   fi
2069
2070   if ! [ -x /sbin/dmraid ] ; then
2071     eerror "dmraid not available, can not execute it." ; eend 1
2072     return
2073   fi
2074
2075   dmraid_wrapper() {
2076     # usage: dmraid_wrapper <dmraid_option>
2077     [ -n "$1" ] || return 1
2078
2079     IFSOLD=${IFS:-}
2080     IFS='
2081 '
2082     eindent
2083
2084     for line in $(dmraid $1 ; echo errcode:$?); do
2085       case $line in
2086         *'no block devices found'*)
2087           einfo "No block devices found" ; eend 0
2088           break
2089           ;;
2090         *'no raid disks'*)
2091           einfo "No active dmraid devices found" ; eend 0
2092           break
2093           ;;
2094         errcode:0)
2095           eend 0;
2096           ;;
2097         errcode:1)
2098           eend 1
2099           ;;
2100         *)
2101           einfo "$line"
2102           ;;
2103       esac
2104     done
2105
2106     eoutdent
2107     IFS=$IFSOLD
2108   }
2109
2110   if checkbootparam 'dmraid' ; then
2111     local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
2112     if [ "$ACTION" = "off" ] ; then
2113       # Deactivates all active software RAID sets:
2114       einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
2115       dmraid_wrapper -an
2116     else
2117       # Activate all software RAID sets discovered:
2118       einfo "Activating present dmraid sets (as requested via dmraid):"
2119       dmraid_wrapper -ay
2120     fi
2121
2122     return
2123   fi
2124
2125   # by default (no special bootoptions) discover all software RAID devices:
2126   einfo "Searching for any present dmraid sets:"
2127   dmraid_wrapper -r
2128 }
2129 # }}}
2130
2131 # {{{ LVM (Logical Volumes)
2132 config_lvm(){
2133   [ -n "$INSTALLED" ] && return 0
2134
2135   if checkbootparam 'nolvm' ; then
2136      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2137   else
2138     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2139     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2140        eerror "LVM not available, can not execute it." ; eend 1
2141     else
2142        if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
2143           einfo "You seem to have logical volumes (LVM) on your system."
2144           eindent
2145           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2146           eend 0
2147           if checkbootparam 'lvm' ; then
2148              einfo "Bootoption LVM found. Searching for logical volumes:"
2149              /etc/init.d/lvm2 start ; eend $?
2150           fi
2151           eoutdent
2152        fi
2153     fi # check for lvm binary
2154   fi # check for bootoption nolvm
2155 }
2156 # }}}
2157
2158 # {{{ debnet: setup network based on an existing one found on a partition
2159 config_debnet(){
2160 if checkbootparam 'debnet' ; then
2161  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2162  /usr/sbin/debnet
2163 fi
2164 }
2165 # }}}
2166
2167 # {{{ disable console blanking
2168 config_blanking(){
2169 if checkbootparam 'noblank' ; then
2170   einfo "Bootoption noblank found. Disabling monitor blanking."
2171   setterm -blank 0 ; eend $?
2172 fi
2173 }
2174 # }}}
2175
2176 # {{{ tohd= bootoption
2177 config_tohd()
2178 {
2179   if checkbootparam 'tohd' ; then
2180      local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2181      if [ -z "$TARGET" ] ; then
2182         eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2183         eerror "Please use something like tohd=/dev/sda9." ; eend 1
2184         return 1
2185      fi
2186
2187      if ! [ -b "$TARGET" ] ; then
2188         eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2189         return 1
2190      fi
2191
2192      if grep -q $TARGET /proc/mounts ; then
2193         eerror "$TARGET already mounted, skipping execution of tohd therefore."
2194         eend 1
2195         return 1
2196      fi
2197
2198      local MOUNTDIR=$(mktemp -d)
2199
2200      if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2201         einfo "Copyring live system to $TARGET - this might take a while"
2202         rsync -a --progress /live/image/live $MOUNTDIR
2203         sync
2204         umount "$MOUNTDIR"
2205         eend $?
2206         einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2207      else
2208         eerror "Error when trying to mount $TARGET, sorry."; eend 1
2209         return 1
2210      fi
2211
2212      rmdir "$MOUNTDIR"
2213   fi
2214 }
2215 # }}}
2216
2217 # {{{ grml2hd: automatic installation
2218 config_grml2hd(){
2219
2220 if checkbootparam "grml2hd" || checkbootparam "BOOT_IMAGE=grml2hd" ; then
2221
2222 if checkbootparam 'user' ; then
2223    NEWUSER=''
2224    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2225    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2226 fi
2227
2228 if checkbootparam 'filesystem' ; then
2229    FILESYSTEM=''
2230    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2231    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2232 fi
2233
2234 if checkbootparam 'partition' ; then
2235    PARTITION=''
2236    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2237    # notice: the following checks whether the given partition is available, if not the skip
2238    # execution of grml2hd as it might result in data loss...
2239    if [ -r $PARTITION ] ; then
2240       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2241    else
2242       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2243    fi
2244 fi
2245
2246 if checkbootparam 'mbr' ; then
2247    BOOT_PARTITION=''
2248    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2249    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2250 fi
2251
2252 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2253 #!/bin/sh
2254 GRML2HD_NONINTERACTIVE='yes' grml2hd
2255 EOF
2256
2257 chmod 755 /usr/bin/grml2hd_noninteractive
2258 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2259 if [ -z "$GRML2HD_FAIL" ] ; then
2260    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2261 else
2262    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2263 fi
2264
2265 fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
2266 }
2267 # }}}
2268
2269 # {{{ debootstrap: automatic installation
2270 config_debootstrap(){
2271
2272 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2273
2274 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2275
2276 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2277    eindent
2278    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2279    eoutdent
2280    exit 1
2281 fi
2282
2283 if checkbootparam 'target' ; then
2284   TARGET=''
2285   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2286   # notice: the following checks whether the given partition is available, if not the skip
2287   # execution of grml-debootstrap as it might result in data loss...
2288   if ! [ -r "$TARGET" ] ; then
2289      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2290   fi
2291 else
2292   eindent
2293   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2294   eoutdent
2295   exit 1
2296 fi
2297
2298 if checkbootparam 'grub' ; then
2299   GRUB=''
2300   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2301 fi
2302
2303 if checkbootparam 'groot' ; then
2304   GROOT=''
2305   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2306 fi
2307
2308 if checkbootparam 'release' ; then
2309   RELEASE=''
2310   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2311 fi
2312
2313 if checkbootparam 'mirror' ; then
2314   MIRROR=''
2315   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2316 fi
2317
2318 if checkbootparam 'boot_append' ; then
2319   BOOT_APPEND=''
2320   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2321 fi
2322
2323 if checkbootparam 'password' ; then
2324   PASSWORD=''
2325   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2326 fi
2327
2328 # now check which options are available
2329 if [ -n "TARGET" ] ; then
2330    TARGETCMD="--target $TARGET"
2331 else
2332    TARGETCMD=''
2333    eindent
2334    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2335    eoutdent
2336    exit 1
2337 fi
2338 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2339 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2340 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2341 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2342 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2343 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2344
2345 # and finally write script and execute it
2346 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2347 #!/bin/sh
2348 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2349 EOF
2350
2351 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2352
2353 screen /usr/bin/grml-debootstrap_noninteractive
2354 einfo "Invoking a shell, just exit to continue booting..."
2355 /bin/zsh
2356
2357 fi # checkbootparam "BOOT_IMAGE=debian2hd
2358 }
2359 # }}}
2360
2361 # {{{ Support customization
2362 config_distri(){
2363 if checkbootparam 'distri'; then
2364   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2365   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2366      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2367      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2368      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2369      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2370   fi
2371 fi
2372 }
2373 # }}}
2374
2375 ## END OF FILE #################################################################
2376 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3