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