config_acpi_apm(): redirect stderr of ps to debug log.
[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 2>>$DEBUG | 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     for service in $(echo -e $SERVICELIST) ; do
1443       # support running (custom) init scripts in non-blocking mode
1444       # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1445       if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1446         einfo "Starting service ${service}."
1447         /etc/init.d/${service} start >>$DEBUG
1448       else
1449         einfo "Starting service ${service} in background."
1450         /etc/init.d/${service} start >>$DEBUG &
1451       fi
1452     done
1453     eend $?
1454  fi
1455 }
1456 # }}}
1457
1458 # {{{ remote files
1459 get_remote_file() {
1460   [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1461   SOURCE=$(eval echo "$1")
1462   TARGET="$2"
1463   getconfig() {
1464   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
1465        --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1466   }
1467   einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1468   counter=10
1469   while ! getconfig && [[ "$counter" != 0 ]] ; do
1470     echo -n "Sleeping for 1 second and trying to get config again... "
1471     counter=$(( counter-1 ))
1472     echo "$counter tries left" ; sleep 1
1473   done
1474   if [ -s "$TARGET" ] ; then
1475     einfo "Downloading was successfull." ; eend 0
1476     einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1477     md5sum ${TARGET} ; eend 0
1478     return 0;
1479   else
1480     einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1481     return 1;
1482  fi
1483 }
1484 # }}}
1485
1486 # {{{ config files
1487 config_netconfig(){
1488  if checkbootparam 'netconfig' ; then
1489   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1490   CONFIGFILE='/tmp/netconfig.grml'
1491
1492   if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1493     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1494   fi
1495
1496  fi
1497 }
1498 # }}}
1499
1500 # {{{ remote scripts
1501 config_netscript() {
1502  if checkbootparam 'netscript' ; then
1503   CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1504   SCRIPTFILE='/tmp/netscript.grml'
1505
1506   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1507     chmod +x ${SCRIPTFILE}
1508     einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1509   fi
1510
1511  fi
1512 }
1513 # }}}
1514
1515 # {{{ blindsound
1516 config_blindsound(){
1517  if checkbootparam 'blind' ; then
1518     beep
1519     flitewrapper "welcome to the gremel system"
1520  fi
1521 }
1522 # }}}
1523
1524 # {{{ welcome sound
1525 config_welcome(){
1526  if checkbootparam 'welcome' ; then
1527     flitewrapper "welcome to the gremel system"
1528  fi
1529 }
1530 # }}}
1531
1532 # {{{ fix/workaround for unionfs
1533 fix_unionfs(){
1534   if [ -z "$INSTALLED" ]; then
1535    touch /var/cache/apt/*cache.bin
1536   fi
1537 }
1538 # }}}
1539
1540 # {{{ start X window system via grml-x
1541 config_x_startup(){
1542 # make sure we start X only if startx is used *before* a nostartx option
1543 # so it's possible to disable automatic X startup using nostart
1544 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1545  if [ -x "$(which X)" ] ; then
1546   if [ -z "$INSTALLED" ] ; then
1547    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1548    if [ -z "$WINDOWMANAGER" ] ; then
1549      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1550      WINDOWMANAGER="wm-ng"
1551    else
1552      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1553    fi
1554    einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1555    config_userfstab || fstabuser='grml'
1556  cat>|/etc/init.d/xstartup<<EOF
1557 #!/bin/sh
1558 su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
1559 EOF
1560    chmod 755 /etc/init.d/xstartup
1561
1562    # adjust inittab for xstartup
1563    if grep -q '^6:' /etc/inittab ; then
1564       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
1565    else # just append tty6 to inittab if no definition is present:
1566       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1567    fi
1568
1569    /sbin/telinit q ; eend $?
1570
1571    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1572       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1573    else
1574       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1575    fi
1576
1577   else
1578     eerror "We are not running in live mode - startx will not work, skipping it."
1579     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1580   fi
1581  else
1582    eerror "/usr/X11R6/bin/X is not present on this grml flavour."
1583    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
1584  fi
1585 fi
1586 }
1587 # }}}
1588
1589 # {{{ configuration framework
1590 config_extract(){
1591 if checkbootparam 'extract' ; then
1592  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1593  EXTRACTOPTIONS="-- -x $EXTRACT"
1594 fi
1595 }
1596
1597 config_finddcsdir() {
1598 #  - If no GRMLCFG partition is found and noautoconfig is _not_ given
1599 #    on the command line, nothing is changed and the dcs files are
1600 #    searched within the .iso, $dcs-dir is set to the root directory
1601 #    within the .iso
1602 #  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1603 #    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1604 #    set, $dcs-dir is set to the root directory within the .iso.
1605 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
1606 #    foo, even if a GRMLCFG partition is present.
1607 DCSDIR=""
1608 DCSMP="/mnt/grml"
1609 # autoconfig, see issue673
1610 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1611 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1612 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1613   ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1614 else
1615   if [ -z "$INSTALLED" ] ; then
1616     if checkbootparam 'myconfig' ; then
1617       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1618       if [ -z "$DCSDEVICE" ]; then
1619         eerror "Error: No device for bootoption myconfig provided." ; eend 1
1620       fi # [ -z "$DCSDEVICE" ]
1621     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1622       einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1623       eindent
1624       # We do need the following fix so floppy disk is available to blkid in any case :-/
1625       if [ -r /dev/fd0 ] ; then
1626         einfo "Floppy device detected. Trying to access floppy disk."
1627         if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
1628            blkid /dev/fd0 >>$DEBUG 2>&1
1629         fi
1630       fi
1631       DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1632       if [ -n "$DCSDEVICE" ]; then
1633         DCSMP="/mnt/grmlcfg"
1634       fi
1635       eoutdent
1636     fi
1637
1638     # if not specified/present then assume default:
1639     if [ -z "$DCSDEVICE" ]; then
1640       DCSDIR="/live/image"
1641     else
1642       eindent
1643       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1644       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1645       if [ -n "$DCSDIR" ]; then
1646         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1647       else
1648         [ -d $DCSMP ] || mkdir $DCSMP
1649         umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1650         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
1651         if [[ $RC == 0 ]]; then
1652           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1653         else
1654           eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1655         fi
1656         DCSDIR="$DCSMP"
1657       fi
1658       eoutdent
1659     fi
1660   fi
1661 fi
1662
1663 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
1664   einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1665 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1666   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1667 fi
1668 }
1669
1670
1671 config_partconf() {
1672 if checkbootparam 'partconf' ; then
1673  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1674  if [ -n "$MOUNTDEVICE" ]; then
1675    [ -d /mnt/grml ] || mkdir /mnt/grml
1676    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1677     if [[ $RC == 0 ]]; then
1678       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1679       einfo "Copying files from $MOUNTDEVICE over grml system."
1680       for file in `cat /etc/grml/partconf` ; do
1681         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1682         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1683       done && eend 0
1684     else
1685       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1686     fi # mount $MOUNTDEVICE
1687    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1688  else
1689    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1690  fi # [ -n "$MOUNTDEVICE" ]
1691 fi
1692 }
1693 # }}}
1694
1695 # {{{ /cdrom/.*-options
1696 config_debs(){
1697 if checkbootparam 'debs' ; then
1698    iszsh && setopt localoptions shwordsplit
1699    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1700    if [ -z "$DEBS" ] ; then
1701       DEBS="*.deb"
1702    fi
1703    if ! echo $DEBS | grep -q '/'; then
1704      # backwards compatibility: if no path is given get debs from debs/
1705      DEBS="debs/$DEBS"
1706    fi
1707    einfo "Tring to install debian package(s) ${DEBS}"
1708    DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1709    dpkg -i $DEBS ; eend $?
1710 fi
1711 }
1712
1713 config_scripts(){
1714 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1715    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1716    if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1717      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1718    fi
1719    if ! echo $SCRIPTS | grep -q '/'; then
1720      # backwards compatibility: if no path is given get scripts from scripts/
1721      SCRIPTS="scripts/$SCRIPTS"
1722    fi
1723    if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1724      # we are executing from a GRMLCFG labeled fs
1725      # kick everything we have done before and start over
1726      SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1727    fi
1728    if [ -n "$SCRIPTS" ]; then
1729      SCRIPTS="${DCSDIR}/$SCRIPTS"
1730      if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1731        einfo "Trying to execute ${SCRIPTS}"
1732        sh -c $SCRIPTS
1733      elif [ -d "$SCRIPTS" ]; then
1734        einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1735        run-parts $SCRIPTS
1736      else
1737        einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1738        sh -c $SCRIPTS
1739      fi
1740    fi
1741 fi
1742 }
1743
1744 config_config(){
1745 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1746   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1747   if [ -z "$CONFIG" ]; then
1748     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1749   fi
1750   if [ -n "$CONFIG" ]; then
1751     if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1752       einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1753
1754       cp -a ${DCSDIR}/${CONFIG}/* /
1755     elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1756       einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1757
1758       cd /
1759       unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1760     else
1761       ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1762     fi
1763   fi
1764 fi
1765 }
1766 # }}}
1767
1768 # {{{ confing_umount_dcsdir
1769 config_umount_dcsdir(){
1770    # umount $DCSMP if it was mounted by finddcsdir
1771    grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1772 }
1773 # }}}
1774
1775 # {{{ mypath
1776 config_mypath(){
1777 if checkbootparam 'mypath' ; then
1778    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1779    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1780    touch /etc/grml/my_path
1781    chmod 644 /etc/grml/my_path
1782    # make sure the directories exist:
1783    eindent
1784    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1785        if ! [ -d "$i" ] ; then
1786           einfo "Creating directory $i"
1787           mkdir -p "$i" ; eend $?
1788        fi
1789    done
1790    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1791    eoutdent
1792 fi
1793 }
1794 # }}}
1795
1796 # {{{ distcc
1797 config_distcc(){
1798 if checkbootparam 'distcc' ; then
1799  OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1800  if [ -n "$OPTIONS" ]; then
1801     NET=""
1802     INTERFACE=""
1803     if [ -n "$OPTIONS" ]; then
1804       NET="${OPTIONS%%,*}"
1805       R="${OPTIONS#*,}"
1806       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1807         OPTIONS="$R"
1808         INTERFACE="${OPTIONS%%,*}"
1809         R="${OPTIONS#*,}"
1810       fi
1811     fi
1812  fi
1813  CONFIG=/etc/default/distcc
1814  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1815  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1816
1817  if [ -n "$INTERFACE" ] ; then
1818    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1819
1820    counter=10
1821    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1822      counter=$(( counter-1 ))
1823      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1824      sleep 3
1825      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1826    done
1827  fi
1828
1829  if [ -n "$IP" ] ; then
1830    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1831
1832    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1833    eindent
1834     id distccd >/dev/null 2>&1 || \
1835     (
1836       einfo "Creating distcc user" ; \
1837       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1838     )
1839
1840     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1841    /etc/init.d/distcc start >/dev/null ; eend $?
1842    eoutdent
1843  else
1844    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1845  fi
1846 fi
1847
1848 if checkbootparam 'gcc'; then
1849  GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
1850  eindent
1851  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1852  eoutdent
1853  rm -f /usr/bin/gcc
1854  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1855 fi
1856
1857 if checkbootparam 'gpp'; then
1858  GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
1859  eindent
1860   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1861   if [ -x /usr/bin/g++-${GPP} ] ; then
1862      rm -f /usr/bin/g++
1863      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1864   fi
1865   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1866   if [ -x /usr/bin/cpp-${GPP} ] ; then
1867      rm -f /usr/bin/cpp
1868      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1869   fi
1870  eoutdent
1871 fi
1872
1873 }
1874 # }}}
1875
1876 # {{{ load modules
1877 # Notice: use it only on live-cd system, if running from harddisk please
1878 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1879 # in /etc/runlevel.conf
1880 config_modules(){
1881 MODULES_FILE=/etc/grml/modules
1882 if checkbootparam 'nomodules' ; then
1883   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1884 elif [ -z "$INSTALLED" ]; then
1885  if [ -r $MODULES_FILE ] ; then
1886   einfo "Loading modules specified in ${MODULES_FILE}:"
1887   eindent
1888   grep '^[^#]' $MODULES_FILE | \
1889   while read module args; do
1890     [ "$module" ] || continue
1891       einfo "${module}"
1892       modprobe $module $args ; eend $?
1893   done
1894   eoutdent
1895  else
1896   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1897  fi
1898 fi
1899 }
1900 # }}}
1901
1902 # {{{ 915resolution
1903 config_915resolution(){
1904 if checkbootparam '915resolution' ; then
1905  OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)"
1906   if [ -x /usr/sbin/915resolution ]; then
1907     CMD=915resolution
1908     MODE=""
1909     XRESO=""
1910     YRESO=""
1911     if [ -n "$OPTIONS" ]; then
1912       # Extra options
1913       MODE="${OPTIONS%%,*}"
1914       R="${OPTIONS#*,}"
1915       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1916         OPTIONS="$R"
1917         XRESO="${OPTIONS%%,*}"
1918         R="${OPTIONS#*,}"
1919         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1920           OPTIONS="$R"
1921           YRESO="${OPTIONS%%,*}"
1922           R="${OPTIONS#*,}"
1923         fi
1924       fi
1925     fi
1926     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
1927     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
1928     eend 0
1929   fi
1930 fi
1931 }
1932 # }}}
1933
1934 # {{{ SW-RAID
1935 config_swraid(){
1936   [ -n "$INSTALLED" ] && return 0
1937
1938   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
1939   if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
1940      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
1941      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1942   else
1943     if ! [ -x /sbin/mdadm ] ; then
1944        eerror "mdadm not available, can not execute it." ; eend 1
1945     else
1946
1947        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1948        # find out whether we have a valid configuration file already
1949        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1950           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1951           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1952           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1953         else
1954           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1955        fi
1956
1957        if ! checkbootparam 'swraid' ; then
1958           eindent
1959           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1960           eoutdent
1961        else
1962           einfo "Bootoption swraid found. Searching for software RAID arrays:"
1963           eindent
1964            IFSOLD=${IFS:-}
1965            IFS='
1966 '
1967            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1968                case $line in
1969                  *'No arrays found'*)
1970                    ewarn "$line" ; eend 0
1971                    ;;
1972                  *)
1973                    einfo "$line" ; eend 0
1974                    ;;
1975                esac
1976            done
1977            IFS=$IFSOLD
1978          eoutdent
1979
1980          if [ -r /proc/mdstat ] ; then
1981             eindent
1982             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1983             if [ -z "$MDSTAT" ] ; then
1984                ewarn "No active arrays found" ; eend 0
1985             else
1986                IFSOLD=${IFS:-}
1987                IFS='
1988 '
1989                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1990                    einfo "active arrays: $line" ; eend 0
1991                done
1992                IFS=$IFSOLD
1993             fi
1994             eoutdent
1995          fi # /proc/mdstat
1996        fi # bootoption swraid
1997
1998      fi # is /sbin/mdadm executable?
1999   fi # check for bootoptions
2000 }
2001 # }}}
2002
2003 # {{{ dmraid
2004 config_dmraid(){
2005   [ -n "$INSTALLED" ] && return 0
2006
2007   if checkbootparam 'nodmraid' ; then
2008     ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
2009     return 0
2010   fi
2011
2012   if ! [ -x /sbin/dmraid ] ; then
2013     eerror "dmraid not available, can not execute it." ; eend 1
2014     return
2015   fi
2016
2017   dmraid_wrapper() {
2018     # usage: dmraid_wrapper <dmraid_option>
2019     [ -n "$1" ] || return 1
2020
2021     IFSOLD=${IFS:-}
2022     IFS='
2023 '
2024     eindent
2025
2026     for line in $(dmraid $1 ; echo errcode:$?); do
2027       case $line in
2028         *'no block devices found'*)
2029           einfo "No block devices found" ; eend 0
2030           break
2031           ;;
2032         *'no raid disks'*)
2033           einfo "No active dmraid devices found" ; eend 0
2034           break
2035           ;;
2036         errcode:0)
2037           eend 0;
2038           ;;
2039         errcode:1)
2040           eend 1
2041           ;;
2042         *)
2043           einfo "$line"
2044           ;;
2045       esac
2046     done
2047
2048     eoutdent
2049     IFS=$IFSOLD
2050   }
2051
2052   if checkbootparam 'dmraid' ; then
2053     local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
2054     if [ "$ACTION" = "off" ] ; then
2055       # Deactivates all active software RAID sets:
2056       einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
2057       dmraid_wrapper -an
2058     else
2059       # Activate all software RAID sets discovered:
2060       einfo "Activating present dmraid sets (as requested via dmraid):"
2061       dmraid_wrapper -ay
2062     fi
2063
2064     return
2065   fi
2066
2067   # by default (no special bootoptions) discover all software RAID devices:
2068   einfo "Searching for any present dmraid sets:"
2069   dmraid_wrapper -r
2070 }
2071 # }}}
2072
2073 # {{{ LVM (Logical Volumes)
2074 config_lvm(){
2075   [ -n "$INSTALLED" ] && return 0
2076
2077   if checkbootparam 'nolvm' ; then
2078      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2079   else
2080     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2081     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2082        eerror "LVM not available, can not execute it." ; eend 1
2083     else
2084        if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
2085           einfo "You seem to have logical volumes (LVM) on your system."
2086           eindent
2087           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2088           eend 0
2089           if checkbootparam 'lvm' ; then
2090              einfo "Bootoption LVM found. Searching for logical volumes:"
2091              /etc/init.d/lvm2 start ; eend $?
2092           fi
2093           eoutdent
2094        fi
2095     fi # check for lvm binary
2096   fi # check for bootoption nolvm
2097 }
2098 # }}}
2099
2100 # {{{ debnet: setup network based on an existing one found on a partition
2101 config_debnet(){
2102 if checkbootparam 'debnet' ; then
2103  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2104  /usr/sbin/debnet
2105 fi
2106 }
2107 # }}}
2108
2109 # {{{ disable console blanking
2110 config_blanking(){
2111 if checkbootparam 'noblank' ; then
2112   einfo "Bootoption noblank found. Disabling monitor blanking."
2113   setterm -blank 0 ; eend $?
2114 fi
2115 }
2116 # }}}
2117
2118 # {{{ tohd= bootoption
2119 config_tohd()
2120 {
2121   if checkbootparam 'tohd' ; then
2122      local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2123      if [ -z "$TARGET" ] ; then
2124         eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2125         eerror "Please use something like tohd=/dev/sda9." ; eend 1
2126         return 1
2127      fi
2128
2129      if ! [ -b "$TARGET" ] ; then
2130         eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2131         return 1
2132      fi
2133
2134      if grep -q $TARGET /proc/mounts ; then
2135         eerror "$TARGET already mounted, skipping execution of tohd therefore."
2136         eend 1
2137         return 1
2138      fi
2139
2140      local MOUNTDIR=$(mktemp -d)
2141
2142      if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2143         einfo "Copyring live system to $TARGET - this might take a while"
2144         rsync -a --progress /live/image/live $MOUNTDIR
2145         sync
2146         umount "$MOUNTDIR"
2147         eend $?
2148         einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2149      else
2150         eerror "Error when trying to mount $TARGET, sorry."; eend 1
2151         return 1
2152      fi
2153
2154      rmdir "$MOUNTDIR"
2155   fi
2156 }
2157 # }}}
2158
2159 # {{{ grml2hd: automatic installation
2160 config_grml2hd(){
2161
2162 if checkbootparam "grml2hd" || checkbootparam "BOOT_IMAGE=grml2hd" ; then
2163
2164 if checkbootparam 'user' ; then
2165    NEWUSER=''
2166    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2167    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2168 fi
2169
2170 if checkbootparam 'filesystem' ; then
2171    FILESYSTEM=''
2172    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2173    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2174 fi
2175
2176 if checkbootparam 'partition' ; then
2177    PARTITION=''
2178    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2179    # notice: the following checks whether the given partition is available, if not the skip
2180    # execution of grml2hd as it might result in data loss...
2181    if [ -r $PARTITION ] ; then
2182       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2183    else
2184       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2185    fi
2186 fi
2187
2188 if checkbootparam 'mbr' ; then
2189    BOOT_PARTITION=''
2190    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2191    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2192 fi
2193
2194 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2195 #!/bin/sh
2196 GRML2HD_NONINTERACTIVE='yes' grml2hd
2197 EOF
2198
2199 chmod 755 /usr/bin/grml2hd_noninteractive
2200 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2201 if [ -z "$GRML2HD_FAIL" ] ; then
2202    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2203 else
2204    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2205 fi
2206
2207 fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
2208 }
2209 # }}}
2210
2211 # {{{ debootstrap: automatic installation
2212 config_debootstrap(){
2213
2214 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2215
2216 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2217
2218 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2219    eindent
2220    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2221    eoutdent
2222    exit 1
2223 fi
2224
2225 if checkbootparam 'target' ; then
2226   TARGET=''
2227   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2228   # notice: the following checks whether the given partition is available, if not the skip
2229   # execution of grml-debootstrap as it might result in data loss...
2230   if ! [ -r "$TARGET" ] ; then
2231      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2232   fi
2233 else
2234   eindent
2235   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2236   eoutdent
2237   exit 1
2238 fi
2239
2240 if checkbootparam 'grub' ; then
2241   GRUB=''
2242   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2243 fi
2244
2245 if checkbootparam 'groot' ; then
2246   GROOT=''
2247   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2248 fi
2249
2250 if checkbootparam 'release' ; then
2251   RELEASE=''
2252   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2253 fi
2254
2255 if checkbootparam 'mirror' ; then
2256   MIRROR=''
2257   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2258 fi
2259
2260 if checkbootparam 'boot_append' ; then
2261   BOOT_APPEND=''
2262   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2263 fi
2264
2265 if checkbootparam 'password' ; then
2266   PASSWORD=''
2267   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2268 fi
2269
2270 # now check which options are available
2271 if [ -n "TARGET" ] ; then
2272    TARGETCMD="--target $TARGET"
2273 else
2274    TARGETCMD=''
2275    eindent
2276    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2277    eoutdent
2278    exit 1
2279 fi
2280 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2281 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2282 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2283 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2284 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2285 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2286
2287 # and finally write script and execute it
2288 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2289 #!/bin/sh
2290 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2291 EOF
2292
2293 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2294
2295 screen /usr/bin/grml-debootstrap_noninteractive
2296 einfo "Invoking a shell, just exit to continue booting..."
2297 /bin/zsh
2298
2299 fi # checkbootparam "BOOT_IMAGE=debian2hd
2300 }
2301 # }}}
2302
2303 config_virtualbox_shared_folders() {
2304 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
2305   einfo "VirtualBox detected, trying to set up Shared Folders."
2306   if ! modprobe -l | grep -q vboxsf.ko ; then
2307     ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
2308     eend 0
2309   elif ! [ -x /usr/sbin/VBoxService ] ; then
2310     ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
2311     eend 0
2312   else
2313     eindent
2314
2315       einfo "Loading vboxsf driver."
2316       lsmod | grep -q vboxsf || modprobe vboxsf
2317       eend $?
2318
2319       einfo "Adjusting /dev/vboxguest."
2320       chown root:vboxsf /dev/vboxguest
2321       chmod 660 /dev/vboxguest
2322       eend $?
2323
2324       if [ -n "$CONFIG_FSTAB_USER" ] ; then
2325         fstabuser="$CONFIG_FSTAB_USER"
2326       else
2327         fstabuser=$(getent passwd 1000 | cut -d: -f1)
2328       fi
2329       einfo "Adding $fstabuser to group vboxsf."
2330       adduser grml vboxsf &>/dev/null
2331       eend $?
2332
2333       einfo "Starting VBoxService."
2334       VBoxService >/dev/null &
2335       eend $?
2336
2337     eoutdent
2338   fi
2339 fi
2340 }
2341
2342 # {{{ Support customization
2343 config_distri(){
2344 if checkbootparam 'distri'; then
2345   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2346   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2347      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2348      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2349      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2350      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2351   fi
2352 fi
2353 }
2354 # }}}
2355
2356 ## END OF FILE #################################################################
2357 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3