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