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