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