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