Added tag 0.7.11 for changeset 69a46c214c14
[grml-autoconfig.git] / autoconfig.functions
1 #!/bin/zsh
2 # Filename:      autoconfig.functions
3 # Purpose:       basic system configuration and hardware setup for grml system
4 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 # Latest change: Mit Jul 25 18:59:49 CEST 2007 [mika]
8 ################################################################################
9
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
12 DEBUG="/dev/null"
13 KERNEL="$(uname -r)"
14 umask 022
15
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
18
19 # zsh stuff
20 iszsh(){
21 if [ -n "$ZSH_VERSION" ] ; then
22   return 0
23 else
24   return 1
25 fi
26 }
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
29 # }}}
30
31 ### {{{ Utility Functions
32
33 # Simple shell grep
34 stringinfile(){
35   case "$(cat $2)" in *$1*) return 0;; esac
36   return 1
37 }
38
39 # same for strings
40 stringinstring(){
41   case "$2" in *$1*) return 0;; esac
42   return 1
43 }
44
45 # Reread boot command line; echo last parameter's argument or return false.
46 getbootparam(){
47   stringinstring " $1=" "$CMDLINE" || return 1
48   result="${CMDLINE##*$1=}"
49   result="${result%%[   ]*}"
50   echo "$result"
51   return 0
52 }
53
54 # Check boot commandline for specified option
55 checkbootparam(){
56   stringinstring " $1" "$CMDLINE"
57   return "$?"
58 }
59
60 checkvalue(){
61   if [ "$1" = "yes" ] ; then
62     return 0
63   else
64     return 1
65   fi
66 }
67
68 checkgrmlsmall(){
69   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
70 }
71
72 checkgrmlusb(){
73   grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
74 }
75 ### }}}
76
77 # {{{ filesystems (proc, pts, sys) and fixes
78 mount_proc(){
79   [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
80 }
81
82 mount_pts(){
83   stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
84 }
85
86 mount_sys(){
87   [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
88 }
89 # }}}
90
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
95 # }}}
96
97 # {{{ Check if we are running from the grml-CD or HD
98 INSTALLED=""
99 [ -e /GRML/etc/grml_cd ] || INSTALLED="yes"
100
101 # testcd
102 TESTCD=""
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
104 # }}}
105
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
108   RC_NOCOLOR=yes
109   . /etc/grml/lsb-functions
110   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
111 else
112   . /etc/grml/lsb-functions
113   . /etc/grml_colors
114 fi
115 # }}}
116
117 # {{{ debug
118 config_debug(){
119  if checkbootparam "debug"; then
120    BOOTDEBUG="yes"
121  fi
122  if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
123    BOOTDEBUG="yes"
124  fi
125  rundebugshell(){
126   if [ -n "$BOOTDEBUG" ]; then
127     einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
128     eindent
129     if [ -r /etc/grml/screenrc ] ; then
130        einfo "Starting GNU screen to be able to use a full featured shell environment."
131        einfo "Just exit the shells (and therefore screen) to continue boot process..."
132        /bin/zsh -c "screen -c /etc/grml/screenrc"
133     else
134       einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135       einfo "Just exit the shell to continue boot process..."
136       /bin/zsh
137     fi
138     eoutdent
139   fi
140  }
141 }
142 # }}}
143
144 # {{{ log
145 config_log(){
146 if checkbootparam "log"; then
147   export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
148   touch $DEBUG
149   einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
150   eindent
151     einfo "Starting bootlogd."
152     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
153   eoutdent
154 else
155   DEBUG="/dev/null"
156 fi
157 }
158 # }}}
159
160 # {{{ Check if we are in interactive startup mode
161 INTERACTIVE=""
162 stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes"
163 # }}}
164
165 # {{{ set firmware timeout via bootparam
166 config_fwtimeout(){
167  if checkbootparam fwtimeout ; then
168    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
169    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
170    rmmod firmware_class 1>>$DEBUG 2>&1
171    modprobe firmware_class ; eend $?
172  fi
173  if [ -z "$TIMEOUT" ] ; then
174    TIMEOUT="100" # linux kernel default: 10
175  fi
176  if [ -f /sys/class/firmware/timeout ] ; then
177    einfo "Setting timeout for firmware loading to ${TIMEOUT}."
178    echo 100 > /sys/class/firmware/timeout ; eend $?
179  fi
180 }
181 # }}}
182
183 ### {{{ language configuration / localization
184 config_language(){
185
186  einfo "Activating language settings:"
187  eindent
188
189  # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
190  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
191
192  grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
193
194  # check for bootoption which overrides config from /etc/grml/autoconfig:
195  BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
196  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
197
198  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
199  if [ -z "$INSTALLED" ] ; then
200     [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
201  fi
202
203  # if bootoption lang is used update /etc/default/locale, otherwise *not*!
204  if [ -n "$BOOT_LANGUAGE" ] ; then
205     [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
206  fi
207
208  # set console font
209  if [ -z "$CONSOLEFONT" ] ; then
210     if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
211        # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
212        # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
213        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
214           CONSOLEFONT='Uni3-Terminus16'
215        else
216           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
217        fi
218     fi
219  fi
220
221  # export it now, so error messages get translated, too
222  if checkgrmlsmall ; then
223     export LANG='C' # grml-small does not provide any further locales
224  else
225     [ -r /etc/default/locale ] && . /etc/default/locale
226     export LANG LANGUAGE
227  fi
228
229  # configure keyboard layout, read in already set values first:
230  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
231
232  # now allow keyboard override by boot commandline for later use:
233  KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
234  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
235  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
236  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
237  [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
238
239  # modify /etc/sysconfig/keyboard only in live-cd mode:
240  if [ -z "$INSTALLED" ] ; then
241
242    local LANGUAGE="$BOOT_LANGUAGE"
243    . /etc/grml/language-functions
244    # allow setting xkeyboard explicitly different than console keyboard
245    KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
246    if [ -n "$KXKEYBOARD" ]; then
247       XKEYBOARD="$KXKEYBOARD"
248       KDEKEYBOARD="$KXKEYBOARD"
249    elif [ -n "$KKEYBOARD" ]; then
250       XKEYBOARD="$KKEYBOARD"
251       KDEKEYBOARD="$KKEYBOARD"
252    fi
253
254    # duplicate of previous code to make sure /etc/grml/language-functions
255    # does not overwrite our values....
256    # now allow keyboard override by boot commandline for later use:
257    KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
258    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
259    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
260    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
261    [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
262
263    # write keyboard related variables to file for later use
264    [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
265    echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
266    echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
267    echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
268    echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
269  fi
270
271  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
272
273  # activate unicode console if running within utf8 environment
274  if [ -r /etc/default/locale ] ; then
275     if grep -q "LANG=.*UTF" /etc/default/locale ; then
276        if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
277           ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
278        else
279           einfo "Setting up unicode environment."
280           unicode_start 2>>$DEBUG ; eend $?
281        fi
282     fi
283  fi
284
285  # Set default keyboard before interactive setup
286  if [ -n "$KEYTABLE" ] ; then
287   einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
288   loadkeys -q $KEYTABLE &
289   eend $?
290  fi
291
292  # we have to set up all consoles, therefore loop it over all ttys:
293  NUM_CONSOLES=`fgconsole --next-available`
294  NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
295  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
296  if [ -n "$CHARMAP" ] ; then
297     einfo "Running consolechars for ${CHARMAP}"
298     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
299         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
300     done
301     eend $RC
302  fi
303  if [ -n "$CONSOLEFONT" ] ; then
304     einfo "Running consolechars using ${CONSOLEFONT}"
305     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
306         consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
307     done
308     eend $?
309  fi
310
311  eoutdent
312 }
313 # }}}
314
315 # {{{ Set hostname
316 config_hostname(){
317  if checkbootparam hostname ; then
318   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
319   einfo "Setting hostname to $HOSTNAME as requested."
320   sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
321   hostname $HOSTNAME ; eend $?
322  else
323   hostname --file /etc/hostname
324  fi
325 }
326 # }}}
327
328 # fstabuser (needed when running from harddisk with username != grml {{{
329 config_userfstab(){
330   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
331   if [ -n "$CONFIG_FSTAB_USER" ] ; then
332      fstabuser="$CONFIG_FSTAB_USER"
333   else
334      fstabuser=$(getent passwd 1000 | cut -d: -f1)
335   fi
336   # if not yet set fall back to default 'grml' user
337   [ -n "$fstabuser" ] || fstabuser='grml'
338 }
339 # }}}
340
341 # {{{ Set clock (Local time is more often used than GMT, so it is default)
342 config_time(){
343  # don't touch the files if running from harddisk:
344  if [ -z "$INSTALLED" ]; then
345     UTC=""
346     checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
347     checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
348     # hwclock uses the TZ variable
349     [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
350     [ -n "$TZ" ] || TZ=Europe/Vienna
351
352     if ! [ -r /dev/rtc ] ; then
353       ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
354     else
355       ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
356       if [ -n "$ERROR" ] ; then
357          eindent
358          ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
359          if [ -n "$ERROR" ] ; then
360             eerror "Problem running hwclock: $ERROR" ; eend 1
361          fi
362          eoutdent
363       fi
364     fi
365  fi
366 }
367 # }}}
368
369 # {{{ print kernel info
370 config_kernel(){
371   vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
372   [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
373   einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
374   if [ -r /proc/cpuinfo ] ; then
375      if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
376        eindent
377        einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
378        eoutdent
379      fi
380   fi
381   if [ -d /proc/xen ] ; then
382      eindent
383      einfo 'Running kernel featuring support for Xen detected' ; eend 0
384      eoutdent
385   fi
386 }
387 # }}}
388
389 # {{{ vmware specific stuff
390 config_vmware(){
391 if checkbootparam novmware ; then
392    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
393 else
394    if [ -z "$INSTALLED" ] ; then
395       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
396               if ! checkbootparam qemu ; then
397             if [ -r /etc/X11/xorg.conf.vmware ] ; then
398                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
399                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
400             fi
401          fi
402       fi
403    fi
404 fi
405 }
406 # }}}
407
408 # {{{ qemu specific stuff
409 config_qemu(){
410 if checkbootparam qemu ; then
411    if [ -r /etc/X11/xorg.conf.example ] ; then
412       einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
413       cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
414    fi
415 fi
416 }
417 # }}}
418
419 # {{{ ld.so.cache + depmod
420 config_ld_mod(){
421 if [ -n "$INSTALLED" ]; then
422  if ! [ -r /etc/grml.first.boot ] ; then
423   einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
424   eindent
425 # Regenerate ld.so.cache and module dependencies on HD
426     einfo "Running ldconfig" ; ldconfig  ; eend $?
427     einfo "Running depmod"   ; depmod -a ; eend $?
428     touch /etc/grml.first.boot
429     eend 0
430   eoutdent
431  fi
432 fi
433 }
434 # }}}
435
436 # update_progress {{{
437 update_progress(){
438   # be sure we are non-blocking
439   (echo "$1" > /etc/sysconfig/progress) &
440 }
441 # }}}
442
443 # {{{ timezone
444 config_timezone(){
445  # don't touch the files if running from harddisk:
446  if [ -z "$INSTALLED" ]; then
447   einfo "Setting timezone."
448   KTZ="$(getbootparam tz 2>>$DEBUG)"
449   [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
450   rm -f /etc/localtime
451   cp "/usr/share/zoneinfo/$TZ" /etc/localtime && eend 0
452  fi
453 }
454 # }}}
455
456 # small computer / nearly no ram {{{
457 config_small(){
458
459 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
460 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
461 eindent
462
463 if checkbootparam "small"; then
464   einfo "Information: ${RAM} kB of RAM available." ; eend 0
465   einfo "Bootoption small detected. Activating small system."
466   if [ -r /etc/inittab.small ] ; then
467     mv /etc/inittab /etc/inittab.normal
468     mv /etc/inittab.small /etc/inittab
469   else
470     sed -i 's/^9/#&/' /etc/inittab
471     sed -i 's/^10/#&/' /etc/inittab
472     sed -i 's/^11/#&/' /etc/inittab
473     sed -i 's/^12/#&/' /etc/inittab
474   fi
475   /sbin/telinit q ; eend $?
476 else
477   if checkgrmlsmall ; then
478     if [[ $RAM -lt 25000 ]] ; then
479       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
480       ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
481       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
482       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
483       /bin/zsh --login
484     else
485       einfo "Information: ${RAM} kB of RAM available." ; eend 0
486     fi
487   else
488     if [[ $RAM -lt 58000 ]] ; then
489       ewarn "Information: ${RAM} kB of RAM available." ; eend 1
490       ewarn "At least 64MB of RAM should be available for grml." ; eend 1
491       ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
492       ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
493       /bin/zsh --login
494     else
495       einfo "Information: ${RAM} kB of RAM available." ; eend 0
496     fi
497   fi
498 fi
499 eoutdent
500 }
501 # }}}
502
503 # skip startup of w3m {{{
504 config_fast(){
505 if checkbootparam "fast"; then
506   ewarn "Bootoption fast detected. Skipping startup of w3m."
507     sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
508   /sbin/telinit q ; eend $?
509 fi
510 }
511 # }}}
512
513 # activate serial console {{{
514 config_console(){
515 if checkbootparam "console"; then
516   einfo "Bootoption (for serial) console detected."
517   eindent
518     if [ -r /etc/mgetty/mgetty.config ] ; then
519        MODE=$(getbootparam console | awk -F, '{print $2}')
520        MODE=${MODE%%n*}
521        [ -n "$MODE" ] || MODE=9600 # default mode
522        einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
523        sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
524     fi
525
526     einfo "Activating mgetty."
527     sed -i 's/^#T0/T0/' /etc/inittab
528     sed -i 's/^#T1/T1/' /etc/inittab
529     /sbin/telinit q ; eend $?
530   eoutdent
531 fi
532 }
533 # }}}
534
535 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
536 config_cdrom_perm(){
537 CDROMS=""
538 for DEVICE in /proc/ide/hd?; do
539  [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
540 done
541 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
542 }
543 # }}}
544
545 # {{{ Bring up loopback interface now
546 config_local_net(){
547  if [ -z "$INSTALLED" ] ; then
548     if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
549        grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
550     else
551        ifconfig lo up
552     fi
553  fi
554 }
555 # }}}
556
557 # firewire devices {{{
558 # the raw1394 driver does not yet export info into SYSFS,
559 # so let's create raw1394 device manually
560 # http://www.michael-prokop.at/blog/index.php?p=352
561 config_firewire_dev(){
562 if checkbootparam "nofirewiredev" ; then
563   ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
564 else
565 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
566   einfo "Creating some firewire devices (fix kernel 2.6-bug)."
567 #  cd /dev && MAKEDEV video1394 raw1394
568   [ -r /dev/raw1394 ]   || mknod /dev/raw1394 c 171 0
569   [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
570 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
571   [ -r /dev/dv1394 ]    || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
572   chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
573   chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
574 fi
575 #fi
576 }
577 # }}}
578
579 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
580 # otherwise we will get: passwd: Authentication token lock busy
581 config_fix_passwd(){
582  if [ -z "$INSTALLED" ] ; then
583   touch /etc/.pwd.lock
584  fi
585 }
586 # }}}
587
588 # {{{ CD Checker
589 config_testcd(){
590 if [ -n "$TESTCD" ]; then
591   einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
592   einfo "Reading files and checking against GRML/md5sums, this may take a while..."
593   echo -n "${RED}"
594   ( cd /cdrom/GRML/ ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
595   if [ "$?" = "0" ]; then
596     echo " ${GREEN}Everything looks OK${NORMAL}"
597     else
598     echo "${RED} *** CHECKSUM FAILED FOR THESE FILES:                          ***"
599     egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
600     echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
601     echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM.                             ***${NORMAL}"
602     echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}\a\a\a "
603     read a
604   fi
605   eend 0
606 fi
607 }
608 # }}}
609
610 # {{{ hardware detection via discover
611 config_discover(){
612 if checkbootparam "nodisc" ; then
613   ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
614 else
615  if [ -x /sbin/discover ] ; then
616   einfo "Discovering hardware. Trying to load the following modules in background:"
617    eindent
618    einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
619    eoutdent
620   /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
621   eend 0
622  else
623   eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
624  fi
625 fi
626 }
627 # }}}
628
629 # {{{ hardware detection via hwinfo
630 config_hwinfo(){
631 if checkbootparam hwinfo >>$DEBUG 2>&1; then
632   einfo "Discovering hardware via hwinfo:"
633   MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
634   echo -n "  Loading modules: "
635   for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
636   eend 0
637 fi
638 }
639 # }}}
640
641 # {{{ disable hotplug agents on request
642 config_hotplug_agent(){
643 if checkbootparam "noagent" ; then
644   AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
645   AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
646   AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
647   einfo "Disabling hotplug-agent(s) $AGENTNL"
648   for agent in $(echo -e $AGENTLIST) ; do
649     mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
650   done
651   [ "$?" == "0" ] ; eend $?
652 fi
653 }
654 # }}}
655
656 # {{{ blacklist of hotplug-modules
657 config_hotplug_blacklist(){
658 if checkbootparam "black" ; then
659   BLACK="$(getbootparam 'black' 2>>$DEBUG)"
660   BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
661   BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
662   einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
663   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
664   echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
665   eend 0
666 fi
667 }
668 # }}}
669
670 # {{{ run hotplug
671 config_hotplug(){
672 if checkbootparam "nohotplug" ; then
673   ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
674 else
675   if [ -r /etc/init.d/hotplug ] ; then
676     einfo "Starting hotplug system in background."
677     /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
678     eend 0
679   elif [ -r /etc/init.d/hotplug-light ] ; then
680     einfo "Starting hotplug-light system in background."
681     /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
682     eend 0
683   else
684     ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
685   fi
686 fi
687 }
688 # }}}
689
690 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
691 config_blacklist(){
692 if checkbootparam "blacklist" ; then
693  if [ -z "$INSTALLED" ]; then
694   einfo "Bootoption blacklist found."
695   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
696   if [ -n "$BLACK" ] ; then
697     einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
698     echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
699     echo "blacklist $BLACK"     >> /etc/modprobe.d/grml
700     echo "alias     $BLACK off" >> /etc/modprobe.d/grml
701     echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
702   else
703    eerror "No given module for blacklist found. Blacklisting will not work therefore."
704   fi
705  else
706   ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
707   eindent
708    einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
709   eoutdent
710  fi
711 fi
712 }
713 # }}}
714
715 # {{{ ACPI
716 config_acpi_apm(){
717 if [ -d /proc/acpi ]; then
718   if checkbootparam "noacpi"; then
719     ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
720   elif checkbootparam "nogrmlacpi" ; then
721     ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
722   else
723     einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
724     eindent
725     found=""
726     for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
727       basename="${a##*/}"
728       basename="${basename%%.*}"
729       case "$basename" in *_acpi)
730        egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
731       esac
732       modprobe $basename >>$DEBUG 2>&1 && found="yes"
733       local BASE="$BASE $basename"
734     done
735     if [ -n "$found" ] ; then
736       einfo "$BASE"  ; eend 0
737     else
738       ewarn "(none)" ; eend 1
739     fi
740     if ! [ -S /var/run/acpid.socket ] ; then
741       if ! [ -r /var/run/dbus/pid ] ; then
742         einfo "Starting acpi daemon."
743         /etc/init.d/acpid start >>$DEBUG ; eend $?
744       else
745         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
746         eerror "Solution: please activate acpid via /etc/runlevel.conf"
747         eend 1
748       fi
749     else
750       ewarn "acpi daemon already running."
751       eend 0
752     fi
753     eoutdent
754   fi
755 else
756 # APM
757   if checkbootparam "noapm"; then
758     ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
759   else
760     modprobe apm power_off=1 >>$DEBUG 2>&1
761     if [ "$?" = "0" ] ; then
762        if [ -x /etc/init.d/apmd ] ;then
763           einfo "APM Bios found, enabling power management functions."
764           /etc/init.d/apmd start ; eend $?
765        fi
766     else
767       eerror "Loading apm module failed." ; eend 1
768     fi
769   fi
770 fi
771 }
772 # }}}
773
774 # {{{ PCMCIA Check/Setup
775 # This needs to be done before other modules are being loaded (by hwsetup)
776 config_pcmcia(){
777 if checkbootparam "nopcmcia"; then
778   ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
779 else
780   if /usr/sbin/laptop-detect ; then
781     einfo "Detected Laptop - checking for PCMCIA." && eend 0
782     modprobe pcmcia_core >>$DEBUG 2>&1
783     # Try Cardbus or normal PCMCIA socket drivers
784     modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
785     if [ "$?" = "0" ]; then
786       modprobe ds >>$DEBUG 2>&1
787       if [ -d /proc/bus/pccard ] ; then
788        if [ -x /sbin/cardmgr ] ; then
789         einfo "PCMCIA found, starting cardmgr."
790         cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
791        else
792         eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
793        fi
794       fi
795     fi
796   fi
797 fi
798 }
799 # }}}
800
801 # {{{ run software synthesizer via speakup
802 config_swspeak(){
803 if checkbootparam swspeak ; then
804  if [ -d /proc/speakup/ ] ; then
805   einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
806   eindent
807    if [ -x /etc/init.d/speech-dispatcher ] ; then
808      einfo "Starting speech-dispatcher."
809      /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
810      einfo "Activating sftsyn in Kernel."
811      echo sftsyn >/proc/speakup/synth_name ; eend $?
812      einfo "Just run swspeak if you want to use software synthesizer via speakup."
813      flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
814    else
815     eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
816     flite -o play -t "speech-dispatcher not available. speakup will not work without it."
817    fi
818   eoutdent
819  else
820   eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
821   flite -o play -t "Kernel does not seem to support speakup. Sorry."
822  fi
823 fi
824 }
825 # }}}
826
827 # {{{ Check for blind option or brltty
828 config_blind(){
829 BLIND=""
830 checkbootparam "blind" && BLIND="yes"
831 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
832
833 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
834   if [ -x /sbin/brltty ]; then
835     # Blind option detected, start brltty now.
836     # modprobe serial_core parport_serial generic_serial && echo "done"
837     CMD=brltty
838     BRLTYPE=""
839     BRLDEV=""
840     BRLTEXT=""
841     if [ -n "$BRLTTY" ]; then
842       # Extra options
843       BRLTYPE="${BRLTTY%%,*}"
844       R="${BRLTTY#*,}"
845       if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
846         BRLTTY="$R"
847         BRLDEV="${BRLTTY%%,*}"
848         R="${BRLTTY#*,}"
849         if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
850           BRLTTY="$R"
851           BRLTEXT="${BRLTTY%%,*}"
852           R="${BRLTTY#*,}"
853         fi
854       fi
855     fi
856     [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
857     [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
858     [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
859     einfo "Starting braille-display manager."
860 #    ( exec $CMD & )
861     ( sh -c "$CMD" & )
862     sleep 2 && BLINDSOUND="yes"
863     eend 0
864   fi
865 fi
866 }
867 # }}}
868
869 # {{{ Interactive configuration
870 config_interactive(){
871 if [ -n "$INTERACTIVE" ] ; then
872 einfo "Entering interactive configuration second stage."
873
874   echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}"
875   echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] "
876   read a
877   [ "$a" != "n" ] && /usr/sbin/dpkg-reconfigure console-data ; eend $?
878
879   echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] "
880   read a
881   [ "$a" != "n" ] && alsaconf && ( exec aumix -m 0 >>$DEBUG 2>&1 & ) ; eend $?
882
883   echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] "
884   read a
885   [ "$a" != "n" ] && xorgcfg -textmode ; eend $?
886   echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}"
887 fi
888 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       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1516       if [ -n "$ERROR" ] ; then
1517          eindent
1518          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1519          eoutdent
1520       fi
1521       eend $RC
1522   fi
1523
1524 fi
1525 }
1526 # }}}
1527
1528 # {{{ modem detection
1529 config_modem(){
1530 if checkbootparam "nomodem"; then
1531   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1532 else
1533   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1534      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1535         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1536         eend 0
1537      fi
1538   fi
1539 fi
1540 }
1541 # }}}
1542
1543 # {{{ keyboard add-ons
1544 config_setkeycodes(){
1545 if checkbootparam "setkeycodes" ; then
1546  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1547   # MS MM keyboard add-on
1548   # fix
1549   setkeycodes e001 126 &>/dev/null
1550   setkeycodes e059 127 &>/dev/null
1551   # fn keys
1552   setkeycodes e03b 59 &>/dev/null
1553   setkeycodes e008 60 &>/dev/null
1554   setkeycodes e007 61 &>/dev/null
1555   setkeycodes e03e 62 &>/dev/null
1556   setkeycodes e03f 63 &>/dev/null
1557   setkeycodes e040 64 &>/dev/null
1558   setkeycodes e041 65 &>/dev/null
1559   setkeycodes e042 66 &>/dev/null
1560   setkeycodes e043 67 &>/dev/null
1561   setkeycodes e023 68 &>/dev/null
1562   setkeycodes e057 87 &>/dev/null
1563   setkeycodes e058 88 &>/dev/null
1564   # hp keycodes
1565   setkeycodes e00a 89 e008 90 &>/dev/null
1566  eend 0
1567 fi
1568 }
1569 # }}}
1570
1571 # {{{ wondershaper
1572 config_wondershaper(){
1573  if checkbootparam "wondershaper" ; then
1574     WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1575     CMD=wondershaper
1576     DEVICE=""
1577     DOWNSTREAM=""
1578     UPSTREAM=""
1579     if [ -n "$WONDER" ]; then
1580       # Extra options
1581       DEVICE="${WONDER%%,*}"
1582       R="${WONDER#*,}"
1583       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1584         WONDER="$R"
1585         DOWNSTREAM="${WONDER%%,*}"
1586         R="${WONDER#*,}"
1587         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1588           WONDER="$R"
1589           UPSTREAM="${WONDER%%,*}"
1590           R="${WONDER#*,}"
1591         fi
1592       fi
1593     fi
1594     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1595     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1596     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1597     einfo "Starting wondershaper (${CMD}) in background."
1598     ( sh -c $CMD & ) && eend 0
1599  fi
1600 }
1601 # }}}
1602
1603 # {{{ syslog-ng
1604 config_syslog(){
1605  if checkbootparam "nosyslog"; then
1606   ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1607  else
1608   einfo "Starting syslog-ng in background."
1609   /etc/init.d/syslog-ng start 1>>$DEBUG &
1610   eend 0
1611  fi
1612 }
1613 # }}}
1614
1615 # {{{ gpm
1616 config_gpm(){
1617  if checkbootparam "nogpm"; then
1618   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1619  else
1620   einfo "Starting gpm in background."
1621 #  /etc/init.d/gpm start 1>>$DEBUG &
1622   ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1623   eend 0
1624  fi
1625 }
1626 # }}}
1627
1628 # {{{ services
1629 config_services(){
1630  if checkbootparam "services" ; then
1631     SERVICE="$(getbootparam services 2>>$DEBUG)"
1632     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1633     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1634     einfo "Starting service(s) ${SERVICENL} in background."
1635     for service in $(echo -e $SERVICELIST) ; do
1636        /etc/init.d/${service} start 1>>$DEBUG &
1637     done
1638     [ "$?" == "0" ] ; eend $?
1639  fi
1640 }
1641 # }}}
1642
1643 # {{{ config files
1644 config_netconfig(){
1645  if checkbootparam netconfig ; then
1646   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1647   CONFIGFILE='/tmp/netconfig.grml'
1648
1649   getconfig() {
1650   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
1651        --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1652   }
1653   einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1654   counter=10
1655   while ! getconfig && [[ "$counter" != 0 ]] ; do
1656     echo -n "Sleeping for 5 seconds and trying to get config again... "
1657     counter=$(( counter-1 ))
1658     echo "$counter tries left" ; sleep 1
1659   done
1660   if [ -r "$CONFIGFILE" ] ; then
1661     einfo "Downloading was successfull." ; eend 0
1662     einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1663     md5sum $CONFIGFILE ; eend 0
1664     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1665   else
1666     einfo "Sorry, could not fetch $CONFIG" ; eend 1
1667   fi
1668  fi
1669 }
1670 # }}}
1671
1672 # {{{ blindsound
1673 config_blindsound(){
1674  if checkbootparam "blind" ; then
1675     beep
1676     flite -o play -t "welcome to the gremel system"
1677  fi
1678 }
1679 # }}}
1680
1681 # {{{ welcome sound
1682 config_welcome(){
1683  if checkbootparam welcome ; then
1684   flite -o play -t "welcome to the gremel system"
1685  fi
1686 }
1687 # }}}
1688
1689 # {{{ fix/workaround for unionfs
1690 fix_unionfs(){
1691   if [ -z "$INSTALLED" ]; then
1692    touch /var/cache/apt/*cache.bin
1693   fi
1694 }
1695 # }}}
1696
1697 # {{{ create all /mnt-directories
1698 create_mnt_dirs(){
1699   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1700   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1701 }
1702 # }}}
1703
1704 # {{{ start X window system via grml-x
1705 config_x_startup(){
1706 if checkbootparam startx ; then
1707  if [ -x /usr/X11R6/bin/X ] ; then
1708   if [ -z "$INSTALLED" ] ; then
1709    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1710    if [ -z "$WINDOWMANAGER" ] ; then
1711      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1712      WINDOWMANAGER="wm-ng"
1713    else
1714      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1715    fi
1716    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1717    config_userfstab || fstabuser='grml'
1718  cat>|/etc/init.d/xstartup<<EOF
1719 #!/bin/sh
1720 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1721 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1722 EOF
1723    chmod 755 /etc/init.d/xstartup
1724
1725    # adjust inittab for xstartup
1726    if grep -q '^6:' /etc/inittab ; then
1727       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1728    else # just append tty6 to inittab if no definition is present:
1729       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1730    fi
1731
1732    /sbin/telinit q ; eend $?
1733
1734    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1735       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1736    else
1737       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1738    fi
1739
1740   else
1741     eerror "We are not running from CD - startx will not work, skipping it.
1742      Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1743   fi
1744  else
1745    eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1746    Boot parameter startx does not work therefore." ; eend 1
1747  fi
1748 fi
1749 }
1750 # }}}
1751
1752 # {{{ configuration framework
1753 config_extract(){
1754 if checkbootparam extract ; then
1755  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1756  EXTRACTOPTIONS="-- -x $EXTRACT"
1757 fi
1758 }
1759
1760 config_automount(){
1761 if checkbootparam noautoconfig || checkbootparam forensic ; then
1762   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1763 else
1764  if [ -z "$INSTALLED" ] ; then
1765   einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1766   eindent
1767   [ -d /mnt/grml ] || mkdir /mnt/grml
1768   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1769 # We do need the following fix so floppy disk is available to blkid in any case :-/
1770   if [ -r /dev/fd0 ] ; then
1771      einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1772 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1773      if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1774         blkid /dev/fd0 1>>$DEBUG 2>&1
1775      fi
1776   fi
1777   DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1778   [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1779   if [[ $RC == 0 ]]; then
1780     einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1781
1782     CONFIG=''
1783     CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1784     if [ -n "$CONFIG" ]; then
1785       einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1786       cd /
1787       unp $CONFIG $EXTRACTOPTIONS ; eend $?
1788     else
1789       ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1790     fi
1791
1792     SCRIPT=''
1793     SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1794     if [ -n "$SCRIPT" ]; then
1795       einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1796       $SCRIPT ; eend $?
1797     fi
1798     grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1799   else
1800     ewarn "No devices with label GRMLCFG found." ; eend 0
1801   fi
1802   eoutdent
1803  fi
1804 fi
1805 }
1806
1807 config_myconfig(){
1808
1809 if checkbootparam "config" ; then
1810   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1811   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1812   einfo "Bootoption config found. config is set to: $CONFIG"
1813   eindent
1814     einfo "Trying to extract configuration file ${CONFIG}:"
1815     cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1816   eoutdent
1817 fi
1818
1819 if checkbootparam myconfig ; then
1820  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1821  if [ -n "$MOUNTDEVICE" ]; then
1822    if checkbootparam file ; then
1823     FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1824     [ -n "$FILENAME" ] || FILENAME='config.tbz'
1825    fi
1826    [ -d /mnt/grml ] || mkdir /mnt/grml
1827    umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1828    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1829     if [[ $RC == 0 ]]; then
1830       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1831       eindent
1832       CONFIG=''
1833       CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1834       if [ -n "$CONFIG" ]; then
1835         einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1836         cd /
1837         unp $CONFIG $EXTRACTOPTIONS ; eend $?
1838       else
1839         ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1840       fi
1841
1842       SCRIPT=''
1843       SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1844       if [ -n "$SCRIPT" ]; then
1845         einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1846         $SCRIPT ; eend $?
1847       fi
1848       eoutdent
1849     else
1850       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1851     fi # mount $MOUNTDEVICE
1852    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1853  else
1854    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1855  fi # [ -n "$MOUNTDEVICE" ]
1856 fi # checkbootparam myconfig
1857
1858 if checkbootparam "partconf" ; then
1859  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1860  if [ -n "$MOUNTDEVICE" ]; then
1861    [ -d /mnt/grml ] || mkdir /mnt/grml
1862    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1863     if [[ $RC == 0 ]]; then
1864       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1865       einfo "Copying files from $MOUNTDEVICE over grml system."
1866       for file in `cat /etc/grml/partconf` ; do
1867         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1868         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1869       done && eend 0
1870     else
1871       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1872     fi # mount $MOUNTDEVICE
1873    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1874  else
1875    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1876  fi # [ -n "$MOUNTDEVICE" ]
1877 fi
1878 }
1879 # }}}
1880
1881 # {{{ /cdrom/.*-options
1882 config_debs(){
1883 if checkbootparam "debs" ; then
1884   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1885   einfo "Tring to install debian package(s) ${DEBS}"
1886   dpkg -i /cdrom/debs/$DEBS* ; eend $?
1887 fi
1888 }
1889
1890 config_scripts(){
1891 if checkbootparam "scripts" ; then
1892   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1893   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1894   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1895   sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1896 fi
1897 }
1898 # }}}
1899
1900 # {{{ distcc
1901 config_distcc(){
1902 if checkbootparam "distcc" ; then
1903  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1904  if [ -n "$OPTIONS" ]; then
1905     NET=""
1906     INTERFACE=""
1907     if [ -n "$OPTIONS" ]; then
1908       NET="${OPTIONS%%,*}"
1909       R="${OPTIONS#*,}"
1910       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1911         OPTIONS="$R"
1912         INTERFACE="${OPTIONS%%,*}"
1913         R="${OPTIONS#*,}"
1914       fi
1915     fi
1916  fi
1917  CONFIG=/etc/default/distcc
1918  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1919  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1920
1921  if [ -n "$INTERFACE" ] ; then
1922    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1923
1924    counter=10
1925    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1926      counter=$(( counter-1 ))
1927      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1928      sleep 3
1929      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1930    done
1931  fi
1932
1933  if [ -n "$IP" ] ; then
1934    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1935
1936    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1937    eindent
1938     id distccd >/dev/null 2>&1 || \
1939     (
1940       einfo "Creating distcc user" ; \
1941       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1942     )
1943
1944     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1945    /etc/init.d/distcc start 1>/dev/null ; eend $?
1946    eoutdent
1947  else
1948    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1949  fi
1950 fi
1951
1952 if checkbootparam "gcc"; then
1953  GCC="$(getbootparam gcc 2>>$DEBUG)"
1954  eindent
1955  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1956  eoutdent
1957  rm -f /usr/bin/gcc
1958  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1959 fi
1960
1961 if checkbootparam "gpp"; then
1962  GPP="$(getbootparam gpp 2>>$DEBUG)"
1963  eindent
1964   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1965   if [ -x /usr/bin/g++-${GPP} ] ; then
1966      rm -f /usr/bin/g++
1967      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1968   fi
1969   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1970   if [ -x /usr/bin/cpp-${GPP} ] ; then
1971      rm -f /usr/bin/cpp
1972      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1973   fi
1974  eoutdent
1975 fi
1976
1977 }
1978 # }}}
1979
1980 # {{{ load modules
1981 # Notice: use it only on live-cd system, if running from harddisk please
1982 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1983 # in /etc/runlevel.conf
1984 config_modules(){
1985 MODULES_FILE=/etc/grml/modules
1986 if checkbootparam nomodules ; then
1987   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1988 elif [ -z "$INSTALLED" ]; then
1989  if [ -r $MODULES_FILE ] ; then
1990   einfo "Loading modules specified in ${MODULES_FILE}:"
1991   eindent
1992   grep '^[^#]' $MODULES_FILE | \
1993   while read module args; do
1994     [ "$module" ] || continue
1995       einfo "${module}"
1996       modprobe $module $args ; eend $?
1997   done
1998   eoutdent
1999  else
2000   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2001  fi
2002 fi
2003 }
2004 # }}}
2005
2006 # {{{ 915resolution
2007 config_915resolution(){
2008 if checkbootparam "915resolution" ; then
2009  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2010   if [ -x /usr/sbin/915resolution ]; then
2011     CMD=915resolution
2012     MODE=""
2013     XRESO=""
2014     YRESO=""
2015     if [ -n "$OPTIONS" ]; then
2016       # Extra options
2017       MODE="${OPTIONS%%,*}"
2018       R="${OPTIONS#*,}"
2019       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2020         OPTIONS="$R"
2021         XRESO="${OPTIONS%%,*}"
2022         R="${OPTIONS#*,}"
2023         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2024           OPTIONS="$R"
2025           YRESO="${OPTIONS%%,*}"
2026           R="${OPTIONS#*,}"
2027         fi
2028       fi
2029     fi
2030     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2031     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2032     eend 0
2033   fi
2034 fi
2035 }
2036 # }}}
2037
2038 # {{{ SW-RAID
2039 config_swraid(){
2040   if [ -z "$INSTALLED" ] ; then
2041   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2042   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2043      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2044      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2045   else
2046     if ! [ -x /sbin/mdadm ] ; then
2047        eerror "mdadm not available, can not execute it." ; eend 1
2048     else
2049
2050        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2051        # find out whether we have a valid configuration file already
2052        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2053           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2054           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2055           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2056         else
2057           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2058        fi
2059
2060        if ! checkbootparam 'swraid' ; then
2061           eindent
2062           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2063           eoutdent
2064        else
2065           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2066           eindent
2067            IFSOLD=${IFS:-}
2068            IFS='
2069 '
2070            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2071                case $line in
2072                  *'No arrays found'*)
2073                    ewarn "$line" ; eend 0
2074                    ;;
2075                  *)
2076                    einfo "$line" ; eend 0
2077                    ;;
2078                esac
2079            done
2080            IFS=$IFSOLD
2081          eoutdent
2082
2083          if [ -r /proc/mdstat ] ; then
2084             eindent
2085             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2086             if [ -z "$MDSTAT" ] ; then
2087                ewarn "No active arrays found" ; eend 0
2088             else
2089                IFSOLD=${IFS:-}
2090                IFS='
2091 '
2092                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2093                    einfo "active arrays: $line" ; eend 0
2094                done
2095                IFS=$IFSOLD
2096             fi
2097             eoutdent
2098          fi # /proc/mdstat
2099        fi # bootoption swraid
2100
2101      fi # is /sbin/mdadm executable?
2102   fi # check for bootoptions
2103   fi # run only in live-cd mode
2104 }
2105 # }}}
2106
2107 # {{{ LVM (Logical Volumes)
2108 config_lvm(){
2109   if [ -z "$INSTALLED" ] ; then
2110   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2111   if checkbootparam 'nolvm' ; then
2112      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2113   else
2114     if ! [ -x /sbin/lvm -a -x /etc/init.d/lvm2 -a -x /sbin/lvdisplay ] ; then
2115        eerror "LVM not available, can not execute it." ; eend 1
2116     else
2117        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2118           einfo "You seem to have logical volumes (LVM) on your system."
2119           eindent
2120           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2121           eend 0
2122           if checkbootparam 'lvm' ; then
2123              einfo "Bootoption LVM found. Searching for logical volumes:"
2124              /etc/init.d/lvm2 start ; eend $?
2125           fi
2126           eoutdent
2127        fi
2128     fi # check for lvm binary
2129   fi # check for bootoption nolvm
2130   fi # run only in live-cd mode
2131 }
2132 # }}}
2133
2134 # {{{ debnet: setup network based on an existing one found on a partition
2135 config_debnet(){
2136 if checkbootparam "debnet" ; then
2137  iszsh && setopt shwordsplit
2138  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2139  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2140  FOUND_DEBNET=""
2141
2142  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2143  eindent
2144  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2145     for i in $DEVICES; do
2146      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2147          einfo "Scanning on $i"
2148        if [ -f /mnt/etc/network/interfaces ]; then
2149          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2150          FOUND_DEBNET="$i"
2151          break
2152        fi
2153        umount /mnt
2154      fi
2155     done
2156
2157    if [ -n "$FOUND_DEBNET" ]; then
2158      einfo "Stopping network."
2159        pump -k 1>/dev/null 2>&1
2160        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2161      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2162        rm -rf /etc/network/run
2163        cp -a /mnt/etc/network /etc
2164        rm -rf /etc/network/run
2165        mkdir /etc/network/run
2166        umount /mnt ; eend $?
2167      einfo "Starting network."
2168        /etc/init.d/networking start ; eend $?
2169    else
2170      eerror "/etc/network/interfaces not found." ; eend 1
2171    fi
2172    eoutdent
2173  else
2174   eerror "Error: /mnt already mounted." ; eend 1
2175  fi
2176 fi
2177 }
2178 # }}}
2179
2180 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2181 config_ipw3945() {
2182   if grep -q ipw3945 /proc/modules ; then
2183      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2184         ewarn "Broken ipw3945 network interface found, reloading module."
2185         rmmod ipw3945
2186         modprobe ipw3945
2187         eend $?
2188      fi
2189   fi
2190 }
2191 # }}}
2192
2193 # {{{ disable console blanking
2194 config_blanking(){
2195 if checkbootparam "noblank" ; then
2196   einfo "Bootoption noblank found. Disabling monitor blanking."
2197   setterm -blank 0 ; eend $?
2198 fi
2199 }
2200 # }}}
2201
2202 # {{{ grml2hd: automatic installation
2203 config_grml2hd(){
2204
2205 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2206
2207 if checkbootparam "user" ; then
2208    NEWUSER=''
2209    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2210    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2211 fi
2212
2213 if checkbootparam "filesystem" ; then
2214    FILESYSTEM=''
2215    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2216    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2217 fi
2218
2219 if checkbootparam "partition" ; then
2220    PARTITION=''
2221    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2222    # notice: the following checks whether the given partition is available, if not the skip
2223    # execution of grml2hd as it might result in data loss...
2224    if [ -r $PARTITION ] ; then
2225       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2226    else
2227       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2228    fi
2229 fi
2230
2231 if checkbootparam "mbr" ; then
2232    BOOT_PARTITION=''
2233    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2234    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2235 fi
2236
2237 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2238 #!/bin/sh
2239 GRML2HD_NONINTERACTIVE='yes' grml2hd
2240 EOF
2241
2242 chmod 755 /usr/bin/grml2hd_noninteractive
2243 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2244 if [ -z "$GRML2HD_FAIL" ] ; then
2245    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2246 else
2247    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2248 fi
2249
2250 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2251 }
2252 # }}}
2253
2254 # {{{ debootstrap: automatic installation
2255 config_debootstrap(){
2256
2257 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2258
2259 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2260
2261 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2262    eindent
2263    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2264    eoutdent
2265    exit 1
2266 fi
2267
2268 if checkbootparam "target" ; then
2269   TARGET=''
2270   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2271   # notice: the following checks whether the given partition is available, if not the skip
2272   # execution of grml-debootstrap as it might result in data loss...
2273   if ! [ -r "$TARGET" ] ; then
2274      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2275   fi
2276 else
2277   eindent
2278   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2279   eoutdent
2280   exit 1
2281 fi
2282
2283 if checkbootparam "grub" ; then
2284   GRUB=''
2285   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2286 fi
2287
2288 if checkbootparam "groot" ; then
2289   GROOT=''
2290   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2291 fi
2292
2293 if checkbootparam "release" ; then
2294   RELEASE=''
2295   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2296 fi
2297
2298 if checkbootparam "mirror" ; then
2299   MIRROR=''
2300   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2301 fi
2302
2303 if checkbootparam "boot_append" ; then
2304   BOOT_APPEND=''
2305   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2306 fi
2307
2308 if checkbootparam "password" ; then
2309   PASSWORD=''
2310   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2311 fi
2312
2313 # now check which options are available
2314 if [ -n "TARGET" ] ; then
2315    TARGETCMD="--target $TARGET"
2316 else
2317    TARGETCMD=''
2318    eindent
2319    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2320    eoutdent
2321    exit 1
2322 fi
2323 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2324 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2325 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2326 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2327 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2328 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2329
2330 # and finally write script and execute it
2331 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2332 #!/bin/sh
2333 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2334 EOF
2335
2336 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2337
2338 screen /usr/bin/grml-debootstrap_noninteractive
2339 einfo "Invoking a shell, just exit to continue booting..."
2340 /bin/zsh
2341
2342 fi # stringinstring "BOOT_IMAGE=debian2hd
2343 }
2344 # }}}
2345
2346 # {{{ Support customization
2347 config_distri(){
2348 if checkbootparam "distri"; then
2349   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2350   if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2351      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2352      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2353      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2354      cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2355   fi
2356 fi
2357 }
2358 # }}}
2359
2360 ### {{{ backwards compatible stuff
2361 config_environment(){
2362   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2363 }
2364 config_keyboard(){
2365   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2366 }
2367 # }}}
2368
2369 ## END OF FILE #################################################################
2370 # vim:foldmethod=marker expandtab ai ft=zsh