a010368be28a8ec7d9d40f8a9946bacf328a24e2
[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 2>>$DEBUG ; 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)
318  NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
319  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
320  CUR_CONSOLE=$(fgconsole)
321
322  if [ -n "$CHARMAP" ] ; then
323     einfo "Running consolechars for ${CHARMAP}"
324     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
325         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
326     done
327     [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
328     eend $RC
329  fi
330
331  if checkbootparam 'noconsolefont' ; then
332     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
333  else
334     if [ -n "$CONSOLEFONT" ] ; then
335        einfo "Running consolechars using ${CONSOLEFONT}"
336        for vc in `seq 0 ${NUM_CONSOLES}`  ; do
337            consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
338        done
339        [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
340        eend $?
341     fi
342  fi
343
344  eoutdent
345 }
346 # }}}
347
348 # {{{ Set hostname
349 config_hostname(){
350  if checkbootparam 'hostname' ; then
351   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
352   einfo "Setting hostname to $HOSTNAME as requested."
353   grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
354   [ "$RC" = "0" ] && hostname $HOSTNAME
355   eend $RC
356  else
357   hostname --file /etc/hostname
358  fi
359 }
360 # }}}
361
362 # fstabuser (needed when running from harddisk with username != grml {{{
363 config_userfstab(){
364   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
365   if [ -n "$CONFIG_FSTAB_USER" ] ; then
366      fstabuser="$CONFIG_FSTAB_USER"
367   else
368      fstabuser=$(getent passwd 1000 | cut -d: -f1)
369   fi
370   # if not yet set fall back to default 'grml' user
371   [ -n "$fstabuser" ] || fstabuser='grml'
372 }
373 # }}}
374
375 # {{{ Set clock (Local time is more often used than GMT, so it is default)
376 config_time(){
377  # don't touch the files if running from harddisk:
378  if [ -z "$INSTALLED" ]; then
379     # The default hardware clock timezone is stated as representing local time.
380     UTC="--localtime"
381     grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
382     checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
383     checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
384     checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|"  /etc/default/rcS
385     grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
386     # hwclock uses the TZ variable
387     KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
388     [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
389     if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
390        ewarn "Warning: unknown timezone $KTZ" ; eend 1
391        KTZ="Europe/Vienna"
392        ewarn "Falling back to timezone $KTZ" ; eend 0
393     fi
394
395     if ! [ -r /dev/rtc ] ; then
396       ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
397     fi
398
399     ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
400     if [ -n "$ERROR" ] ; then
401        eindent
402        ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
403        if [ -n "$ERROR" ] ; then
404           eerror "Problem running hwclock: $ERROR" ; eend 1
405        fi
406        eoutdent
407     fi
408
409  fi
410 }
411 # }}}
412
413 # {{{ print kernel info
414 config_kernel(){
415   vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
416   [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
417   einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
418   if [ -r /proc/cpuinfo ] ; then
419      if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
420        eindent
421        einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
422        eoutdent
423      fi
424   fi
425   if [ -d /proc/xen ] ; then
426      eindent
427      einfo 'Running kernel featuring support for Xen detected' ; eend 0
428      eoutdent
429   fi
430 }
431 # }}}
432
433 # {{{ vmware specific stuff
434 config_vmware(){
435 if checkbootparam 'novmware' ; then
436    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
437 else
438    if [ -z "$INSTALLED" ] ; then
439       if vmware-detect || checkbootparam "BOOT_IMAGE=vmware" ; then
440          if ! checkbootparam 'qemu' ; then
441             if [ -r /etc/X11/xorg.conf.vmware ] ; then
442                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
443                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
444             fi
445          fi
446       elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
447          if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
448             einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
449             cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
450          fi
451       fi
452    fi
453 fi
454 }
455 # }}}
456
457 # {{{ qemu specific stuff
458 config_qemu(){
459 if checkbootparam 'qemu' ; then
460    if [ -r /etc/X11/xorg.conf.example ] ; then
461       einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
462       cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
463    fi
464 fi
465 }
466 # }}}
467
468 # {{{ ld.so.cache + depmod
469 config_ld_mod(){
470 if [ -n "$INSTALLED" ]; then
471  if ! [ -r /etc/grml.first.boot ] ; then
472   einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
473   eindent
474 # Regenerate ld.so.cache and module dependencies on HD
475     einfo "Running ldconfig" ; ldconfig  ; eend $?
476     einfo "Running depmod"   ; depmod -a ; eend $?
477     touch /etc/grml.first.boot
478     eend 0
479   eoutdent
480  fi
481 fi
482 }
483 # }}}
484
485 # {{{ timezone
486 config_timezone(){
487  # don't touch the files if running from harddisk:
488  if [ -z "$INSTALLED" ]; then
489     KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
490     if [ -n "$KTZ" ] ; then
491        if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
492        then
493           ewarn "Warning: unknown timezone $KTZ"; eend 0
494        else
495           einfo "Setting timezone."
496           # update debconf
497           area=$(echo $KTZ | cut -d '/' -f1)
498           zone=$(echo $KTZ | cut -d '/' -f2)
499           echo "tzdata tzdata/Areas       select $area" | debconf-set-selections
500           echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
501           # update files
502           echo $KTZ > /etc/timezone
503           rm -f /etc/localtime
504           cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
505        fi
506     fi
507  fi
508 }
509 # }}}
510
511 # small computer / nearly no ram {{{
512 config_small(){
513
514 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
515 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
516 eindent
517
518 if checkbootparam 'small'; then
519   einfo "Information: ${RAM} kB of RAM available." ; eend 0
520   einfo "Bootoption small detected. Activating small system."
521   if [ -r /etc/inittab.small ] ; then
522     mv /etc/inittab /etc/inittab.normal
523     mv /etc/inittab.small /etc/inittab
524   else
525     sed -i 's/^9/#&/' /etc/inittab
526     sed -i 's/^10/#&/' /etc/inittab
527     sed -i 's/^11/#&/' /etc/inittab
528     sed -i 's/^12/#&/' /etc/inittab
529   fi
530   /sbin/telinit q ; eend $?
531 else
532   if checkgrmlsmall ; then
533     if [[ $RAM -lt 25000 ]] ; then
534       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
535       ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
536       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
537       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
538       /bin/zsh --login
539     else
540       einfo "Information: ${RAM} kB of RAM available." ; eend 0
541     fi
542   else
543     if [[ $RAM -lt 58000 ]] ; then
544       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
545       ewarn "At least 64MB of RAM should be available for grml." ; eend 1
546       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
547       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
548       /bin/zsh --login
549     else
550       einfo "Information: ${RAM} kB of RAM available." ; eend 0
551     fi
552   fi
553 fi
554 eoutdent
555 }
556 # }}}
557
558 # skip startup of w3m {{{
559 config_fast(){
560 if checkbootparam 'fast'; then
561   ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
562     sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
563   /sbin/telinit q ; eend $?
564 fi
565 }
566 # }}}
567
568 # activate serial console {{{
569 config_console(){
570 if checkbootparam 'console'; then
571   einfo "Bootoption (for serial) console detected."
572   eindent
573     if [ -r /etc/mgetty/mgetty.config ] ; then
574        MODE=$(getbootparam 'console' | awk -F, '{print $2}')
575        MODE=${MODE%%n*}
576        [ -n "$MODE" ] || MODE=9600 # default mode
577        einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
578        sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
579     fi
580
581     einfo "Activating mgetty."
582     sed -i 's/^#T0/T0/' /etc/inittab
583     sed -i 's/^#T1/T1/' /etc/inittab
584     /sbin/telinit q ; eend $?
585   eoutdent
586 fi
587 }
588 # }}}
589
590 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
591 config_cdrom_perm(){
592 CDROMS=""
593 for DEVICE in /proc/ide/hd?; do
594  [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
595 done
596 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
597 }
598 # }}}
599
600 # {{{ Bring up loopback interface now
601 config_local_net(){
602  if [ -z "$INSTALLED" ] ; then
603     if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
604        grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
605     else
606        ifconfig lo up
607     fi
608  fi
609 }
610 # }}}
611
612 # firewire devices {{{
613 # the raw1394 driver does not yet export info into SYSFS,
614 # so let's create raw1394 device manually
615 # http://www.michael-prokop.at/blog/index.php?p=352
616 config_firewire_dev(){
617 if checkbootparam 'nofirewiredev' ; then
618   ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
619 else
620 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
621   einfo "Creating some firewire devices (fix kernel 2.6-bug)."
622 #  cd /dev && MAKEDEV video1394 raw1394
623   [ -r /dev/raw1394 ]   || mknod /dev/raw1394 c 171 0
624   [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
625 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
626   [ -r /dev/dv1394 ]    || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
627   chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
628   chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
629 fi
630 #fi
631 }
632 # }}}
633
634 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
635 # otherwise we will get: passwd: Authentication token lock busy
636 config_fix_passwd(){
637  if [ -z "$INSTALLED" ] ; then
638   touch /etc/.pwd.lock
639  fi
640 }
641 # }}}
642
643 # {{{ CD Checker
644 config_testcd(){
645 if [ -n "$TESTCD" ]; then
646    einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
647    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
648    echo -n "${RED}"
649
650    if [ -n "${LIVECD_PATH}"/GRML ] ; then
651       ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
652    else
653       echo "${RED} *** Error: Could not find md5sum file.                           ***"
654    fi
655
656    if [ "$RC" = "0" ]; then
657       einfo "Everything looks OK" ; eend 0
658    else
659       eerror 'Checksum failed for theses files:' ; eend 1
660       egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
661       eerror 'Data on the grml medium is possibly incomplete/damaged or...'
662       eerror '... RAM of your computer is broken.' ; eend 1
663       einfon "Hit return to continue, or press the reset button to quit."
664      read a
665    fi
666
667    eend 0
668 fi
669 }
670 # }}}
671
672 # {{{ hardware detection via discover
673 config_discover(){
674 if checkbootparam 'nodisc' ; then
675   ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
676 else
677  if [ -x /sbin/discover ] ; then
678   einfo "Discovering hardware. Trying to load the following modules in background:"
679    eindent
680    einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
681    eoutdent
682   /sbin/discover-modprobe -v >>$DEBUG 2>&1 &
683   eend 0
684  else
685   eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
686  fi
687 fi
688 }
689 # }}}
690
691 # {{{ hardware detection via hwinfo
692 config_hwinfo(){
693 if checkbootparam 'hwinfo' >>$DEBUG 2>&1; then
694   einfo "Discovering hardware via hwinfo:"
695   MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
696   echo -n "  Loading modules: "
697   for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
698   eend 0
699 fi
700 }
701 # }}}
702
703 # {{{ disable hotplug agents on request
704 config_hotplug_agent(){
705 if checkbootparam 'noagent' ; then
706   AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
707   AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
708   AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
709   einfo "Disabling hotplug-agent(s) $AGENTNL"
710   for agent in $(echo -e $AGENTLIST) ; do
711     mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
712   done
713   [ "$?" == "0" ] ; eend $?
714 fi
715 }
716 # }}}
717
718 # {{{ blacklist of hotplug-modules
719 config_hotplug_blacklist(){
720 if checkbootparam 'black' ; then
721   BLACK="$(getbootparam 'black' 2>>$DEBUG)"
722   BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
723   BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
724   einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
725   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
726   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
727   eend 0
728 fi
729 }
730 # }}}
731
732 # {{{ run hotplug
733 config_hotplug(){
734 if checkbootparam 'nohotplug' ; then
735   ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
736 else
737   if [ -r /etc/init.d/hotplug ] ; then
738     einfo "Starting hotplug system in background."
739     /etc/init.d/hotplug start >>$DEBUG 2>>$DEBUG &
740     eend 0
741   elif [ -r /etc/init.d/hotplug-light ] ; then
742     einfo "Starting hotplug-light system in background."
743     /etc/init.d/hotplug-light start >>$DEBUG 2>>$DEBUG &
744     eend 0
745   else
746     ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
747   fi
748 fi
749 }
750 # }}}
751
752 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
753 config_blacklist(){
754 if checkbootparam 'blacklist' ; then
755  if [ -z "$INSTALLED" ]; then
756   einfo "Bootoption blacklist found."
757   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
758   BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
759   if [ -n "$BLACK" ] ; then
760     for module in $(echo ${BLACK//,/ }) ; do
761         einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
762         echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
763         echo "blacklist $module"     >> "$BLACKLIST_FILE"
764         echo "alias     $module off" >> "$BLACKLIST_FILE"
765         echo "# end   entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
766     done
767   else
768    eerror "No given module for blacklist found. Blacklisting will not work therefore."
769   fi
770  else
771   ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
772   eindent
773    einfo "Please blacklist the module(s) manually using the 'blacklist' script."
774   eoutdent
775  fi
776 fi
777 }
778 # }}}
779
780 # {{{ ACPI
781 config_acpi_apm(){
782 if [ -d /proc/acpi ]; then
783   if checkbootparam 'noacpi'; then
784     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
785   elif checkbootparam 'nogrmlacpi' ; then
786     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
787   else
788     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
789     eindent
790     found=""
791     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
792       basename="${a##*/}"
793       basename="${basename%%.*}"
794       case "$basename" in *_acpi)
795        egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
796       esac
797       modprobe $basename >>$DEBUG 2>&1 && found="yes"
798       local BASE="$BASE $basename"
799     done
800     if [ -n "$found" ] ; then
801       einfo "$BASE"  ; eend 0
802     else
803       ewarn "(none)" ; eend 1
804     fi
805     if ! ps x | grep -q /usr/sbin/acpid ; then
806       if ! [ -r /var/run/dbus/pid ] ; then
807         einfo "Starting acpi daemon."
808         /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
809       else
810         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
811         eerror "Solution: please activate acpid via /etc/runlevel.conf"
812         eend 1
813       fi
814     else
815       ewarn "acpi daemon already running."
816       eend 0
817     fi
818     eoutdent
819   fi
820 else
821 # APM
822   if checkbootparam 'noapm'; then
823     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
824   else
825     modprobe apm power_off=1 >>$DEBUG 2>&1
826     if [ "$?" = "0" ] ; then
827        if [ -x /etc/init.d/apmd ] ;then
828           einfo "APM Bios found, enabling power management functions."
829           /etc/init.d/apmd start ; eend $?
830        fi
831     else
832       eerror "Loading apm module failed." ; eend 1
833     fi
834   fi
835 fi
836 }
837 # }}}
838
839 # {{{ PCMCIA Check/Setup
840 # This needs to be done before other modules are being loaded (by hwsetup)
841 config_pcmcia(){
842 if checkbootparam 'nopcmcia'; then
843   ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
844 else
845   if /usr/sbin/laptop-detect ; then
846     einfo "Detected Laptop - checking for PCMCIA." && eend 0
847     modprobe pcmcia_core >>$DEBUG 2>&1
848     # Try Cardbus or normal PCMCIA socket drivers
849     modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
850     if [ "$?" = "0" ]; then
851       modprobe ds >>$DEBUG 2>&1
852       if [ -d /proc/bus/pccard ] ; then
853        if [ -x /sbin/cardmgr ] ; then
854         einfo "PCMCIA found, starting cardmgr."
855         cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
856        else
857         eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
858        fi
859       fi
860     fi
861   fi
862 fi
863 }
864 # }}}
865
866 # {{{ run software synthesizer via speakup
867 config_swspeak(){
868    if checkbootparam 'swspeak' ; then
869       einfo "Bootoption swspeak found."
870
871       if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
872          ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
873          eindent
874          einfo "Loading speakup_soft"
875          if modprobe speakup_soft ; then
876             eend 0
877          else
878             flitewrapper "Fatal error setting up software speakup"
879             eend 1
880             return 1
881          fi
882          eoutdent
883       fi
884
885       if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
886          einfo "Kernel supports speakup." ; eend 0
887          eindent
888             einfo "Just run swspeak if you want to use software synthesizer via speakup."
889             flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
890          eoutdent
891       else
892          eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
893          flitewrapper "Kernel does not seem to support speakup. Sorry."
894       fi
895    fi
896 }
897 # }}}
898
899 # {{{ support hardware synthesizer via speakup
900 config_hwspeak(){
901    if checkbootparam 'speakup.synth' ; then
902       einfo "Bootoption speakup.synth found."
903       eindent
904
905       module="$(getbootparam 'speakup.synth' 2>>$DEBUG)"
906       if [ -z "$module" ] ; then
907          eerror "Sorry, no speakup module specified for bootoption speakup.synth."
908          flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
909       else
910          einfo "Trying to load $module"
911          modprobe "speakup_${module}"
912          eend $?
913       fi
914
915       if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
916          einfo "Kernel should support speakup now." ; eend 0
917          flitewrapper "Kernel should support speakup now."
918       else
919          eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
920          flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
921       fi
922
923       eoutdent
924
925    # hwspeak:
926    elif checkbootparam 'hwspeak' ; then
927       einfo "Bootoption hwspeak found."
928
929       if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
930          ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
931          eindent
932          if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
933             eerror "Kernel does not provide speakup modules, sorry." ; eend 1
934          else
935            for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
936                            sed 's#.*speakup/##g ; s#.ko$##g' | \
937                            grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
938               einfo "Trying to load $module"
939               modprobe $module
940               eend $?
941            done
942          fi
943          eoutdent
944       fi
945
946       if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
947          einfo "Kernel should support speakup now." ; eend 0
948          flitewrapper "Kernel should support speakup now."
949       else
950          eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
951          flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
952       fi
953    fi
954 }
955 # }}}
956
957 # {{{ Check for blind option or brltty
958 config_blind(){
959 BLIND=""
960 checkbootparam 'blind' && BLIND="yes"
961 BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)"
962
963 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
964   if [ -x /sbin/brltty ]; then
965     # Blind option detected, start brltty now.
966     # modprobe serial_core parport_serial generic_serial && echo "done"
967     CMD=brltty
968     BRLTYPE=""
969     BRLDEV=""
970     BRLTEXT=""
971     if [ -n "$BRLTTY" ]; then
972       # Extra options
973       BRLTYPE="${BRLTTY%%,*}"
974       R="${BRLTTY#*,}"
975       if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
976         BRLTTY="$R"
977         BRLDEV="${BRLTTY%%,*}"
978         R="${BRLTTY#*,}"
979         if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
980           BRLTTY="$R"
981           BRLTEXT="${BRLTTY%%,*}"
982           R="${BRLTTY#*,}"
983         fi
984       fi
985     fi
986     [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
987     [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
988     [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
989     einfo "Starting braille-display manager."
990 #    ( exec $CMD & )
991     ( sh -c "$CMD" & )
992     sleep 2 && BLINDSOUND="yes"
993     eend 0
994   fi
995 fi
996 }
997 # }}}
998
999 # {{{ Interactive configuration
1000 config_interactive(){
1001   ewarn "config_interactive is deprecated nowadays."
1002   ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
1003 }
1004 # }}}
1005
1006 # {{{ AGP
1007 config_agp(){
1008 if checkbootparam 'forceagp' ; then
1009 # Probe for AGP. Hope this can fail safely
1010   grep -q "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
1011 fi
1012 }
1013 # }}}
1014
1015 # {{{ automount(er)
1016 config_automounter(){
1017 if checkbootparam 'automounter' ; then
1018   RUNLEVEL="$(runlevel)"
1019   AUTOMOUNTER=""
1020   [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
1021
1022 addautomount(){
1023 # /dev/ice  options
1024   d="${1##*/}"
1025   if [ -n "$AUTOMOUNTER" ]; then
1026     [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
1027     [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
1028     [ -L "/mnt/$d" ]      || ln -s "/mnt/auto/$d" "/mnt/$d"
1029     anew="$d        -fstype=auto,$2 :$i"
1030     grep -q "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
1031     AUTOMOUNTS="$AUTOMOUNTS $d"
1032     new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
1033   else
1034     [ -d /mnt/$d ] && mkdir -p /mnt/$d
1035     new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
1036   fi
1037   grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
1038 }
1039
1040   AUTOMOUNTS="floppy cdrom"
1041 # Add new devices to /etc/fstab and /etc/auto.mnt
1042   for i in /dev/cdrom?*; do
1043     if [ -L $i ]; then
1044       addautomount "$i" "ro"
1045     fi
1046   done
1047 fi
1048
1049 if [ -n "$AUTOMOUNTER" ]; then
1050 # Check for floppy dir, reinstall with automounter
1051   [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
1052   [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
1053   [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
1054   [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
1055   [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
1056   [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
1057   rm -f /etc/fstab.new
1058 # Replace paths from bootfloppy
1059   sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
1060   mv -f /etc/fstab.new /etc/fstab
1061 # Start automounter now
1062   einfo "Starting automounter for ${AUTOMOUNTS}."
1063   /etc/init.d/autofs start >>$DEBUG ; eend $?
1064 fi
1065 }
1066 # }}}
1067
1068 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1069 check_partitions(){
1070 partitions=""
1071 IDEDISKS=""
1072 while read major minor blocks partition relax; do
1073   partition="${partition##*/}"
1074   [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1075   case "$partition" in
1076     hd?) IDEDISKS="$IDEDISKS $partition";;                # IDE  Harddisk, entire disk
1077     sd?) ;;                                               # SCSI Harddisk, entire disk
1078 #    [hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
1079     [hs]d*|ub*) partitions="$partitions /dev/$partition";;    # IDE, USB or SCSI disk partition
1080   esac
1081 done <<EOT
1082 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1083 EOT
1084 }
1085 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1086 # }}}
1087
1088 # {{{ Enable DMA for all IDE drives now if not disabled
1089 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1090 config_dma(){
1091 if checkbootparam 'nodma'; then
1092   ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1093 else
1094   for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1095     if test -d /proc/ide/$d; then
1096       if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1097         MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1098         test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1099         einfo "Enabling DMA acceleration for: ${WHITE}$d        ${YELLOW}[${MODEL}]${NORMAL}"
1100         echo "using_dma:1" >/proc/ide/$d/settings
1101         eend 0
1102       fi
1103     fi
1104   done
1105 fi
1106 }
1107 # }}}
1108
1109 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1110 config_fstab(){
1111
1112 NOSWAP="yes" # we do not use swap by default!
1113 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
1114    NOSWAP=''
1115    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
1116 fi
1117
1118 if checkbootparam 'nofstab' || checkbootparam 'forensic' ; then
1119   ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1120 else
1121   einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1122   iszsh && setopt nonomatch
1123   if [ -x /usr/sbin/rebuildfstab ] ; then
1124      config_userfstab || fstabuser=grml
1125      /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1126   else
1127      ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1128   fi
1129 fi # checkbootparam nofstab/forensic
1130
1131 # Scan for swap, config, homedir - but only in live-mode
1132 if [ -z "$INSTALLED" ] ; then
1133    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1134    GRML_IMG=""
1135    GRML_SWP=""
1136    HOMEDIR="$(getbootparam 'home')"
1137    if [ -n "$partitions" ]; then
1138       while read p m f relax; do
1139         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1140         partoptions="users,exec"
1141         fnew=""
1142         # it's a swap partition?
1143         case "$f" in swap)
1144           eindent
1145           if [ -n "$NOSWAP" ]; then
1146              ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1147              eend 0
1148           else
1149              case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1150                    S1SUSP|S2SUSP|pmdisk|[zZ]*)
1151                      if [ -n "$ANYSWAP" ] ; then
1152                         einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1153                         swapon $p 2>>$DEBUG ; eend $?
1154                      else
1155                         ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1156                      fi
1157                      ;;
1158                    *)
1159                      if [[ "$p" == LABEL* ]] ; then
1160                         p=$(blkid -t $p | awk -F: '{print $1}')
1161                      fi
1162                      if grep -q $p /proc/swaps ; then
1163                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1164                      else
1165                         if [ -b "$p" ] ; then
1166                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1167                         swapon $p 2>>$DEBUG ; eend $?
1168                         else
1169                         ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1170                         fi
1171                      fi
1172                      ;;
1173              esac # dd-check
1174           fi # -n "$NOSWAP
1175           eoutdent
1176           continue
1177           ;;
1178         esac # it's a swap partition?
1179
1180         # mount read-only
1181         MOUNTOPTS="ro"
1182         case "$f" in
1183           vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1184           ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1185           *) continue ;;
1186           # *) NONEFOUND='1'; continue ;;
1187         esac
1188
1189         # use a swapfile
1190         if [ -z "$NOSWAP" ] ; then
1191            mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1192            # Activate swapfile, if exists
1193            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1194         fi
1195         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1196            mount -o remount,rw $m && MOUNTED=1
1197            if swapon "$SWAPFILE" 2>>$DEBUG ; then
1198               eindent
1199                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1200               eoutdent
1201               fnew="$SWAPFILE swap swap defaults 0 0"
1202               grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1203               GRML_SWP="$GRML_SWP $SWAPFILE"
1204               eend 0
1205            fi
1206            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1207         fi
1208
1209         # use a image as home
1210         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1211         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1212            if [ -n "$HOMEDIR" ]; then
1213               if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1214                  continue
1215               fi
1216            fi
1217            if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1218               GRML_IMG="$IMAGE"
1219               mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1220            fi
1221         fi
1222         eend 0
1223
1224         # Umount, if not in use
1225         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1226
1227       done <<EOT
1228       $(cat /etc/fstab)
1229 EOT
1230    fi # -n $partitions
1231 fi # -z $INSTALLED
1232 }
1233 # }}}
1234
1235 # {{{ Mouse
1236 config_mouse(){
1237 if [ -n "$MOUSE_DEVICE" ] ; then
1238   einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1239 fi
1240 }
1241 # }}}
1242
1243 # {{{ IPv6 configuration
1244 # Load IPv6 kernel module and print IP adresses
1245 config_ipv6(){
1246 if checkbootparam 'ipv6'; then
1247   einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1248   modprobe ipv6
1249   # we probably need some time until stateless autoconfiguration has happened
1250   sleep 2
1251   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1252   for DEVICE in `echo "$NETDEVICES"`; do
1253     eindent
1254       einfo "$DEVICE:"
1255       ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1256       COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1257       eindent
1258         for ADDR in `echo "$ADDRESSES"` ; do
1259             einfo "$ADDR"
1260         done
1261         if [ "$COUNT" -eq "0" ] ; then
1262            einfo "(none)" ; eend 1
1263         fi
1264       eoutdent
1265     eoutdent
1266   done
1267   eend 0
1268 fi
1269 }
1270 # }}}
1271
1272 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1273 config_dhcp(){
1274 if checkbootparam 'nodhcp'; then
1275   ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1276 else
1277   NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1278   rm -rf /etc/network/status ; mkdir -p /etc/network/status
1279   for DEVICE in `echo "$NETDEVICES"` ; do
1280     einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1281     trap 2 3 11
1282     ifconfig $DEVICE up >>$DEBUG 2>&1
1283     ( pump -i $DEVICE --script=/usr/lib/grml-autoconfig/pump-runparts >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1284     trap "" 2 3 11
1285     sleep 1
1286     eend 0
1287   done
1288   if [ -n "$INSTALLED" ] ; then
1289      ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1290      eend 0
1291   fi
1292 fi
1293 }
1294 # }}}
1295
1296 # {{{ helper functions
1297 findfile(){
1298 FOUND=""
1299 # search all partitions for a file in the root directory
1300 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1301 # See if it's already mounted
1302   [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
1303   if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1304     [ -f "$i/$1" ] && FOUND="$i/$1"
1305     umount -l "$i" 2>>$DEBUG
1306     [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1307   fi
1308 done
1309 return 2
1310 }
1311
1312 fstype(){
1313 case "$(file -s $1)" in
1314   *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1315   *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
1316   *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
1317   *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1318   *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1319   *data*)          echo "invalid"; return 0;;
1320   *) echo "auto"; return 0;;
1321 esac
1322 }
1323
1324 # Try to mount this filesystem read-only, without or with encryption
1325 trymount(){
1326 # Check if already mounted
1327 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1328 # Apparently, mount-aes DOES autodetect AES loopback files.
1329 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1330 # We need to mount crypto-loop files with initial rw support
1331 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1332 # Mount succeeded?
1333 [ "$RC" = "0" ] && return 0
1334 echo ""
1335 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1336 a="y"
1337 while [ "$a" != "n" -a "$a" != "N" ]; do
1338 # We need to mount crypto-loop files with initial rw support
1339  mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1340  echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1341  # Problem with ioctl() from getpasswd()?
1342  # read a
1343  read a
1344 done
1345 return 1
1346 }
1347 # }}}
1348
1349 # {{{ CPU-detection
1350 config_cpu(){
1351 if checkbootparam 'nocpu'; then
1352   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1353 else
1354   # check module dependencies
1355   cpufreq_check() {
1356    if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1357       if [ -e /lib64 ] ; then
1358          [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1359       else
1360          [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1361       fi
1362    fi
1363   }
1364
1365   if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1366      einfo "Detecting CPU:"
1367      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)
1368      echo $CPU | sed 's/ \{1,\}/ /g'
1369      eend 0
1370   else
1371      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
1372   fi
1373
1374   # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1375   # * it only if we have the according kernel modules available
1376   # * cpufreq not inside Virtual Box
1377   # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1378   #   -> parse output of the initscript and output it according to our look'n'feel
1379   # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1380   if ! cpufreq_check ; then
1381     ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1382   else
1383      # Virtual Box supports ACPI and laptop-detect would return with '0', so check for it:
1384      if [ -r /proc/acpi/battery/BAT0/info ] ; then
1385         if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
1386            einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1387            return 0
1388         fi
1389      fi
1390      einfo "Trying to set up cpu frequency scaling:"
1391      eindent
1392      if [ -x /etc/init.d/loadcpufreq ] ; then
1393         SKIP_CPU_GOVERNOR=''
1394         LOADCPUFREQ=$(mktemp)
1395         /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1396         if grep -q FATAL "$LOADCPUFREQ" ; then
1397            eindent
1398              SKIP_CPU_GOVERNOR=1
1399              oldIFS="$IFS"
1400              IFS="
1401 "
1402               for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1403                   eerror "$line" ; eend $RC
1404               done
1405               IFS="$oldIFS"
1406            eoutdent
1407          elif grep -q done "$LOADCPUFREQ" ; then
1408            MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1409            if [ -n "$MODULE" -a "$MODULE" != none ]; then
1410               einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1411            else
1412               ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1413            fi
1414         fi
1415         rm -f $LOADCPUFREQ
1416      elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1417         . /usr/bin/cpufreq-detect.sh
1418         if [ -n "$MODULE" -a "$MODULE" != none ]; then
1419            einfo "Loading modules ${MODULE}"
1420            modprobe "$MODULE" >>$DEBUG || modprobe "$MODULE_FALLBACK" >>$DEBUG
1421            RC=$?
1422            if [[ $RC == 0 ]]; then
1423               eend 0
1424            else
1425               SKIP_CPU_GOVERNOR=1
1426               eend $RC
1427            fi
1428         else
1429            ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping."
1430            eend 1
1431         fi # $MODULE
1432      fi # loadcpufreq
1433
1434      if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1435         einfo "Loading cpufreq_ondemand, setting ondemand governor"
1436         if modprobe cpufreq_ondemand ; RC=$? ; then
1437            for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1438                echo ondemand > $file
1439            done
1440         fi
1441         eend $RC
1442      fi # cpu-governor
1443
1444      eoutdent
1445
1446   fi # cpufreq_check
1447 fi # checkbootparam nocpu
1448 }
1449 # }}}
1450
1451 # {{{ autostart of ssh
1452 config_ssh(){
1453 if checkbootparam 'ssh' ; then
1454    SSH_PASSWD=''
1455    SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1456    einfo "Bootoption ssh found, trying to set password for user grml."
1457    eindent
1458    if [ -z "$SSH_PASSWD" ] ; then
1459       if [ -x /usr/bin/apg ] ; then
1460          SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1461       elif [ -x /usr/bin/gpw ] ; then
1462          SSH_PASSWD="$(gpw 1)"
1463       elif [ -x /usr/bin/pwgen ] ; then
1464          SSH_PASSWD="$(pwgen -1 8)"
1465       elif [ -x /usr/bin/hexdump ] ; then
1466          SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1467       elif [ -n "$RANDOM" ] ; then
1468          SSH_PASSWD="grml${RANDOM}"
1469       else
1470          SSH_PASSWD=''
1471          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1472          eend 1
1473       fi
1474
1475       if [ -n "$SSH_PASSWD" ] ; then
1476          ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1477       fi
1478    fi
1479    eoutdent
1480
1481    # finally check if we have a password we can use:
1482    if [ -n "$SSH_PASSWD" ] ; then
1483       # chpasswd sucks, seriously.
1484       if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1485         echo "grml:$SSH_PASSWD" | chpasswd -m
1486       else
1487         echo "grml:$SSH_PASSWD" | chpasswd
1488       fi
1489    fi
1490
1491    einfo 'Starting secure shell server in background.'
1492    /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1493    /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1494    eend $?
1495
1496    eindent
1497    ewarn 'Warning: please change the password for user grml as soon as possible!'
1498    eoutdent
1499 fi
1500 }
1501 # }}}
1502
1503 # {{{ autostart of x11vnc
1504 config_vnc(){
1505
1506 USER=grml # TODO: make it dynamically configurable
1507 if checkbootparam 'vnc' ; then
1508    VNC_PASSWD=''
1509    VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1510    einfo "Bootoption vnc found, trying to set password for user $USER."
1511    eindent
1512    if [ -z "$VNC_PASSWD" ] ; then
1513       if [ -x /usr/bin/apg ] ; then
1514          VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1515       elif [ -x /usr/bin/gpw ] ; then
1516          VNC_PASSWD="$(gpw 1)"
1517       elif [ -x /usr/bin/pwgen ] ; then
1518          VNC_PASSWD="$(pwgen -1 8)"
1519       elif [ -x /usr/bin/hexdump ] ; then
1520          VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1521       elif [ -n "$RANDOM" ] ; then
1522          VNC_PASSWD="${USER}${RANDOM}"
1523       else
1524          VNC_PASSWD=''
1525          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1526          eend 1
1527       fi
1528
1529       if [ -n "$VNC_PASSWD" ] ; then
1530          ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1531       fi
1532    fi
1533    eoutdent
1534
1535    # finally check if we have a password we can use:
1536    if [ -n "$VNC_PASSWD" ] ; then
1537
1538       VNCDIR="/home/${USER}/.vnc"
1539       [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1540
1541       if [ ! -x /usr/bin/x11vnc ] ; then
1542          eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1543          eend 1
1544       else
1545          /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1546          /bin/chown -R "$USER": "$VNCDIR"
1547       fi
1548    fi
1549 fi
1550 }
1551 # }}}
1552
1553 # {{{ set password for user grml
1554 config_passwd(){
1555 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1556   einfo "Bootoption passwd found."
1557   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1558   if [ -n "$PASSWD" ] ; then
1559     echo "grml:$PASSWD" | chpasswd -m ; eend $?
1560   else
1561     eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1562   fi
1563   eindent
1564     ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1565   eoutdent
1566 fi
1567 }
1568 # }}}
1569
1570 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1571 config_homedir(){
1572 if checkbootparam 'home' ; then
1573    HOMEDIR="$(getbootparam 'home')"
1574    MYHOMEDEVICE=""
1575    MYHOMEMOUNTPOINT=""
1576    MYHOMEDIR=""
1577    if [ -n "$HOMEDIR" ]; then
1578       einfo "Bootoption home detected." && eend 0
1579       case "$HOMEDIR" in
1580         /dev/*)
1581         MYHOMEDEVICE="${HOMEDIR##/dev/}"
1582         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1583         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1584         MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1585       ;;
1586         /mnt/*)
1587         MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1588         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1589         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1590         MYHOMEDIR="$HOMEDIR"
1591       ;;
1592         [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1593         MYHOMEDIR="$(findfile grml.img)"
1594         MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1595         MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1596         MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1597       ;;
1598       *)
1599         eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1600         eerror "Option ignored." ; eend 1
1601       ;;
1602       esac
1603    fi # -n $HOMEDIR
1604
1605    if [ -n "$MYHOMEDIR" ]; then
1606       if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1607          [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1608          while read device mountpoint fs relax; do
1609            case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1610              case "$fs" in
1611                *[Nn][Tt][Ff][Ss]*)
1612                  umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1613                  break
1614                  ;;
1615                *[Ff][Aa][Tt]*)
1616                  # Note: This currently won't work with encrypted partitions
1617                  umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1618                  if [ ! -f "$MYHOMEDIR" ]; then
1619                     ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1620                     ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1621                  fi
1622                  ;;
1623              esac
1624
1625              if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1626                 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1627                 if [ -f "$MYHOMEDIR" ]; then
1628                    # It's a loopback file, mount it over the /home/grml directory
1629                    trymount "$MYHOMEDIR" /home/grml
1630                    RC="$?"
1631                    [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1632                    RC="$?"
1633                 else
1634                    # Do a --bind mount
1635                    ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1636                    RC="$?"
1637                 fi # -f $MYHOMEDIR
1638
1639                 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1640
1641              fi #  mount -o remount,rw,...
1642            break
1643            ;;
1644            esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1645          done <<EOT
1646          $(cat /proc/mounts)
1647 EOT
1648      fi # if trymount ...
1649    fi # -n $MYHOMEDIR
1650 fi # checkbootparam home
1651 }
1652 # }}}
1653
1654 # {{{ Sound
1655
1656 config_mixer(){
1657 if ! [ -x /usr/bin/amixer ] ; then
1658   eerror "amixer binary not available. Can not set sound volumes therefore." ; eend 1
1659 else
1660
1661   if ! [ -r /proc/asound/cards ] ; then
1662      ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1663      return
1664   fi
1665
1666   if checkbootparam 'vol' ; then
1667     VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1668     if [ -z "$VOL" ] ; then
1669       eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1670       VOL='75' # default
1671     fi
1672   else
1673     VOL='75' # default
1674   fi
1675
1676   if checkbootparam 'nosound' ; then
1677     einfo "Muting sound devices on request."
1678
1679     fix_ibm_sound 0
1680     # mute the master, this should be sufficient
1681     ERROR=$(amixer -q set Master mute)
1682     RC=$?
1683
1684     if [ -n "$ERROR" ] ; then
1685        eindent
1686        eerror "Problem muting sound devices: $ERROR"
1687        eoutdent
1688     fi
1689     eend $RC
1690   elif [ -z "$INSTALLED" ]; then
1691       einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1692
1693       fix_ibm_sound ${VOL}
1694
1695       # by default assume '0' as volume for microphone:
1696       if checkbootparam 'micvol' ; then
1697          MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1698       else
1699          MICVOL=0
1700       fi
1701
1702       # finally set the volumes:
1703       RC=0
1704       for CONTROL in Master PCM ; do
1705          amixer -q set ${CONTROL} ${VOL}%
1706          if [ $? -ne 0 ] ; then RC=$? ; fi
1707       done
1708       # dont know how to set microphone volume for all soundcards with amixer,
1709       # so use aumix instead :/
1710       if [ ${MICVOL} -ne 0 -a -x /usr/bin/aumix ] ; then
1711          aumix -m $MICVOL &>/dev/null
1712          if [ $? -ne 0 ] ; then RC=$? ; fi
1713       fi
1714
1715       eend $RC
1716   fi
1717
1718 fi
1719 }
1720
1721 # on some IBM notebooks the front control has to be toggled
1722 fix_ibm_sound() {
1723  if [ -z $1 ] ; then
1724     return
1725  fi
1726
1727  VOL=${1}
1728
1729  if [ -x /usr/bin/amixer ] ; then
1730     if amixer -q get Front >/dev/null 2>>$DEBUG ; then
1731        amixer -q set Front unmute &>/dev/null
1732        amixer -q set Front ${VOL}% &>/dev/null
1733     fi
1734  fi
1735 }
1736 # }}}
1737
1738 # {{{ modem detection
1739 config_modem(){
1740 if checkbootparam 'nomodem'; then
1741   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1742 else
1743   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1744      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1745         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1746         eend 0
1747      fi
1748   fi
1749 fi
1750 }
1751 # }}}
1752
1753 # {{{ keyboard add-ons
1754 config_setkeycodes(){
1755 if checkbootparam 'setkeycodes' ; then
1756  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1757   # MS MM keyboard add-on
1758   # fix
1759   setkeycodes e001 126 &>/dev/null
1760   setkeycodes e059 127 &>/dev/null
1761   # fn keys
1762   setkeycodes e03b 59 &>/dev/null
1763   setkeycodes e008 60 &>/dev/null
1764   setkeycodes e007 61 &>/dev/null
1765   setkeycodes e03e 62 &>/dev/null
1766   setkeycodes e03f 63 &>/dev/null
1767   setkeycodes e040 64 &>/dev/null
1768   setkeycodes e041 65 &>/dev/null
1769   setkeycodes e042 66 &>/dev/null
1770   setkeycodes e043 67 &>/dev/null
1771   setkeycodes e023 68 &>/dev/null
1772   setkeycodes e057 87 &>/dev/null
1773   setkeycodes e058 88 &>/dev/null
1774   # hp keycodes
1775   setkeycodes e00a 89 e008 90 &>/dev/null
1776  eend 0
1777 fi
1778 }
1779 # }}}
1780
1781 # {{{ wondershaper
1782 config_wondershaper(){
1783  if checkbootparam 'wondershaper' ; then
1784     WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1785     CMD=wondershaper
1786     DEVICE=""
1787     DOWNSTREAM=""
1788     UPSTREAM=""
1789     if [ -n "$WONDER" ]; then
1790       # Extra options
1791       DEVICE="${WONDER%%,*}"
1792       R="${WONDER#*,}"
1793       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1794         WONDER="$R"
1795         DOWNSTREAM="${WONDER%%,*}"
1796         R="${WONDER#*,}"
1797         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1798           WONDER="$R"
1799           UPSTREAM="${WONDER%%,*}"
1800           R="${WONDER#*,}"
1801         fi
1802       fi
1803     fi
1804     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1805     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1806     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1807     einfo "Starting wondershaper (${CMD}) in background."
1808     ( sh -c $CMD & ) && eend 0
1809  fi
1810 }
1811 # }}}
1812
1813 # {{{ syslog-ng
1814 config_syslog(){
1815  if checkbootparam 'nosyslog'; then
1816     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1817  else
1818     SYSLOGD=''
1819     [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1820     [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
1821     [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
1822     [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
1823     [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1824
1825     if [ -z "$SYSLOGD" ] ; then
1826        eerror "No syslog daemon found." ; eend 1
1827     else
1828        einfo "Starting $SYSLOGD in background."
1829        /etc/init.d/$SYSLOGD start >>$DEBUG &
1830        eend 0
1831     fi
1832  fi
1833 }
1834 # }}}
1835
1836 # {{{ gpm
1837 config_gpm(){
1838  if checkbootparam 'nogpm'; then
1839   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1840  else
1841    if ! [ -r /dev/input/mice ] ; then
1842       eerror "No mouse found - not starting GPM." ; eend 1
1843    else
1844       einfo "Starting gpm in background."
1845       /etc/init.d/gpm start >>$DEBUG &
1846       # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1847       eend 0
1848    fi
1849  fi
1850 }
1851 # }}}
1852
1853 # {{{ services
1854 config_services(){
1855  if checkbootparam 'services' ; then
1856     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1857     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1858     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1859     einfo "Starting service(s) ${SERVICENL} in background."
1860     for service in $(echo -e $SERVICELIST) ; do
1861        /etc/init.d/${service} start >>$DEBUG &
1862     done
1863     [ "$?" == "0" ] ; eend $?
1864  fi
1865 }
1866 # }}}
1867
1868 # {{{ remote files
1869 get_remote_file() {
1870   [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1871   SOURCE=$(eval echo "$1")
1872   TARGET="$2"
1873   getconfig() {
1874   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
1875        --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1876   }
1877   einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1878   counter=10
1879   while ! getconfig && [[ "$counter" != 0 ]] ; do
1880     echo -n "Sleeping for 1 second and trying to get config again... "
1881     counter=$(( counter-1 ))
1882     echo "$counter tries left" ; sleep 1
1883   done
1884   if [ -s "$TARGET" ] ; then
1885     einfo "Downloading was successfull." ; eend 0
1886     einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1887     md5sum ${TARGET} ; eend 0
1888     return 0;
1889   else
1890     einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1891     return 1;
1892  fi
1893 }
1894 # }}}
1895
1896 # {{{ config files
1897 config_netconfig(){
1898  if checkbootparam 'netconfig' ; then
1899   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1900   CONFIGFILE='/tmp/netconfig.grml'
1901
1902   if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1903     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1904   fi
1905
1906  fi
1907 }
1908 # }}}
1909
1910 # {{{ remote scripts
1911 config_netscript() {
1912  if checkbootparam 'netscript' ; then
1913   CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1914   SCRIPTFILE='/tmp/netscript.grml'
1915
1916   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1917     chmod +x ${SCRIPTFILE}
1918     einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && ${SCRIPTFILE} ; eend $?
1919   fi
1920
1921  fi
1922 }
1923 # }}}
1924
1925 # {{{ blindsound
1926 config_blindsound(){
1927  if checkbootparam 'blind' ; then
1928     beep
1929     flitewrapper "welcome to the gremel system"
1930  fi
1931 }
1932 # }}}
1933
1934 # {{{ welcome sound
1935 config_welcome(){
1936  if checkbootparam 'welcome' ; then
1937     flitewrapper "welcome to the gremel system"
1938  fi
1939 }
1940 # }}}
1941
1942 # {{{ fix/workaround for unionfs
1943 fix_unionfs(){
1944   if [ -z "$INSTALLED" ]; then
1945    touch /var/cache/apt/*cache.bin
1946   fi
1947 }
1948 # }}}
1949
1950 # {{{ create all /mnt-directories
1951 create_mnt_dirs(){
1952   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1953   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1954 }
1955 # }}}
1956
1957 # {{{ start X window system via grml-x
1958 config_x_startup(){
1959 # make sure we start X only if startx is used *before* a nostartx option
1960 # so it's possible to disable automatic X startup using nostart
1961 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1962  if [ -x $(which X) ] ; then
1963   if [ -z "$INSTALLED" ] ; then
1964    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1965    if [ -z "$WINDOWMANAGER" ] ; then
1966      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1967      WINDOWMANAGER="wm-ng"
1968    else
1969      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1970    fi
1971    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1972    config_userfstab || fstabuser='grml'
1973  cat>|/etc/init.d/xstartup<<EOF
1974 #!/bin/sh
1975 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1976 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER >>$DEBUG
1977 EOF
1978    chmod 755 /etc/init.d/xstartup
1979
1980    # adjust inittab for xstartup
1981    if grep -q '^6:' /etc/inittab ; then
1982       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1983    else # just append tty6 to inittab if no definition is present:
1984       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1985    fi
1986
1987    /sbin/telinit q ; eend $?
1988
1989    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1990       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1991    else
1992       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1993    fi
1994
1995   else
1996     eerror "We are not running in live mode - startx will not work, skipping it."
1997     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1998   fi
1999  else
2000    eerror "/usr/X11R6/bin/X is not present on this grml flavour."
2001    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
2002  fi
2003 fi
2004 }
2005 # }}}
2006
2007 # {{{ configuration framework
2008 config_extract(){
2009 if checkbootparam 'extract' ; then
2010  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
2011  EXTRACTOPTIONS="-- -x $EXTRACT"
2012 fi
2013 }
2014
2015 config_finddcsdir() {
2016 #  - If no GRMLCFG partition is found and noautoconfig is _not_ given
2017 #    on the command line, nothing is changed and the dcs files are
2018 #    searched within the .iso, $dcs-dir is set to the root directory
2019 #    within the .iso
2020 #  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
2021 #    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
2022 #    set, $dcs-dir is set to the root directory within the .iso.
2023 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
2024 #    foo, even if a GRMLCFG partition is present.
2025 DCSDIR=""
2026 DCSMP="/mnt/grml"
2027 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
2028   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
2029 else
2030   if [ -z "$INSTALLED" ] ; then
2031     if checkbootparam 'myconfig' ; then
2032       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
2033       if [ -z "$DCSDEVICE" ]; then
2034         eerror "Error: No device for bootoption myconfig provided." ; eend 1
2035       fi # [ -z "$DCSDEVICE" ]
2036     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
2037       einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
2038       eindent
2039       # We do need the following fix so floppy disk is available to blkid in any case :-/
2040       if [ -r /dev/fd0 ] ; then
2041         einfo "Floppy device detected. Trying to access floppy disk."
2042         if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
2043            blkid /dev/fd0 >>$DEBUG 2>&1
2044         fi
2045       fi
2046       DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
2047       if [ -n "$DCSDEVICE" ]; then
2048         DCSMP="/mnt/grmlcfg"
2049       fi
2050       eoutdent
2051     fi
2052
2053     # if not specified/present then assume default:
2054     if [ -z "$DCSDEVICE" ]; then
2055       DCSDIR="/live/image"
2056     else
2057       eindent
2058       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
2059       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
2060       if [ -n "$DCSDIR" ]; then
2061         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
2062       else
2063         [ -d $DCSMP ] || mkdir $DCSMP
2064         umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
2065         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
2066         if [[ $RC == 0 ]]; then
2067           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
2068         else
2069           eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
2070         fi
2071         DCSDIR="$DCSMP"
2072       fi
2073       eoutdent
2074     fi
2075   fi
2076 fi
2077
2078 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
2079   einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
2080 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
2081   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
2082 fi
2083 }
2084
2085
2086 config_partconf() {
2087 if checkbootparam 'partconf' ; then
2088  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
2089  if [ -n "$MOUNTDEVICE" ]; then
2090    [ -d /mnt/grml ] || mkdir /mnt/grml
2091    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
2092     if [[ $RC == 0 ]]; then
2093       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
2094       einfo "Copying files from $MOUNTDEVICE over grml system."
2095       for file in `cat /etc/grml/partconf` ; do
2096         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
2097         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
2098       done && eend 0
2099     else
2100       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
2101     fi # mount $MOUNTDEVICE
2102    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
2103  else
2104    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
2105  fi # [ -n "$MOUNTDEVICE" ]
2106 fi
2107 }
2108 # }}}
2109
2110 # {{{ /cdrom/.*-options
2111 config_debs(){
2112 if checkbootparam 'debs' ; then
2113    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
2114    if ! echo $DEBS | grep -q '/'; then
2115      # backwards compatibility: if no path is given get debs from debs/
2116      DEBS="debs/$DEBS"
2117    fi
2118    einfo "Tring to install debian package(s) ${DEBS}"
2119    DEBS="$(eval echo ${DCSDIR}/$DEBS)"
2120    dpkg -i $DEBS ; eend $?
2121 fi
2122 }
2123
2124 config_scripts(){
2125 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
2126    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
2127    if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
2128      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
2129    fi
2130    if ! echo $SCRIPTS | grep -q '/'; then
2131      # backwards compatibility: if no path is given get scripts from scripts/
2132      SCRIPTS="scripts/$SCRIPTS"
2133    fi
2134    if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
2135      # we are executing from a GRMLCFG labeled fs
2136      # kick everything we have done before and start over
2137      SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
2138    fi
2139    if [ -n "$SCRIPTS" ]; then
2140      SCRIPTS="${DCSDIR}/$SCRIPTS"
2141      if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
2142        einfo "Trying to execute ${SCRIPTS}"
2143        sh -c $SCRIPTS
2144      elif [ -d "$SCRIPTS" ]; then
2145        einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
2146        run-parts $SCRIPTS
2147      else
2148        einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
2149        sh -c $SCRIPTS
2150      fi
2151    fi
2152 fi
2153 }
2154
2155 config_config(){
2156 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
2157   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
2158   if [ -z "$CONFIG" ]; then
2159     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
2160   fi
2161   if [ -n "$CONFIG" ]; then
2162     if [ -d "${DCSDIR}/${CONFIG}" ] ; then
2163       einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
2164
2165       cp -a ${DCSDIR}/${CONFIG}/* /
2166     elif [ -f "${DCSDIR}/${CONFIG}" ]; then
2167       einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
2168
2169       cd /
2170       unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
2171     else
2172       ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
2173     fi
2174   fi
2175 fi
2176 # umount $DCSMP if it was mounted by finddcsdir
2177 # this doesn't really belong here
2178 grep -q '$DCSMP' /proc/mounts && umount $DCSMP
2179 }
2180 # }}}
2181
2182 # {{{ mypath
2183 config_mypath(){
2184 if checkbootparam 'mypath' ; then
2185    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2186    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2187    touch /etc/grml/my_path
2188    chmod 644 /etc/grml/my_path
2189    # make sure the directories exist:
2190    eindent
2191    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2192        if ! [ -d "$i" ] ; then
2193           einfo "Creating directory $i"
2194           mkdir -p "$i" ; eend $?
2195        fi
2196    done
2197    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2198    eoutdent
2199 fi
2200 }
2201 # }}}
2202
2203 # {{{ distcc
2204 config_distcc(){
2205 if checkbootparam 'distcc' ; then
2206  OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
2207  if [ -n "$OPTIONS" ]; then
2208     NET=""
2209     INTERFACE=""
2210     if [ -n "$OPTIONS" ]; then
2211       NET="${OPTIONS%%,*}"
2212       R="${OPTIONS#*,}"
2213       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2214         OPTIONS="$R"
2215         INTERFACE="${OPTIONS%%,*}"
2216         R="${OPTIONS#*,}"
2217       fi
2218     fi
2219  fi
2220  CONFIG=/etc/default/distcc
2221  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
2222  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2223
2224  if [ -n "$INTERFACE" ] ; then
2225    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2226
2227    counter=10
2228    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2229      counter=$(( counter-1 ))
2230      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2231      sleep 3
2232      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2233    done
2234  fi
2235
2236  if [ -n "$IP" ] ; then
2237    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
2238
2239    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2240    eindent
2241     id distccd >/dev/null 2>&1 || \
2242     (
2243       einfo "Creating distcc user" ; \
2244       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2245     )
2246
2247     einfo "Starting distcc for network ${NET}, listening on ${IP}."
2248    /etc/init.d/distcc start >/dev/null ; eend $?
2249    eoutdent
2250  else
2251    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2252  fi
2253 fi
2254
2255 if checkbootparam 'gcc'; then
2256  GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
2257  eindent
2258  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2259  eoutdent
2260  rm -f /usr/bin/gcc
2261  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2262 fi
2263
2264 if checkbootparam 'gpp'; then
2265  GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
2266  eindent
2267   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2268   if [ -x /usr/bin/g++-${GPP} ] ; then
2269      rm -f /usr/bin/g++
2270      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2271   fi
2272   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2273   if [ -x /usr/bin/cpp-${GPP} ] ; then
2274      rm -f /usr/bin/cpp
2275      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2276   fi
2277  eoutdent
2278 fi
2279
2280 }
2281 # }}}
2282
2283 # {{{ load modules
2284 # Notice: use it only on live-cd system, if running from harddisk please
2285 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2286 # in /etc/runlevel.conf
2287 config_modules(){
2288 MODULES_FILE=/etc/grml/modules
2289 if checkbootparam 'nomodules' ; then
2290   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2291 elif [ -z "$INSTALLED" ]; then
2292  if [ -r $MODULES_FILE ] ; then
2293   einfo "Loading modules specified in ${MODULES_FILE}:"
2294   eindent
2295   grep '^[^#]' $MODULES_FILE | \
2296   while read module args; do
2297     [ "$module" ] || continue
2298       einfo "${module}"
2299       modprobe $module $args ; eend $?
2300   done
2301   eoutdent
2302  else
2303   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2304  fi
2305 fi
2306 }
2307 # }}}
2308
2309 # {{{ 915resolution
2310 config_915resolution(){
2311 if checkbootparam '915resolution' ; then
2312  OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)"
2313   if [ -x /usr/sbin/915resolution ]; then
2314     CMD=915resolution
2315     MODE=""
2316     XRESO=""
2317     YRESO=""
2318     if [ -n "$OPTIONS" ]; then
2319       # Extra options
2320       MODE="${OPTIONS%%,*}"
2321       R="${OPTIONS#*,}"
2322       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2323         OPTIONS="$R"
2324         XRESO="${OPTIONS%%,*}"
2325         R="${OPTIONS#*,}"
2326         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2327           OPTIONS="$R"
2328           YRESO="${OPTIONS%%,*}"
2329           R="${OPTIONS#*,}"
2330         fi
2331       fi
2332     fi
2333     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2334     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2335     eend 0
2336   fi
2337 fi
2338 }
2339 # }}}
2340
2341 # {{{ SW-RAID
2342 config_swraid(){
2343   [ -n "$INSTALLED" ] && return 0
2344
2345   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2346   if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
2347      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2348      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2349   else
2350     if ! [ -x /sbin/mdadm ] ; then
2351        eerror "mdadm not available, can not execute it." ; eend 1
2352     else
2353
2354        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2355        # find out whether we have a valid configuration file already
2356        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2357           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2358           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2359           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2360         else
2361           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2362        fi
2363
2364        if ! checkbootparam 'swraid' ; then
2365           eindent
2366           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2367           eoutdent
2368        else
2369           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2370           eindent
2371            IFSOLD=${IFS:-}
2372            IFS='
2373 '
2374            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2375                case $line in
2376                  *'No arrays found'*)
2377                    ewarn "$line" ; eend 0
2378                    ;;
2379                  *)
2380                    einfo "$line" ; eend 0
2381                    ;;
2382                esac
2383            done
2384            IFS=$IFSOLD
2385          eoutdent
2386
2387          if [ -r /proc/mdstat ] ; then
2388             eindent
2389             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2390             if [ -z "$MDSTAT" ] ; then
2391                ewarn "No active arrays found" ; eend 0
2392             else
2393                IFSOLD=${IFS:-}
2394                IFS='
2395 '
2396                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2397                    einfo "active arrays: $line" ; eend 0
2398                done
2399                IFS=$IFSOLD
2400             fi
2401             eoutdent
2402          fi # /proc/mdstat
2403        fi # bootoption swraid
2404
2405      fi # is /sbin/mdadm executable?
2406   fi # check for bootoptions
2407 }
2408 # }}}
2409
2410 # {{{ dmraid
2411 config_dmraid(){
2412   [ -n "$INSTALLED" ] && return 0
2413
2414   if checkbootparam 'nodmraid' ; then
2415     ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
2416     return 0
2417   fi
2418
2419   if ! [ -x /sbin/dmraid ] ; then
2420     eerror "dmraid not available, can not execute it." ; eend 1
2421     return
2422   fi
2423
2424   dmraid_wrapper() {
2425     # usage: dmraid_wrapper <dmraid_option>
2426     [ -n "$1" ] || return 1
2427
2428     IFSOLD=${IFS:-}
2429     IFS='
2430 '
2431     eindent
2432
2433     for line in $(dmraid $1 ; echo errcode:$?); do
2434       case $line in
2435         *'no block devices found'*)
2436           einfo "No block devices found" ; eend 0
2437           break
2438           ;;
2439         *'no raid disks'*)
2440           einfo "No active dmraid devices found" ; eend 0
2441           break
2442           ;;
2443         errcode:0)
2444           eend 0;
2445           ;;
2446         errcode:1)
2447           eend 1
2448           ;;
2449         *)
2450           einfo "$line"
2451           ;;
2452       esac
2453     done
2454
2455     eoutdent
2456     IFS=$IFSOLD
2457   }
2458
2459   if checkbootparam 'dmraid' ; then
2460     local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
2461     if [ "$ACTION" = "off" ] ; then
2462       # Deactivates all active software RAID sets:
2463       einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
2464       dmraid_wrapper -an
2465     else
2466       # Activate all software RAID sets discovered:
2467       einfo "Activating present dmraid sets (as requested via dmraid):"
2468       dmraid_wrapper -ay
2469     fi
2470
2471     return
2472   fi
2473
2474   # by default (no special bootoptions) discover all software RAID devices:
2475   einfo "Searching for any present dmraid sets:"
2476   dmraid_wrapper -r
2477 }
2478 # }}}
2479
2480 # {{{ LVM (Logical Volumes)
2481 config_lvm(){
2482   [ -n "$INSTALLED" ] && return 0
2483
2484   if checkbootparam 'nolvm' ; then
2485      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2486   else
2487     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2488     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2489        eerror "LVM not available, can not execute it." ; eend 1
2490     else
2491        if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
2492           einfo "You seem to have logical volumes (LVM) on your system."
2493           eindent
2494           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2495           eend 0
2496           if checkbootparam 'lvm' ; then
2497              einfo "Bootoption LVM found. Searching for logical volumes:"
2498              /etc/init.d/lvm2 start ; eend $?
2499           fi
2500           eoutdent
2501        fi
2502     fi # check for lvm binary
2503   fi # check for bootoption nolvm
2504 }
2505 # }}}
2506
2507 # {{{ debnet: setup network based on an existing one found on a partition
2508 config_debnet(){
2509 if checkbootparam 'debnet' ; then
2510  iszsh && setopt shwordsplit
2511  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2512  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2513  FOUND_DEBNET=""
2514
2515  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2516  eindent
2517  if ! mount | grep '/mnt ' >/dev/null 2>&1 ; then
2518     for i in $DEVICES; do
2519      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2520          einfo "Scanning on $i"
2521        if [ -f /mnt/etc/network/interfaces ]; then
2522          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2523          FOUND_DEBNET="$i"
2524          break
2525        fi
2526        umount /mnt
2527      fi
2528     done
2529
2530    if [ -n "$FOUND_DEBNET" ]; then
2531      einfo "Stopping network."
2532        pump -k >/dev/null 2>&1
2533        /etc/init.d/networking stop >/dev/null 2>&1 ; eend $?
2534      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2535        rm -rf /etc/network/run
2536        cp -a /mnt/etc/network /etc
2537        rm -rf /etc/network/run
2538        mkdir /etc/network/run
2539        umount /mnt ; eend $?
2540      einfo "Starting network."
2541        invoke-rc.d networking start ; eend $?
2542    else
2543      eerror "/etc/network/interfaces not found." ; eend 1
2544    fi
2545    eoutdent
2546  else
2547   eerror "Error: /mnt already mounted." ; eend 1
2548  fi
2549 fi
2550 }
2551 # }}}
2552
2553 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2554 config_ipw3945() {
2555   if grep -q ipw3945 /proc/modules ; then
2556      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2557         ewarn "Broken ipw3945 network interface found, reloading module."
2558         rmmod ipw3945
2559         modprobe ipw3945
2560         eend $?
2561      fi
2562   fi
2563 }
2564 # }}}
2565
2566 # {{{ disable console blanking
2567 config_blanking(){
2568 if checkbootparam 'noblank' ; then
2569   einfo "Bootoption noblank found. Disabling monitor blanking."
2570   setterm -blank 0 ; eend $?
2571 fi
2572 }
2573 # }}}
2574
2575 # {{{ tohd= bootoption
2576 config_tohd()
2577 {
2578   if checkbootparam 'tohd' ; then
2579      local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2580      if [ -z "$TARGET" ] ; then
2581         eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2582         eerror "Please use something like tohd=/dev/sda9." ; eend 1
2583         return 1
2584      fi
2585
2586      if ! [ -b "$TARGET" ] ; then
2587         eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2588         return 1
2589      fi
2590
2591      if grep -q $TARGET /proc/mounts ; then
2592         eerror "$TARGET already mounted, skipping execution of tohd therefore."
2593         eend 1
2594         return 1
2595      fi
2596
2597      local MOUNTDIR=$(mktemp -d)
2598
2599      if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2600         einfo "Copyring live system to $TARGET - this might take a while"
2601         rsync -a --progress /live/image/live $MOUNTDIR
2602         sync
2603         umount "$MOUNTDIR"
2604         eend $?
2605         einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2606      else
2607         eerror "Error when trying to mount $TARGET, sorry."; eend 1
2608         return 1
2609      fi
2610
2611      rmdir "$MOUNTDIR"
2612   fi
2613 }
2614 # }}}
2615
2616 # {{{ grml2hd: automatic installation
2617 config_grml2hd(){
2618
2619 if checkbootparam "BOOT_IMAGE=grml2hd" ; then
2620
2621 if checkbootparam 'user' ; then
2622    NEWUSER=''
2623    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2624    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2625 fi
2626
2627 if checkbootparam 'filesystem' ; then
2628    FILESYSTEM=''
2629    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2630    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2631 fi
2632
2633 if checkbootparam 'partition' ; then
2634    PARTITION=''
2635    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2636    # notice: the following checks whether the given partition is available, if not the skip
2637    # execution of grml2hd as it might result in data loss...
2638    if [ -r $PARTITION ] ; then
2639       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2640    else
2641       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2642    fi
2643 fi
2644
2645 if checkbootparam 'mbr' ; then
2646    BOOT_PARTITION=''
2647    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2648    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2649 fi
2650
2651 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2652 #!/bin/sh
2653 GRML2HD_NONINTERACTIVE='yes' grml2hd
2654 EOF
2655
2656 chmod 755 /usr/bin/grml2hd_noninteractive
2657 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2658 if [ -z "$GRML2HD_FAIL" ] ; then
2659    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2660 else
2661    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2662 fi
2663
2664 fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
2665 }
2666 # }}}
2667
2668 # {{{ debootstrap: automatic installation
2669 config_debootstrap(){
2670
2671 if checkbootparam "BOOT_IMAGE=debian2hd" ; then
2672
2673 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2674
2675 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2676    eindent
2677    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2678    eoutdent
2679    exit 1
2680 fi
2681
2682 if checkbootparam 'target' ; then
2683   TARGET=''
2684   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2685   # notice: the following checks whether the given partition is available, if not the skip
2686   # execution of grml-debootstrap as it might result in data loss...
2687   if ! [ -r "$TARGET" ] ; then
2688      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2689   fi
2690 else
2691   eindent
2692   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2693   eoutdent
2694   exit 1
2695 fi
2696
2697 if checkbootparam 'grub' ; then
2698   GRUB=''
2699   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2700 fi
2701
2702 if checkbootparam 'groot' ; then
2703   GROOT=''
2704   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2705 fi
2706
2707 if checkbootparam 'release' ; then
2708   RELEASE=''
2709   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2710 fi
2711
2712 if checkbootparam 'mirror' ; then
2713   MIRROR=''
2714   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2715 fi
2716
2717 if checkbootparam 'boot_append' ; then
2718   BOOT_APPEND=''
2719   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2720 fi
2721
2722 if checkbootparam 'password' ; then
2723   PASSWORD=''
2724   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2725 fi
2726
2727 # now check which options are available
2728 if [ -n "TARGET" ] ; then
2729    TARGETCMD="--target $TARGET"
2730 else
2731    TARGETCMD=''
2732    eindent
2733    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2734    eoutdent
2735    exit 1
2736 fi
2737 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2738 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2739 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2740 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2741 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2742 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2743
2744 # and finally write script and execute it
2745 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2746 #!/bin/sh
2747 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2748 EOF
2749
2750 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2751
2752 screen /usr/bin/grml-debootstrap_noninteractive
2753 einfo "Invoking a shell, just exit to continue booting..."
2754 /bin/zsh
2755
2756 fi # checkbootparam "BOOT_IMAGE=debian2hd
2757 }
2758 # }}}
2759
2760 # {{{ Support customization
2761 config_distri(){
2762 if checkbootparam 'distri'; then
2763   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2764   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2765      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2766      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2767      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2768      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2769   fi
2770 fi
2771 }
2772 # }}}
2773
2774 ### {{{ backwards compatible stuff
2775 config_environment(){
2776   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2777 }
2778 config_keyboard(){
2779   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2780 }
2781 # }}}
2782
2783 ## END OF FILE #################################################################
2784 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3