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