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