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