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