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