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