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