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