96c170342c8925a19be2654ee854e1d1f78269f4
[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: Don Nov 15 11:46:04 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
290  if [ -n "$CHARMAP" ] ; then
291     einfo "Running consolechars for ${CHARMAP}"
292     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
293         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
294     done
295     eend $RC
296  fi
297
298  if [ -n "$CONSOLEFONT" ] ; then
299     einfo "Running consolechars using ${CONSOLEFONT}"
300     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
301         consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
302     done
303     eend $?
304  fi
305
306  eoutdent
307 }
308 # }}}
309
310 # {{{ Set hostname
311 config_hostname(){
312  if checkbootparam hostname ; then
313   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
314   einfo "Setting hostname to $HOSTNAME as requested."
315   sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
316   hostname $HOSTNAME ; eend $?
317  else
318   hostname --file /etc/hostname
319  fi
320 }
321 # }}}
322
323 # fstabuser (needed when running from harddisk with username != grml {{{
324 config_userfstab(){
325   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
326   if [ -n "$CONFIG_FSTAB_USER" ] ; then
327      fstabuser="$CONFIG_FSTAB_USER"
328   else
329      fstabuser=$(getent passwd 1000 | cut -d: -f1)
330   fi
331   # if not yet set fall back to default 'grml' user
332   [ -n "$fstabuser" ] || fstabuser='grml'
333 }
334 # }}}
335
336 # {{{ Set clock (Local time is more often used than GMT, so it is default)
337 config_time(){
338  # don't touch the files if running from harddisk:
339  if [ -z "$INSTALLED" ]; then
340     UTC=""
341     checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
342     checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
343     # hwclock uses the TZ variable
344     [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
345     [ -n "$TZ" ] || TZ=Europe/Vienna
346
347     if ! [ -r /dev/rtc ] ; then
348       ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
349     else
350       ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
351       if [ -n "$ERROR" ] ; then
352          eindent
353          ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
354          if [ -n "$ERROR" ] ; then
355             eerror "Problem running hwclock: $ERROR" ; eend 1
356          fi
357          eoutdent
358       fi
359     fi
360  fi
361 }
362 # }}}
363
364 # {{{ print kernel info
365 config_kernel(){
366   vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
367   [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
368   einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
369   if [ -r /proc/cpuinfo ] ; then
370      if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
371        eindent
372        einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
373        eoutdent
374      fi
375   fi
376   if [ -d /proc/xen ] ; then
377      eindent
378      einfo 'Running kernel featuring support for Xen detected' ; eend 0
379      eoutdent
380   fi
381 }
382 # }}}
383
384 # {{{ vmware specific stuff
385 config_vmware(){
386 if checkbootparam novmware ; then
387    ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
388 else
389    if [ -z "$INSTALLED" ] ; then
390       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
391               if ! checkbootparam qemu ; then
392             if [ -r /etc/X11/xorg.conf.vmware ] ; then
393                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
394                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
395             fi
396          fi
397       fi
398    fi
399 fi
400 }
401 # }}}
402
403 # {{{ qemu specific stuff
404 config_qemu(){
405 if checkbootparam qemu ; then
406    if [ -r /etc/X11/xorg.conf.example ] ; then
407       einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
408       cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
409    fi
410 fi
411 }
412 # }}}
413
414 # {{{ ld.so.cache + depmod
415 config_ld_mod(){
416 if [ -n "$INSTALLED" ]; then
417  if ! [ -r /etc/grml.first.boot ] ; then
418   einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
419   eindent
420 # Regenerate ld.so.cache and module dependencies on HD
421     einfo "Running ldconfig" ; ldconfig  ; eend $?
422     einfo "Running depmod"   ; depmod -a ; eend $?
423     touch /etc/grml.first.boot
424     eend 0
425   eoutdent
426  fi
427 fi
428 }
429 # }}}
430
431 # update_progress {{{
432 update_progress(){
433   # be sure we are non-blocking
434   (echo "$1" > /etc/sysconfig/progress) &
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       ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1509       if [ -n "$ERROR" ] ; then
1510          eindent
1511          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1512          eoutdent
1513       fi
1514       eend $RC
1515   fi
1516
1517 fi
1518 }
1519 # }}}
1520
1521 # {{{ modem detection
1522 config_modem(){
1523 if checkbootparam "nomodem"; then
1524   ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1525 else
1526   if [ -x /etc/init.d/sl-modem-daemon ] ; then
1527      if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1528         einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1529         eend 0
1530      fi
1531   fi
1532 fi
1533 }
1534 # }}}
1535
1536 # {{{ keyboard add-ons
1537 config_setkeycodes(){
1538 if checkbootparam "setkeycodes" ; then
1539  einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1540   # MS MM keyboard add-on
1541   # fix
1542   setkeycodes e001 126 &>/dev/null
1543   setkeycodes e059 127 &>/dev/null
1544   # fn keys
1545   setkeycodes e03b 59 &>/dev/null
1546   setkeycodes e008 60 &>/dev/null
1547   setkeycodes e007 61 &>/dev/null
1548   setkeycodes e03e 62 &>/dev/null
1549   setkeycodes e03f 63 &>/dev/null
1550   setkeycodes e040 64 &>/dev/null
1551   setkeycodes e041 65 &>/dev/null
1552   setkeycodes e042 66 &>/dev/null
1553   setkeycodes e043 67 &>/dev/null
1554   setkeycodes e023 68 &>/dev/null
1555   setkeycodes e057 87 &>/dev/null
1556   setkeycodes e058 88 &>/dev/null
1557   # hp keycodes
1558   setkeycodes e00a 89 e008 90 &>/dev/null
1559  eend 0
1560 fi
1561 }
1562 # }}}
1563
1564 # {{{ wondershaper
1565 config_wondershaper(){
1566  if checkbootparam "wondershaper" ; then
1567     WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1568     CMD=wondershaper
1569     DEVICE=""
1570     DOWNSTREAM=""
1571     UPSTREAM=""
1572     if [ -n "$WONDER" ]; then
1573       # Extra options
1574       DEVICE="${WONDER%%,*}"
1575       R="${WONDER#*,}"
1576       if [ -n "$R" -a "$R" != "$WONDER" ]; then
1577         WONDER="$R"
1578         DOWNSTREAM="${WONDER%%,*}"
1579         R="${WONDER#*,}"
1580         if [ -n "$R" -a "$R" != "$WONDER" ]; then
1581           WONDER="$R"
1582           UPSTREAM="${WONDER%%,*}"
1583           R="${WONDER#*,}"
1584         fi
1585       fi
1586     fi
1587     [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
1588     [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1589     [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
1590     einfo "Starting wondershaper (${CMD}) in background."
1591     ( sh -c $CMD & ) && eend 0
1592  fi
1593 }
1594 # }}}
1595
1596 # {{{ syslog-ng
1597 config_syslog(){
1598  if checkbootparam "nosyslog"; then
1599   ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1600  else
1601   einfo "Starting syslog-ng in background."
1602   /etc/init.d/syslog-ng start 1>>$DEBUG &
1603   eend 0
1604  fi
1605 }
1606 # }}}
1607
1608 # {{{ gpm
1609 config_gpm(){
1610  if checkbootparam "nogpm"; then
1611   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1612  else
1613   einfo "Starting gpm in background."
1614 #  /etc/init.d/gpm start 1>>$DEBUG &
1615   ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1616   eend 0
1617  fi
1618 }
1619 # }}}
1620
1621 # {{{ services
1622 config_services(){
1623  if checkbootparam "services" ; then
1624     SERVICE="$(getbootparam services 2>>$DEBUG)"
1625     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1626     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1627     einfo "Starting service(s) ${SERVICENL} in background."
1628     for service in $(echo -e $SERVICELIST) ; do
1629        /etc/init.d/${service} start 1>>$DEBUG &
1630     done
1631     [ "$?" == "0" ] ; eend $?
1632  fi
1633 }
1634 # }}}
1635
1636 # {{{ config files
1637 config_netconfig(){
1638  if checkbootparam netconfig ; then
1639   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1640   CONFIGFILE='/tmp/netconfig.grml'
1641
1642   getconfig() {
1643   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
1644        --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1645   }
1646   einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1647   counter=10
1648   while ! getconfig && [[ "$counter" != 0 ]] ; do
1649     echo -n "Sleeping for 5 seconds and trying to get config again... "
1650     counter=$(( counter-1 ))
1651     echo "$counter tries left" ; sleep 1
1652   done
1653   if [ -r "$CONFIGFILE" ] ; then
1654     einfo "Downloading was successfull." ; eend 0
1655     einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1656     md5sum $CONFIGFILE ; eend 0
1657     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1658   else
1659     einfo "Sorry, could not fetch $CONFIG" ; eend 1
1660   fi
1661  fi
1662 }
1663 # }}}
1664
1665 # {{{ blindsound
1666 config_blindsound(){
1667  if checkbootparam "blind" ; then
1668     beep
1669     flite -o play -t "welcome to the gremel system"
1670  fi
1671 }
1672 # }}}
1673
1674 # {{{ welcome sound
1675 config_welcome(){
1676  if checkbootparam welcome ; then
1677   flite -o play -t "welcome to the gremel system"
1678  fi
1679 }
1680 # }}}
1681
1682 # {{{ fix/workaround for unionfs
1683 fix_unionfs(){
1684   if [ -z "$INSTALLED" ]; then
1685    touch /var/cache/apt/*cache.bin
1686   fi
1687 }
1688 # }}}
1689
1690 # {{{ create all /mnt-directories
1691 create_mnt_dirs(){
1692   ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1693   ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1694 }
1695 # }}}
1696
1697 # {{{ start X window system via grml-x
1698 config_x_startup(){
1699 if checkbootparam startx ; then
1700  if [ -x /usr/X11R6/bin/X ] ; then
1701   if [ -z "$INSTALLED" ] ; then
1702    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1703    if [ -z "$WINDOWMANAGER" ] ; then
1704      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1705      WINDOWMANAGER="wm-ng"
1706    else
1707      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1708    fi
1709    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1710    config_userfstab || fstabuser='grml'
1711  cat>|/etc/init.d/xstartup<<EOF
1712 #!/bin/sh
1713 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1714 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1715 EOF
1716    chmod 755 /etc/init.d/xstartup
1717
1718    # adjust inittab for xstartup
1719    if grep -q '^6:' /etc/inittab ; then
1720       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1721    else # just append tty6 to inittab if no definition is present:
1722       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1723    fi
1724
1725    /sbin/telinit q ; eend $?
1726
1727    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1728       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1729    else
1730       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1731    fi
1732
1733   else
1734     eerror "We are not running from CD - startx will not work, skipping it.
1735      Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1736   fi
1737  else
1738    eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1739    Boot parameter startx does not work therefore." ; eend 1
1740  fi
1741 fi
1742 }
1743 # }}}
1744
1745 # {{{ configuration framework
1746 config_extract(){
1747 if checkbootparam extract ; then
1748  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1749  EXTRACTOPTIONS="-- -x $EXTRACT"
1750 fi
1751 }
1752
1753 config_automount(){
1754 if checkbootparam noautoconfig || checkbootparam forensic ; then
1755   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1756 else
1757  if [ -z "$INSTALLED" ] ; then
1758   einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1759   eindent
1760   [ -d /mnt/grml ] || mkdir /mnt/grml
1761   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1762 # We do need the following fix so floppy disk is available to blkid in any case :-/
1763   if [ -r /dev/fd0 ] ; then
1764      einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1765 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1766      if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1767         blkid /dev/fd0 1>>$DEBUG 2>&1
1768      fi
1769   fi
1770   DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1771   [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1772   if [[ $RC == 0 ]]; then
1773     einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1774
1775     CONFIG=''
1776     CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1777     if [ -n "$CONFIG" ]; then
1778       einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1779       cd /
1780       unp $CONFIG $EXTRACTOPTIONS ; eend $?
1781     else
1782       ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1783     fi
1784
1785     SCRIPT=''
1786     SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1787     if [ -n "$SCRIPT" ]; then
1788       einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1789       $SCRIPT ; eend $?
1790     fi
1791     grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1792   else
1793     ewarn "No devices with label GRMLCFG found." ; eend 0
1794   fi
1795   eoutdent
1796  fi
1797 fi
1798 }
1799
1800 config_myconfig(){
1801
1802 if checkbootparam "config" ; then
1803   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1804   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1805   einfo "Bootoption config found. config is set to: $CONFIG"
1806   eindent
1807     einfo "Trying to extract configuration file ${CONFIG}:"
1808     cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1809   eoutdent
1810 fi
1811
1812 if checkbootparam myconfig ; then
1813  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1814  if [ -n "$MOUNTDEVICE" ]; then
1815    if checkbootparam file ; then
1816     FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1817     [ -n "$FILENAME" ] || FILENAME='config.tbz'
1818    fi
1819    [ -d /mnt/grml ] || mkdir /mnt/grml
1820    umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1821    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1822     if [[ $RC == 0 ]]; then
1823       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1824       eindent
1825       CONFIG=''
1826       CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1827       if [ -n "$CONFIG" ]; then
1828         einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1829         cd /
1830         unp $CONFIG $EXTRACTOPTIONS ; eend $?
1831       else
1832         ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1833       fi
1834
1835       SCRIPT=''
1836       SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1837       if [ -n "$SCRIPT" ]; then
1838         einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1839         $SCRIPT ; eend $?
1840       fi
1841       eoutdent
1842     else
1843       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1844     fi # mount $MOUNTDEVICE
1845    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1846  else
1847    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1848  fi # [ -n "$MOUNTDEVICE" ]
1849 fi # checkbootparam myconfig
1850
1851 if checkbootparam "partconf" ; then
1852  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1853  if [ -n "$MOUNTDEVICE" ]; then
1854    [ -d /mnt/grml ] || mkdir /mnt/grml
1855    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1856     if [[ $RC == 0 ]]; then
1857       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1858       einfo "Copying files from $MOUNTDEVICE over grml system."
1859       for file in `cat /etc/grml/partconf` ; do
1860         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1861         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1862       done && eend 0
1863     else
1864       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1865     fi # mount $MOUNTDEVICE
1866    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1867  else
1868    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1869  fi # [ -n "$MOUNTDEVICE" ]
1870 fi
1871 }
1872 # }}}
1873
1874 # {{{ /cdrom/.*-options
1875 config_debs(){
1876 if checkbootparam "debs" ; then
1877   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1878   einfo "Tring to install debian package(s) ${DEBS}"
1879   dpkg -i /cdrom/debs/$DEBS* ; eend $?
1880 fi
1881 }
1882
1883 config_scripts(){
1884 if checkbootparam "scripts" ; then
1885   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1886   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1887   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1888   sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1889 fi
1890 }
1891 # }}}
1892
1893 # {{{ distcc
1894 config_distcc(){
1895 if checkbootparam "distcc" ; then
1896  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1897  if [ -n "$OPTIONS" ]; then
1898     NET=""
1899     INTERFACE=""
1900     if [ -n "$OPTIONS" ]; then
1901       NET="${OPTIONS%%,*}"
1902       R="${OPTIONS#*,}"
1903       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1904         OPTIONS="$R"
1905         INTERFACE="${OPTIONS%%,*}"
1906         R="${OPTIONS#*,}"
1907       fi
1908     fi
1909  fi
1910  CONFIG=/etc/default/distcc
1911  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
1912  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1913
1914  if [ -n "$INTERFACE" ] ; then
1915    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1916
1917    counter=10
1918    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1919      counter=$(( counter-1 ))
1920      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1921      sleep 3
1922      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1923    done
1924  fi
1925
1926  if [ -n "$IP" ] ; then
1927    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
1928
1929    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1930    eindent
1931     id distccd >/dev/null 2>&1 || \
1932     (
1933       einfo "Creating distcc user" ; \
1934       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1935     )
1936
1937     einfo "Starting distcc for network ${NET}, listening on ${IP}."
1938    /etc/init.d/distcc start 1>/dev/null ; eend $?
1939    eoutdent
1940  else
1941    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1942  fi
1943 fi
1944
1945 if checkbootparam "gcc"; then
1946  GCC="$(getbootparam gcc 2>>$DEBUG)"
1947  eindent
1948  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1949  eoutdent
1950  rm -f /usr/bin/gcc
1951  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1952 fi
1953
1954 if checkbootparam "gpp"; then
1955  GPP="$(getbootparam gpp 2>>$DEBUG)"
1956  eindent
1957   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1958   if [ -x /usr/bin/g++-${GPP} ] ; then
1959      rm -f /usr/bin/g++
1960      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1961   fi
1962   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1963   if [ -x /usr/bin/cpp-${GPP} ] ; then
1964      rm -f /usr/bin/cpp
1965      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1966   fi
1967  eoutdent
1968 fi
1969
1970 }
1971 # }}}
1972
1973 # {{{ load modules
1974 # Notice: use it only on live-cd system, if running from harddisk please
1975 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1976 # in /etc/runlevel.conf
1977 config_modules(){
1978 MODULES_FILE=/etc/grml/modules
1979 if checkbootparam nomodules ; then
1980   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1981 elif [ -z "$INSTALLED" ]; then
1982  if [ -r $MODULES_FILE ] ; then
1983   einfo "Loading modules specified in ${MODULES_FILE}:"
1984   eindent
1985   grep '^[^#]' $MODULES_FILE | \
1986   while read module args; do
1987     [ "$module" ] || continue
1988       einfo "${module}"
1989       modprobe $module $args ; eend $?
1990   done
1991   eoutdent
1992  else
1993   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1994  fi
1995 fi
1996 }
1997 # }}}
1998
1999 # {{{ 915resolution
2000 config_915resolution(){
2001 if checkbootparam "915resolution" ; then
2002  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2003   if [ -x /usr/sbin/915resolution ]; then
2004     CMD=915resolution
2005     MODE=""
2006     XRESO=""
2007     YRESO=""
2008     if [ -n "$OPTIONS" ]; then
2009       # Extra options
2010       MODE="${OPTIONS%%,*}"
2011       R="${OPTIONS#*,}"
2012       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2013         OPTIONS="$R"
2014         XRESO="${OPTIONS%%,*}"
2015         R="${OPTIONS#*,}"
2016         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2017           OPTIONS="$R"
2018           YRESO="${OPTIONS%%,*}"
2019           R="${OPTIONS#*,}"
2020         fi
2021       fi
2022     fi
2023     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2024     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2025     eend 0
2026   fi
2027 fi
2028 }
2029 # }}}
2030
2031 # {{{ SW-RAID
2032 config_swraid(){
2033   if [ -z "$INSTALLED" ] ; then
2034   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2035   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2036      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2037      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2038   else
2039     if ! [ -x /sbin/mdadm ] ; then
2040        eerror "mdadm not available, can not execute it." ; eend 1
2041     else
2042
2043        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2044        # find out whether we have a valid configuration file already
2045        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2046           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2047           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2048           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2049         else
2050           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2051        fi
2052
2053        if ! checkbootparam 'swraid' ; then
2054           eindent
2055           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2056           eoutdent
2057        else
2058           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2059           eindent
2060            IFSOLD=${IFS:-}
2061            IFS='
2062 '
2063            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2064                case $line in
2065                  *'No arrays found'*)
2066                    ewarn "$line" ; eend 0
2067                    ;;
2068                  *)
2069                    einfo "$line" ; eend 0
2070                    ;;
2071                esac
2072            done
2073            IFS=$IFSOLD
2074          eoutdent
2075
2076          if [ -r /proc/mdstat ] ; then
2077             eindent
2078             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2079             if [ -z "$MDSTAT" ] ; then
2080                ewarn "No active arrays found" ; eend 0
2081             else
2082                IFSOLD=${IFS:-}
2083                IFS='
2084 '
2085                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2086                    einfo "active arrays: $line" ; eend 0
2087                done
2088                IFS=$IFSOLD
2089             fi
2090             eoutdent
2091          fi # /proc/mdstat
2092        fi # bootoption swraid
2093
2094      fi # is /sbin/mdadm executable?
2095   fi # check for bootoptions
2096   fi # run only in live-cd mode
2097 }
2098 # }}}
2099
2100 # {{{ LVM (Logical Volumes)
2101 config_lvm(){
2102   if [ -z "$INSTALLED" ] ; then
2103   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2104   if checkbootparam 'nolvm' ; then
2105      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2106   else
2107     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2108     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2109        eerror "LVM not available, can not execute it." ; eend 1
2110     else
2111        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2112           einfo "You seem to have logical volumes (LVM) on your system."
2113           eindent
2114           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2115           eend 0
2116           if checkbootparam 'lvm' ; then
2117              einfo "Bootoption LVM found. Searching for logical volumes:"
2118              /etc/init.d/lvm2 start ; eend $?
2119           fi
2120           eoutdent
2121        fi
2122     fi # check for lvm binary
2123   fi # check for bootoption nolvm
2124   fi # run only in live-cd mode
2125 }
2126 # }}}
2127
2128 # {{{ debnet: setup network based on an existing one found on a partition
2129 config_debnet(){
2130 if checkbootparam "debnet" ; then
2131  iszsh && setopt shwordsplit
2132  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2133  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2134  FOUND_DEBNET=""
2135
2136  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2137  eindent
2138  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2139     for i in $DEVICES; do
2140      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2141          einfo "Scanning on $i"
2142        if [ -f /mnt/etc/network/interfaces ]; then
2143          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2144          FOUND_DEBNET="$i"
2145          break
2146        fi
2147        umount /mnt
2148      fi
2149     done
2150
2151    if [ -n "$FOUND_DEBNET" ]; then
2152      einfo "Stopping network."
2153        pump -k 1>/dev/null 2>&1
2154        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2155      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2156        rm -rf /etc/network/run
2157        cp -a /mnt/etc/network /etc
2158        rm -rf /etc/network/run
2159        mkdir /etc/network/run
2160        umount /mnt ; eend $?
2161      einfo "Starting network."
2162        /etc/init.d/networking start ; eend $?
2163    else
2164      eerror "/etc/network/interfaces not found." ; eend 1
2165    fi
2166    eoutdent
2167  else
2168   eerror "Error: /mnt already mounted." ; eend 1
2169  fi
2170 fi
2171 }
2172 # }}}
2173
2174 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2175 config_ipw3945() {
2176   if grep -q ipw3945 /proc/modules ; then
2177      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2178         ewarn "Broken ipw3945 network interface found, reloading module."
2179         rmmod ipw3945
2180         modprobe ipw3945
2181         eend $?
2182      fi
2183   fi
2184 }
2185 # }}}
2186
2187 # {{{ disable console blanking
2188 config_blanking(){
2189 if checkbootparam "noblank" ; then
2190   einfo "Bootoption noblank found. Disabling monitor blanking."
2191   setterm -blank 0 ; eend $?
2192 fi
2193 }
2194 # }}}
2195
2196 # {{{ grml2hd: automatic installation
2197 config_grml2hd(){
2198
2199 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2200
2201 if checkbootparam "user" ; then
2202    NEWUSER=''
2203    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2204    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2205 fi
2206
2207 if checkbootparam "filesystem" ; then
2208    FILESYSTEM=''
2209    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2210    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2211 fi
2212
2213 if checkbootparam "partition" ; then
2214    PARTITION=''
2215    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2216    # notice: the following checks whether the given partition is available, if not the skip
2217    # execution of grml2hd as it might result in data loss...
2218    if [ -r $PARTITION ] ; then
2219       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2220    else
2221       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2222    fi
2223 fi
2224
2225 if checkbootparam "mbr" ; then
2226    BOOT_PARTITION=''
2227    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2228    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2229 fi
2230
2231 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2232 #!/bin/sh
2233 GRML2HD_NONINTERACTIVE='yes' grml2hd
2234 EOF
2235
2236 chmod 755 /usr/bin/grml2hd_noninteractive
2237 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2238 if [ -z "$GRML2HD_FAIL" ] ; then
2239    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2240 else
2241    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2242 fi
2243
2244 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2245 }
2246 # }}}
2247
2248 # {{{ debootstrap: automatic installation
2249 config_debootstrap(){
2250
2251 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2252
2253 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2254
2255 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2256    eindent
2257    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2258    eoutdent
2259    exit 1
2260 fi
2261
2262 if checkbootparam "target" ; then
2263   TARGET=''
2264   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2265   # notice: the following checks whether the given partition is available, if not the skip
2266   # execution of grml-debootstrap as it might result in data loss...
2267   if ! [ -r "$TARGET" ] ; then
2268      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2269   fi
2270 else
2271   eindent
2272   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2273   eoutdent
2274   exit 1
2275 fi
2276
2277 if checkbootparam "grub" ; then
2278   GRUB=''
2279   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2280 fi
2281
2282 if checkbootparam "groot" ; then
2283   GROOT=''
2284   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2285 fi
2286
2287 if checkbootparam "release" ; then
2288   RELEASE=''
2289   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2290 fi
2291
2292 if checkbootparam "mirror" ; then
2293   MIRROR=''
2294   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2295 fi
2296
2297 if checkbootparam "boot_append" ; then
2298   BOOT_APPEND=''
2299   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2300 fi
2301
2302 if checkbootparam "password" ; then
2303   PASSWORD=''
2304   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2305 fi
2306
2307 # now check which options are available
2308 if [ -n "TARGET" ] ; then
2309    TARGETCMD="--target $TARGET"
2310 else
2311    TARGETCMD=''
2312    eindent
2313    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2314    eoutdent
2315    exit 1
2316 fi
2317 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2318 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2319 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2320 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2321 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2322 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2323
2324 # and finally write script and execute it
2325 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2326 #!/bin/sh
2327 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2328 EOF
2329
2330 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2331
2332 screen /usr/bin/grml-debootstrap_noninteractive
2333 einfo "Invoking a shell, just exit to continue booting..."
2334 /bin/zsh
2335
2336 fi # stringinstring "BOOT_IMAGE=debian2hd
2337 }
2338 # }}}
2339
2340 # {{{ Support customization
2341 config_distri(){
2342 if checkbootparam "distri"; then
2343   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2344   if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2345      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2346      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2347      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2348      cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2349   fi
2350 fi
2351 }
2352 # }}}
2353
2354 ### {{{ backwards compatible stuff
2355 config_environment(){
2356   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2357 }
2358 config_keyboard(){
2359   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2360 }
2361 # }}}
2362
2363 ## END OF FILE #################################################################
2364 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3