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