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