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