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