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