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