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