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