dcb76dae331f9210b64506f09864343b17c3704a
[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 # make sure we start X only if startx is used *before* a nostartx option
1861 # so it's possible to disable automatic X startup using nostart
1862 if checkbootparam startx && ! grep -q 'startx.*nostartx' "$CMDLINE" ; then
1863  if [ -x /usr/X11R6/bin/X ] ; then
1864   if [ -z "$INSTALLED" ] ; then
1865    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1866    if [ -z "$WINDOWMANAGER" ] ; then
1867      einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1868      WINDOWMANAGER="wm-ng"
1869    else
1870      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1871    fi
1872    einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1873    config_userfstab || fstabuser='grml'
1874  cat>|/etc/init.d/xstartup<<EOF
1875 #!/bin/sh
1876 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1877 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1878 EOF
1879    chmod 755 /etc/init.d/xstartup
1880
1881    # adjust inittab for xstartup
1882    if grep -q '^6:' /etc/inittab ; then
1883       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1884    else # just append tty6 to inittab if no definition is present:
1885       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1886    fi
1887
1888    /sbin/telinit q ; eend $?
1889
1890    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1891       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1892    else
1893       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1894    fi
1895
1896   else
1897     eerror "We are not running from CD - startx will not work, skipping it."
1898     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1899   fi
1900  else
1901    eerror "/usr/X11R6/bin/X is not present on this grml flavour."
1902    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
1903  fi
1904 fi
1905 }
1906 # }}}
1907
1908 # {{{ configuration framework
1909 config_extract(){
1910 if checkbootparam extract ; then
1911  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1912  EXTRACTOPTIONS="-- -x $EXTRACT"
1913 fi
1914 }
1915
1916 config_unpack(){
1917 MOUNTDEVICE="$1"
1918 MESSAGE="$2"
1919
1920 if [ ! -b "$MOUNTDEVICE" ] ; then
1921    return;
1922 fi
1923
1924
1925 [ -d /mnt/grml ] || mkdir /mnt/grml
1926 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1927 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1928 if [[ $RC == 0 ]]; then
1929    einfo "Successfully mounted $MOUNTDEVICE $MESSAGE to /mnt/grml (readonly)." ; eend 0
1930    eindent
1931    CONFIG=''
1932    CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1933    if checkbootparam config ; then
1934       FILENAME="$(getbootparam 'config' 2>>$DEBUG)"
1935       if [ -e /mnt/grml/"${FILENAME}" ] ; then
1936          einfo "Using /mnt/grml/$FILENAME instead of config.tbz"
1937          CONFIG="/mnt/grml/${FILENAME}"
1938       fi
1939    else
1940       [ -n "$CONFIG" ] && FILENAME="$(basename $CONFIG)" || FILENAME="config.tbz"
1941    fi
1942
1943    if [ -n "$CONFIG" ]; then
1944      einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1945      cd /
1946      unp $CONFIG $EXTRACTOPTIONS ; eend $?
1947    else
1948      ewarn "Sorry, could not find file ${FILENAME} on device ${MOUNTDEVICE} ${MESSAGE}." ; eend 1
1949    fi
1950
1951    SCRIPT=''
1952    SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1953    if [ -n "$SCRIPT" ]; then
1954      einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1955      $SCRIPT ; eend $?
1956    fi
1957    eoutdent
1958    else
1959    einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1960 fi # mount $MOUNTDEVICE
1961
1962 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1963
1964 }
1965
1966 config_automount(){
1967 if checkbootparam noautoconfig || checkbootparam forensic ; then
1968   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1969 else
1970  if [ -z "$INSTALLED" ] ; then
1971      einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1972      eindent
1973    # We do need the following fix so floppy disk is available to blkid in any case :-/
1974      if [ -r /dev/fd0 ] ; then
1975         einfo "Floppy device detected. Trying to access floppy disk."
1976         if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1977            blkid /dev/fd0 1>>$DEBUG 2>&1
1978         fi
1979      fi
1980      DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1981      config_unpack "$DEVICE" "labeled GRMCFG"
1982   fi
1983 fi
1984 }
1985
1986 config_myconfig(){
1987
1988 if checkbootparam "config" ; then
1989   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1990   [ -z "$CONFIG" ] && CONFIG='config.tbz'
1991   einfo "Bootoption config found. config is set to: $CONFIG"
1992   eindent
1993     einfo "Trying to extract configuration file ${CONFIG}:"
1994     cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1995   eoutdent
1996 fi
1997
1998 if checkbootparam myconfig ; then
1999  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
2000  if [ -n "$MOUNTDEVICE" ]; then
2001      config_unpack "$MOUNTDEVICE"
2002  else
2003    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
2004  fi # [ -n "$MOUNTDEVICE" ]
2005 fi # checkbootparam myconfig
2006
2007 if checkbootparam "partconf" ; then
2008  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
2009  if [ -n "$MOUNTDEVICE" ]; then
2010    [ -d /mnt/grml ] || mkdir /mnt/grml
2011    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
2012     if [[ $RC == 0 ]]; then
2013       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
2014       einfo "Copying files from $MOUNTDEVICE over grml system."
2015       for file in `cat /etc/grml/partconf` ; do
2016         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
2017         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
2018       done && eend 0
2019     else
2020       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
2021     fi # mount $MOUNTDEVICE
2022    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
2023  else
2024    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
2025  fi # [ -n "$MOUNTDEVICE" ]
2026 fi
2027 }
2028 # }}}
2029
2030 # {{{ /cdrom/.*-options
2031 config_debs(){
2032 if checkbootparam "debs" ; then
2033    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
2034    einfo "Tring to install debian package(s) ${DEBS}"
2035    dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
2036 fi
2037 }
2038
2039 config_scripts(){
2040 if checkbootparam "scripts" ; then
2041    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
2042    [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
2043    einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
2044    sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
2045 fi
2046 }
2047 # }}}
2048
2049 # {{{ mypath
2050 config_mypath(){
2051 if checkbootparam "mypath" ; then
2052    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2053    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2054    touch /etc/grml/my_path
2055    chmod 644 /etc/grml/my_path
2056    # make sure the directories exist:
2057    eindent
2058    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2059        if ! [ -d "$i" ] ; then
2060           einfo "Creating directory $i"
2061           mkdir -p "$i" ; eend $?
2062        fi
2063    done
2064    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2065    eoutdent
2066 fi
2067 }
2068 # }}}
2069
2070 # {{{ distcc
2071 config_distcc(){
2072 if checkbootparam "distcc" ; then
2073  OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2074  if [ -n "$OPTIONS" ]; then
2075     NET=""
2076     INTERFACE=""
2077     if [ -n "$OPTIONS" ]; then
2078       NET="${OPTIONS%%,*}"
2079       R="${OPTIONS#*,}"
2080       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2081         OPTIONS="$R"
2082         INTERFACE="${OPTIONS%%,*}"
2083         R="${OPTIONS#*,}"
2084       fi
2085     fi
2086  fi
2087  CONFIG=/etc/default/distcc
2088  sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
2089  sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2090
2091  if [ -n "$INTERFACE" ] ; then
2092    IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2093
2094    counter=10
2095    while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2096      counter=$(( counter-1 ))
2097      ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2098      sleep 3
2099      IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2100    done
2101  fi
2102
2103  if [ -n "$IP" ] ; then
2104    sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
2105
2106    einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2107    eindent
2108     id distccd >/dev/null 2>&1 || \
2109     (
2110       einfo "Creating distcc user" ; \
2111       adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2112     )
2113
2114     einfo "Starting distcc for network ${NET}, listening on ${IP}."
2115    /etc/init.d/distcc start 1>/dev/null ; eend $?
2116    eoutdent
2117  else
2118    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2119  fi
2120 fi
2121
2122 if checkbootparam "gcc"; then
2123  GCC="$(getbootparam gcc 2>>$DEBUG)"
2124  eindent
2125  einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2126  eoutdent
2127  rm -f /usr/bin/gcc
2128  ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2129 fi
2130
2131 if checkbootparam "gpp"; then
2132  GPP="$(getbootparam gpp 2>>$DEBUG)"
2133  eindent
2134   einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2135   if [ -x /usr/bin/g++-${GPP} ] ; then
2136      rm -f /usr/bin/g++
2137      ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2138   fi
2139   einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2140   if [ -x /usr/bin/cpp-${GPP} ] ; then
2141      rm -f /usr/bin/cpp
2142      ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2143   fi
2144  eoutdent
2145 fi
2146
2147 }
2148 # }}}
2149
2150 # {{{ load modules
2151 # Notice: use it only on live-cd system, if running from harddisk please
2152 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2153 # in /etc/runlevel.conf
2154 config_modules(){
2155 MODULES_FILE=/etc/grml/modules
2156 if checkbootparam nomodules ; then
2157   ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2158 elif [ -z "$INSTALLED" ]; then
2159  if [ -r $MODULES_FILE ] ; then
2160   einfo "Loading modules specified in ${MODULES_FILE}:"
2161   eindent
2162   grep '^[^#]' $MODULES_FILE | \
2163   while read module args; do
2164     [ "$module" ] || continue
2165       einfo "${module}"
2166       modprobe $module $args ; eend $?
2167   done
2168   eoutdent
2169  else
2170   ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2171  fi
2172 fi
2173 }
2174 # }}}
2175
2176 # {{{ 915resolution
2177 config_915resolution(){
2178 if checkbootparam "915resolution" ; then
2179  OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2180   if [ -x /usr/sbin/915resolution ]; then
2181     CMD=915resolution
2182     MODE=""
2183     XRESO=""
2184     YRESO=""
2185     if [ -n "$OPTIONS" ]; then
2186       # Extra options
2187       MODE="${OPTIONS%%,*}"
2188       R="${OPTIONS#*,}"
2189       if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2190         OPTIONS="$R"
2191         XRESO="${OPTIONS%%,*}"
2192         R="${OPTIONS#*,}"
2193         if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2194           OPTIONS="$R"
2195           YRESO="${OPTIONS%%,*}"
2196           R="${OPTIONS#*,}"
2197         fi
2198       fi
2199     fi
2200     einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2201     [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2202     eend 0
2203   fi
2204 fi
2205 }
2206 # }}}
2207
2208 # {{{ SW-RAID
2209 config_swraid(){
2210   if [ -z "$INSTALLED" ] ; then
2211   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2212   if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
2213      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2214      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2215   else
2216     if ! [ -x /sbin/mdadm ] ; then
2217        eerror "mdadm not available, can not execute it." ; eend 1
2218     else
2219
2220        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2221        # find out whether we have a valid configuration file already
2222        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2223           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2224           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2225           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2226         else
2227           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2228        fi
2229
2230        if ! checkbootparam 'swraid' ; then
2231           eindent
2232           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2233           eoutdent
2234        else
2235           einfo "Bootoption swraid found. Searching for software RAID arrays:"
2236           eindent
2237            IFSOLD=${IFS:-}
2238            IFS='
2239 '
2240            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2241                case $line in
2242                  *'No arrays found'*)
2243                    ewarn "$line" ; eend 0
2244                    ;;
2245                  *)
2246                    einfo "$line" ; eend 0
2247                    ;;
2248                esac
2249            done
2250            IFS=$IFSOLD
2251          eoutdent
2252
2253          if [ -r /proc/mdstat ] ; then
2254             eindent
2255             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2256             if [ -z "$MDSTAT" ] ; then
2257                ewarn "No active arrays found" ; eend 0
2258             else
2259                IFSOLD=${IFS:-}
2260                IFS='
2261 '
2262                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2263                    einfo "active arrays: $line" ; eend 0
2264                done
2265                IFS=$IFSOLD
2266             fi
2267             eoutdent
2268          fi # /proc/mdstat
2269        fi # bootoption swraid
2270
2271      fi # is /sbin/mdadm executable?
2272   fi # check for bootoptions
2273   fi # run only in live-cd mode
2274 }
2275 # }}}
2276
2277 # {{{ LVM (Logical Volumes)
2278 config_lvm(){
2279   if [ -z "$INSTALLED" ] ; then
2280   # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2281   if checkbootparam 'nolvm' ; then
2282      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2283   else
2284     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2285     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2286        eerror "LVM not available, can not execute it." ; eend 1
2287     else
2288        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2289           einfo "You seem to have logical volumes (LVM) on your system."
2290           eindent
2291           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2292           eend 0
2293           if checkbootparam 'lvm' ; then
2294              einfo "Bootoption LVM found. Searching for logical volumes:"
2295              /etc/init.d/lvm2 start ; eend $?
2296           fi
2297           eoutdent
2298        fi
2299     fi # check for lvm binary
2300   fi # check for bootoption nolvm
2301   fi # run only in live-cd mode
2302 }
2303 # }}}
2304
2305 # {{{ debnet: setup network based on an existing one found on a partition
2306 config_debnet(){
2307 if checkbootparam "debnet" ; then
2308  iszsh && setopt shwordsplit
2309  DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2310  DEVICES="$DEVICES $(ls /dev/mapper/*)"
2311  FOUND_DEBNET=""
2312
2313  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2314  eindent
2315  if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2316     for i in $DEVICES; do
2317      if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2318          einfo "Scanning on $i"
2319        if [ -f /mnt/etc/network/interfaces ]; then
2320          einfo "/etc/network/interfaces found on ${i}" ; eend 0
2321          FOUND_DEBNET="$i"
2322          break
2323        fi
2324        umount /mnt
2325      fi
2326     done
2327
2328    if [ -n "$FOUND_DEBNET" ]; then
2329      einfo "Stopping network."
2330        pump -k 1>/dev/null 2>&1
2331        /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2332      einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2333        rm -rf /etc/network/run
2334        cp -a /mnt/etc/network /etc
2335        rm -rf /etc/network/run
2336        mkdir /etc/network/run
2337        umount /mnt ; eend $?
2338      einfo "Starting network."
2339        /etc/init.d/networking start ; eend $?
2340    else
2341      eerror "/etc/network/interfaces not found." ; eend 1
2342    fi
2343    eoutdent
2344  else
2345   eerror "Error: /mnt already mounted." ; eend 1
2346  fi
2347 fi
2348 }
2349 # }}}
2350
2351 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2352 config_ipw3945() {
2353   if grep -q ipw3945 /proc/modules ; then
2354      if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2355         ewarn "Broken ipw3945 network interface found, reloading module."
2356         rmmod ipw3945
2357         modprobe ipw3945
2358         eend $?
2359      fi
2360   fi
2361 }
2362 # }}}
2363
2364 # {{{ disable console blanking
2365 config_blanking(){
2366 if checkbootparam "noblank" ; then
2367   einfo "Bootoption noblank found. Disabling monitor blanking."
2368   setterm -blank 0 ; eend $?
2369 fi
2370 }
2371 # }}}
2372
2373 # {{{ tohd= bootoption
2374 config_tohd()
2375 {
2376   if checkbootparam "tohd" ; then
2377      local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2378      if [ -z "$TARGET" ] ; then
2379         eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2380         eerror "Please use something like tohd=/dev/sda9." ; eend 1
2381         return 1
2382      fi
2383
2384      if ! [ -b "$TARGET" ] ; then
2385         eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2386         return 1
2387      fi
2388
2389      if grep -q $TARGET /proc/mounts ; then
2390         eerror "$TARGET already mounted, skipping execution of tohd therefore."
2391         eend 1
2392         return 1
2393      fi
2394
2395      local MOUNTDIR=$(mktemp -d)
2396
2397      if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2398         einfo "Copyring live system to $TARGET - this might take a while"
2399         rsync -a --progress /live/image/live $MOUNTDIR
2400         sync
2401         umount "$MOUNTDIR"
2402         eend $?
2403         einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2404      else
2405         eerror "Error when trying to mount $TARGET, sorry."; eend 1
2406         return 1
2407      fi
2408
2409      rmdir "$MOUNTDIR"
2410   fi
2411 }
2412 # }}}
2413
2414 # {{{ grml2hd: automatic installation
2415 config_grml2hd(){
2416
2417 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2418
2419 if checkbootparam "user" ; then
2420    NEWUSER=''
2421    NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2422    sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2423 fi
2424
2425 if checkbootparam "filesystem" ; then
2426    FILESYSTEM=''
2427    FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2428    sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2429 fi
2430
2431 if checkbootparam "partition" ; then
2432    PARTITION=''
2433    PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2434    # notice: the following checks whether the given partition is available, if not the skip
2435    # execution of grml2hd as it might result in data loss...
2436    if [ -r $PARTITION ] ; then
2437       sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2438    else
2439       ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2440    fi
2441 fi
2442
2443 if checkbootparam "mbr" ; then
2444    BOOT_PARTITION=''
2445    BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2446    sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2447 fi
2448
2449 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2450 #!/bin/sh
2451 GRML2HD_NONINTERACTIVE='yes' grml2hd
2452 EOF
2453
2454 chmod 755 /usr/bin/grml2hd_noninteractive
2455 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2456 if [ -z "$GRML2HD_FAIL" ] ; then
2457    screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2458 else
2459    ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2460 fi
2461
2462 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2463 }
2464 # }}}
2465
2466 # {{{ debootstrap: automatic installation
2467 config_debootstrap(){
2468
2469 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2470
2471 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2472
2473 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2474    eindent
2475    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2476    eoutdent
2477    exit 1
2478 fi
2479
2480 if checkbootparam "target" ; then
2481   TARGET=''
2482   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2483   # notice: the following checks whether the given partition is available, if not the skip
2484   # execution of grml-debootstrap as it might result in data loss...
2485   if ! [ -r "$TARGET" ] ; then
2486      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2487   fi
2488 else
2489   eindent
2490   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2491   eoutdent
2492   exit 1
2493 fi
2494
2495 if checkbootparam "grub" ; then
2496   GRUB=''
2497   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2498 fi
2499
2500 if checkbootparam "groot" ; then
2501   GROOT=''
2502   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2503 fi
2504
2505 if checkbootparam "release" ; then
2506   RELEASE=''
2507   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2508 fi
2509
2510 if checkbootparam "mirror" ; then
2511   MIRROR=''
2512   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2513 fi
2514
2515 if checkbootparam "boot_append" ; then
2516   BOOT_APPEND=''
2517   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2518 fi
2519
2520 if checkbootparam "password" ; then
2521   PASSWORD=''
2522   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2523 fi
2524
2525 # now check which options are available
2526 if [ -n "TARGET" ] ; then
2527    TARGETCMD="--target $TARGET"
2528 else
2529    TARGETCMD=''
2530    eindent
2531    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2532    eoutdent
2533    exit 1
2534 fi
2535 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
2536 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
2537 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
2538 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
2539 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
2540 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2541
2542 # and finally write script and execute it
2543 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2544 #!/bin/sh
2545 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2546 EOF
2547
2548 chmod 750  /usr/bin/grml-debootstrap_noninteractive
2549
2550 screen /usr/bin/grml-debootstrap_noninteractive
2551 einfo "Invoking a shell, just exit to continue booting..."
2552 /bin/zsh
2553
2554 fi # stringinstring "BOOT_IMAGE=debian2hd
2555 }
2556 # }}}
2557
2558 # {{{ Support customization
2559 config_distri(){
2560 if checkbootparam "distri"; then
2561   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2562   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2563      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2564      # make sure the desktop.jpg file is not a symlink, so copying does not file then
2565      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2566      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2567   fi
2568 fi
2569 }
2570 # }}}
2571
2572 ### {{{ backwards compatible stuff
2573 config_environment(){
2574   ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2575 }
2576 config_keyboard(){
2577   ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2578 }
2579 # }}}
2580
2581 ## END OF FILE #################################################################
2582 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3