/etc/default/rcS no longer exists in recent initscripts versions
[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) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 # {{{ path, variables, signals, umask, zsh
10 export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
11 DEBUG="/dev/null"
12 KERNEL="$(uname -r)"
13 ARCH="$(uname -m)"
14 umask 022
15
16 # old linuxrc version:
17 [ -d /cdrom ]      && export LIVECD_PATH=/cdrom
18 # initramfs layout until around December 2012:
19 [ -d /live/image ] && export LIVECD_PATH=/live/image
20 # initramfs layout since around December 2012:
21 [ -d /lib/live/mount/medium ] && export LIVECD_PATH=/lib/live/mount/medium
22
23 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
24 [ -z "$PS1" ] && trap "" 2 3 11
25
26 # zsh stuff
27 iszsh(){
28 if [ -n "$ZSH_VERSION" ] ; then
29   return 0
30 else
31   return 1
32 fi
33 }
34 # avoid 'no matches found: ...'
35 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
36 # }}}
37
38 # {{{ Read in boot parameters
39 if [ -z "$CMDLINE" ]; then
40   # if CMDLINE was set from the outside, we're debugging.
41   # otherwise, take CMDLINE from Kernel and config files.
42   CMDLINE="$(cat /proc/cmdline)"
43   [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
44   modprobe 9p 2>/dev/null || true
45   if grep -q 9p /proc/filesystems ; then
46       TAG="grml-parameters"
47       if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
48           MOUNTDIR="$(mktemp -d)"
49           mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
50           CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
51           umount "$MOUNTDIR"
52           rmdir "$MOUNTDIR"
53       fi
54   fi
55 fi
56 # }}}
57
58 ### {{{ Utility Functions
59
60 # Get a bootoption's parameter: read boot command line and either
61 # echo last parameter's argument or return false.
62 getbootparam(){
63   local line
64   local ws
65   ws='   '
66   line=" $CMDLINE "
67   case "$line" in
68     *[${ws}]"$1="*)
69       result="${line##*[$ws]$1=}"
70       result="${result%%[$ws]*}"
71       echo "$result"
72       return 0 ;;
73     *) # no match?
74       return 1 ;;
75   esac
76 }
77
78 # Check boot commandline for specified option
79 checkbootparam(){
80   [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
81   local line
82   local ws
83   ws='   '
84   line=" $CMDLINE "
85   case "$line" in
86     *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
87       return 0 ;;
88     *)
89       return 1 ;;
90   esac
91 }
92
93 # Check if currently using a framebuffer
94 hasfb() {
95     [ -e /dev/fb0 ] && return 0 || return 1
96 }
97
98 # Check wheter a configuration variable (like $CONFIG_TOHD) is
99 # enabled or not
100 checkvalue(){
101   case "$1" in
102     [yY][eE][sS])     return 0 ;; # it's set to 'yes'
103     [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
104                    *) return 1 ;; # default
105   esac
106 }
107
108 # Are we using grml-small?
109 checkgrmlsmall(){
110   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
111 }
112
113 # if no password is set return a random password
114 set_passwd() {
115   [ -n "$PASSWD" ] && return 0
116
117   if [ -x /usr/bin/apg ] ; then
118     PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
119   elif [ -x /usr/bin/gpw ] ; then
120     PASSWD="$(gpw 1)"
121   elif [ -x /usr/bin/pwgen ] ; then
122     PASSWD="$(pwgen -1 8)"
123   elif [ -x /usr/bin/hexdump ] ; then
124     PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
125   elif [ -n "$RANDOM" ] ; then
126     PASSWD="grml${RANDOM}"
127   else
128     PASSWD=''
129     eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
130     eend 1
131     return 1
132   fi
133 }
134
135 ### }}}
136
137 # {{{ filesystems (proc, pts, sys) and fixes
138 mount_proc(){
139   [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
140 }
141
142 mount_pts(){
143   grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
144 }
145
146 mount_sys(){
147   [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
148 }
149 # }}}
150
151 # {{{ Check if we are running in live mode or from HD
152 INSTALLED=""
153 [ -e /etc/grml_cd ] || INSTALLED="yes"
154 # }}}
155
156 # {{{ provide information about virtual environments
157 VIRTUAL=false # assume physical system by default
158 KVM=false
159 VIRTUALBOX=false
160 VMWARE=false
161
162 if vmware-detect &>/dev/null; then
163   VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
164 elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
165    [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
166   VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
167 elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
168    [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
169   VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
170 fi
171 # }}}
172
173 # {{{ source lsb-functions , color handling
174 if checkbootparam 'nocolor'; then
175   RC_NOCOLOR=yes
176   . /etc/grml/lsb-functions
177   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
178 else
179   . /etc/grml/lsb-functions
180   . /etc/grml_colors
181 fi
182 # }}}
183
184 # {{{ debug
185 config_debug(){
186  checkbootparam 'debug'            && BOOTDEBUG="yes"
187  checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
188
189  rundebugshell(){
190   if [ -n "$BOOTDEBUG" ]; then
191      einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
192      if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
193         einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
194         einfo "Just exit the shell to continue boot process..."
195         /bin/zsh
196      else
197         eindent
198         if [ -r /etc/grml/screenrc ] ; then
199            einfo "Starting GNU screen to be able to use a full featured shell environment."
200            einfo "Just exit the shells (and therefore screen) to continue boot process..."
201            /bin/zsh -c "screen -c /etc/grml/screenrc"
202         else
203            einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
204            einfo "Just exit the shell to continue boot process..."
205            /bin/zsh
206         fi
207         eoutdent
208      fi
209   fi
210  }
211 }
212 # }}}
213
214 # {{{ log
215 config_log(){
216 if checkbootparam 'log' || checkbootparam 'debug' ; then
217    export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
218    touch $DEBUG
219    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
220    eindent
221      einfo "Starting bootlogd." # known to be *very* unreliable :(
222      bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
223    eoutdent
224 else
225    DEBUG="/dev/null"
226 fi
227 }
228 # }}}
229
230 ### {{{ language configuration / localization
231 config_language(){
232
233  einfo "Activating language settings:"
234  eindent
235
236  # people can specify $LANGUAGE and $CONSOLEFONT in a config file
237  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
238
239  # check for bootoption which overrides config from /etc/grml/autoconfig
240  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
241  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
242
243  # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
244  if [ -z "$INSTALLED" ] ; then
245     [ -n "$LANGUAGE" ] || LANGUAGE='en'
246  fi
247
248  if [ -x /usr/sbin/grml-setlang ] ; then
249    # if bootoption lang is used update /etc/default/locale accordingly
250    if [ -n "$BOOT_LANGUAGE" ] ; then
251      /usr/sbin/grml-setlang "$LANGUAGE"
252    # otherwise default to lang=en
253    else
254      /usr/sbin/grml-setlang "en"
255    fi
256  fi
257
258  # set console font
259  if [ -z "$CONSOLEFONT" ] ; then
260     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
261        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
262           CONSOLEFONT='Uni3-Terminus16'
263        else
264           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
265        fi
266        if ! hasfb ; then
267           CONSOLEFONT='Lat15-Terminus16'
268        fi
269     fi
270  fi
271
272  # export it now, so error messages get translated, too
273  [ -r /etc/default/locale ] && . /etc/default/locale
274  export LANG LANGUAGE
275
276  # configure keyboard layout, read in already set values first:
277  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
278
279  # now allow keyboard override by boot commandline for later use:
280  KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
281  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
282  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
283  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
284  [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
285
286  # modify /etc/sysconfig/keyboard only in live-cd mode:
287  if [ -z "$INSTALLED" ] ; then
288
289    local LANGUAGE="$BOOT_LANGUAGE"
290    . /etc/grml/language-functions
291    # allow setting xkeyboard explicitly different than console keyboard
292    KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
293    if [ -n "$KXKEYBOARD" ]; then
294       XKEYBOARD="$KXKEYBOARD"
295       KDEKEYBOARD="$KXKEYBOARD"
296    elif [ -n "$KKEYBOARD" ]; then
297       XKEYBOARD="$KKEYBOARD"
298       KDEKEYBOARD="$KKEYBOARD"
299    fi
300
301    # duplicate of previous code to make sure /etc/grml/language-functions
302    # does not overwrite our values....
303    # now allow keyboard override by boot commandline for later use:
304    KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
305    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
306    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
307    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
308    [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
309
310    # write keyboard related variables to file for later use
311    [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
312    if ! [ -e /etc/sysconfig/keyboard ] ; then
313       echo "KEYTABLE=\"$KEYTABLE\""          > /etc/sysconfig/keyboard
314       echo "XKEYBOARD=\"$XKEYBOARD\""       >> /etc/sysconfig/keyboard
315       echo "KDEKEYBOARD=\"$KDEKEYBOARD\""   >> /etc/sysconfig/keyboard
316       echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
317    fi
318  fi
319
320  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
321
322  # activate unicode console if running within utf8 environment
323  if [ -r /etc/default/locale ] ; then
324     if grep -q "LANG=.*UTF" /etc/default/locale ; then
325        einfo "Setting up unicode environment."
326        unicode_start >>$DEBUG 2>&1 ; eend $?
327     fi
328  fi
329
330  # Set default keyboard before interactive setup
331  if [ -n "$KEYTABLE" ] ; then
332     einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
333     loadkeys -q $KEYTABLE &
334     eend $?
335  fi
336
337  # we have to set up all consoles, therefore loop it over all ttys:
338  NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
339  if [ -n "$NUM_CONSOLES" ] ; then
340     NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
341     [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
342  fi
343  CUR_CONSOLE=$(fgconsole 2>/dev/null)
344
345  if [ -x "$(which setfont)" ] ; then
346     use_setfont=true
347  elif [ -x "$(which consolechars)" ] ; then
348     use_consolechars=true
349  else
350     eerror "Neither setfont nor consolechars tool present, can not set font."
351     eend 1
352     return 1
353  fi
354
355  if [ -n "$CHARMAP" ] ; then
356     einfo "Setting font to ${CHARMAP}"
357     RC=0
358     for vc in $(seq 0 ${NUM_CONSOLES}) ; do
359         if $use_setfont ; then
360           setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
361         elif $use_consolechars ; then
362           consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
363         fi
364     done
365     if [ -n "$CUR_CONSOLE" ] ; then
366        [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
367     fi
368     eend $RC
369  fi
370
371  if checkbootparam 'noconsolefont' ; then
372     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
373  else
374     if [ -n "$CONSOLEFONT" ] ; then
375        einfo "Setting font to ${CONSOLEFONT}"
376        RC=0
377        for vc in $(seq 0 ${NUM_CONSOLES}) ; do
378            if $use_setfont ; then
379              setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
380            elif $use_consolechars ; then
381              consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
382            fi
383        done
384        if [ -n "$CUR_CONSOLE" ] ; then
385           [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
386        fi
387        eend $RC
388     fi
389  fi
390
391  eoutdent
392 }
393 # }}}
394
395 # {{{ Set hostname
396 config_hostname(){
397   if ! checkbootparam 'hostname' ; then
398     return 0
399   fi
400
401   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
402   if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
403     einfo "Generating random hostname as no hostname was specified."
404     HOSTNAME="$(/usr/bin/random-hostname)"
405     eend $?
406   fi
407
408   einfo "Setting hostname to $HOSTNAME as requested."
409   grml-hostname $HOSTNAME >>$DEBUG
410   eend $?
411 }
412 # }}}
413
414 # fstabuser (needed when running from harddisk with username != grml {{{
415 config_userfstab(){
416   # force load of build-in and local config
417   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
418   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
419
420   # 1st. try configured fstab user
421   if [ -n "$CONFIG_FSTAB_USER" ] ; then
422      fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
423   fi
424
425   # 2nd. use standard user id
426   [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
427
428   # 3rd. use standard user name
429   [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
430
431   # if not yet set fall back to 'root' user, avoid bad /etc/fstab
432   [ -n "$fstabuser" ] || fstabuser='root'
433 }
434 # }}}
435
436 # local_user (needed when running with username != grml {{{
437 config_userlocal() {
438
439   # force load of build-in and local config
440   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
441   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
442
443   # 1st. try id of primary user
444   localuser=$(getent passwd 1000 | cut -d: -f1)
445
446   # 2nd. use name standard user
447   [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
448 }
449 # }}}
450
451 # {{{ Set clock (Local time is more often used than GMT, so it is default)
452 config_time(){
453  # don't touch the files if running from harddisk:
454  if [ -z "$INSTALLED" ]; then
455     # The default hardware clock timezone is stated as representing local time.
456     UTC="--localtime"
457
458     if [ -f /etc/default/rcS ] ; then
459       grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
460       checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
461       checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
462       checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|"  /etc/default/rcS
463       grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
464     # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
465     elif [ -f /etc/adjtime ] ; then
466       checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
467       checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
468       checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
469       grep -q "^UTC$" /etc/adjtime && UTC="-u"
470     fi
471
472     # hwclock uses the TZ variable
473     KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
474     [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
475     if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
476        ewarn "Warning: unknown timezone $KTZ" ; eend 1
477        KTZ="UTC"
478        ewarn "Falling back to timezone $KTZ" ; eend 0
479     fi
480
481     if ! [ -r /dev/rtc ] ; then
482       ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
483     fi
484
485     ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
486     if [ -n "$ERROR" ] ; then
487        eindent
488        ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
489        if [ -n "$ERROR" ] ; then
490           eerror "Problem running hwclock: $ERROR" ; eend 1
491        fi
492        eoutdent
493     fi
494
495  fi
496 }
497 # }}}
498
499 # {{{ print kernel info
500 config_kernel(){
501   if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
502     einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
503   else
504     einfo "Running Linux Kernel $KERNEL" ; eend 0
505   fi
506
507   if [ -r /proc/cpuinfo ] ; then
508     if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
509       eindent
510       einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
511       eoutdent
512     fi
513   fi
514
515   if [ -d /proc/xen ] ; then
516     eindent
517     einfo 'Running kernel featuring support for Xen detected' ; eend 0
518     eoutdent
519   fi
520 }
521 # }}}
522
523 # {{{ timezone
524 config_timezone(){
525  # don't touch the files if running from harddisk:
526  if [ -z "$INSTALLED" ]; then
527     KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
528     if [ -n "$KTZ" ] ; then
529        if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
530        then
531           ewarn "Warning: unknown timezone $KTZ"; eend 0
532        else
533           einfo "Setting timezone."
534           # update debconf
535           area=$(echo $KTZ | cut -d '/' -f1)
536           zone=$(echo $KTZ | cut -d '/' -f2)
537           echo "tzdata tzdata/Areas       select $area" | debconf-set-selections
538           echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
539           # update files
540           echo $KTZ > /etc/timezone
541           rm -f /etc/localtime
542           cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
543        fi
544     fi
545  fi
546 }
547 # }}}
548
549 # activate serial console {{{
550 config_console(){
551 if checkbootparam 'console'; then
552   local line
553   local ws
554   ws='   '
555
556   einfo "Bootoption for serial console detected:"
557
558   line="$CMDLINE x "
559   this=""
560   line="${line#*[$ws]}"
561   local telinitq=""
562   while [ -n "$line" ]; do
563     case "$this" in
564       console=*)
565         local serial="$this"
566         local device="${this%%,*}"
567         local device="${device##*=}"
568         if echo $serial | grep -q ttyS ; then
569           local option="${serial##*,}"
570           # default (works for kvm & CO):
571           local speed="115200,57600,38400,19200,9600,4800,2400,1200";
572           # ... unless overriden by command line:
573           case "$option" in
574             115200*) speed=115200 ;;
575              57600*) speed=57600 ;;
576              38400*) speed=38400 ;;
577              19200*) speed=19200 ;;
578               9600*) speed=9600 ;;
579               4800*) speed=4800 ;;
580               2400*) speed=2400 ;;
581               1200*) speed=1200 ;;
582           esac
583           eindent
584             einfo "Activating console login on device ${device} with speed ${speed}."
585             local number="${device#ttyS}"
586             sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab
587             eend $?
588             telinitq="1"
589           eoutdent
590         fi
591         ;;
592     esac
593     this="${line%%[$ws]*}"
594     line="${line#*[$ws]}"
595   done
596
597   if [ -n "$telinitq" ]; then
598     /sbin/telinit q
599   fi
600   eend $?
601 fi
602 }
603 # }}}
604
605 # {{{ CD Checker
606 config_testcd(){
607 if checkbootparam 'testcd' ; then
608   einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
609   eindent
610
611   local ERROR=true
612   local FOUND_FILE=false
613   local logfile='/tmp/md5sum.log'
614
615   rm -f "$logfile"
616
617   for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
618     einfo "Checking files against $md5, this may take a while..."
619
620     FOUND_FILE=true
621     OLD_PWD=$(pwd)
622     cd $(dirname "$md5")
623     md5sum -c $(basename "$md5") |& tee -a "${logfile}"
624     if [ $pipestatus[1] -eq 0 ] ; then
625       ERROR=false
626     fi
627     cd "${OLD_PWD}"
628   done
629
630   if ! $FOUND_FILE ; then
631     eerror 'Error: Could not find md5sum file' ; eend 1
632     return
633   fi
634
635   if ! $ERROR ; then
636     einfo "Everything looks OK" ; eend 0
637   else
638     eerror 'Checksum failed for theses files:' ; eend 1
639     egrep -v '(^md5sum:|OK$)' "${logfile}"
640     eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
641     einfon "Hit return to continue, or press the power button to shut down system."
642     read a
643   fi
644
645   eoutdent
646 fi
647 }
648 # }}}
649
650 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
651 config_blacklist(){
652 if checkbootparam 'blacklist' ; then
653  if [ -z "$INSTALLED" ]; then
654   einfo "Bootoption blacklist found."
655   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
656   BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
657   if [ -n "$BLACK" ] ; then
658     for module in $(echo ${BLACK//,/ }) ; do
659         einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
660         echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
661         echo "blacklist $module"     >> "$BLACKLIST_FILE"
662         echo "alias     $module off" >> "$BLACKLIST_FILE"
663         echo "# end   entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
664     done
665   else
666    eerror "No given module for blacklist found. Blacklisting will not work therefore."
667   fi
668  else
669   ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
670   eindent
671    einfo "Please blacklist the module(s) manually using the 'blacklist' script."
672   eoutdent
673  fi
674 fi
675 }
676 # }}}
677
678 # {{{ ACPI
679 config_acpi(){
680 if checkbootparam 'noacpi'; then
681   ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
682 elif checkbootparam 'nogrmlacpi' ; then
683   ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
684 elif [ ! -d /proc/acpi ] ; then
685   ewarn "ACPI: Kernel support not present." ; eend 0
686 else
687   einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
688   eindent
689   found=""
690   for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
691     basename="${a##*/}"
692     basename="${basename%%.*}"
693     case "$basename" in *_acpi)
694      egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
695     esac
696     modprobe $basename >>$DEBUG 2>&1 && found="yes"
697     local BASE="$BASE $basename"
698   done
699   if [ -n "$found" ] ; then
700     einfo "$BASE"  ; eend 0
701   else
702     ewarn "(none)" ; eend 1
703   fi
704   if ! pgrep acpid >/dev/null ; then
705     einfo "Starting acpi daemon."
706     /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
707   else
708     ewarn "acpi daemon already running."
709     eend 0
710   fi
711   eoutdent
712 fi
713 }
714 # }}}
715
716 # {{{ Start brltty
717 config_brltty() {
718   if checkbootparam 'brltty' ; then
719     [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
720   fi
721 }
722 # }}}
723
724 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
725 config_fstab(){
726
727 NOSWAP="yes" # we do not use swap by default!
728 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
729    NOSWAP=''
730    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
731 fi
732
733 # Scan for swap, config, homedir - but only in live-mode
734 if [ -z "$INSTALLED" ] ; then
735    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
736    GRML_IMG=""
737    GRML_SWP=""
738    HOMEDIR="$(getbootparam 'home')"
739    if [ -n "$partitions" ]; then
740       while read p m f relax; do
741         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
742         partoptions="users,exec"
743         fnew=""
744         # it's a swap partition?
745         case "$f" in swap)
746           eindent
747           if [ -n "$NOSWAP" ]; then
748              ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
749              eend 0
750           else
751              case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
752                    S1SUSP|S2SUSP|pmdisk|[zZ]*)
753                      if [ -n "$ANYSWAP" ] ; then
754                         einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
755                         swapon $p 2>>$DEBUG ; eend $?
756                      else
757                         ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
758                      fi
759                      ;;
760                    *)
761                      if [[ "$p" == LABEL* ]] ; then
762                         p=$(blkid -t $p | awk -F: '{print $1}')
763                      fi
764                      if grep -q $p /proc/swaps ; then
765                         ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
766                      else
767                         if [ -b "$p" ] ; then
768                         einfo "Using swap partition ${WHITE}${p}${NORMAL}."
769                         swapon $p 2>>$DEBUG ; eend $?
770                         else
771                         ewarn "$p is not a valid block device - not using it therefore." ; eend 0
772                         fi
773                      fi
774                      ;;
775              esac # dd-check
776           fi # -n "$NOSWAP
777           eoutdent
778           continue
779           ;;
780         esac # it's a swap partition?
781
782         # mount read-only
783         MOUNTOPTS="ro"
784         case "$f" in
785           vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
786           ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
787           *) continue ;;
788           # *) NONEFOUND='1'; continue ;;
789         esac
790
791         # use a swapfile
792         if [ -z "$NOSWAP" ] ; then
793            mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
794            # Activate swapfile, if exists
795            SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
796         fi
797         if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
798            mount -o remount,rw $m && MOUNTED=1
799            if swapon "$SWAPFILE" 2>>$DEBUG ; then
800               eindent
801                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
802               eoutdent
803               fnew="$SWAPFILE swap swap defaults 0 0"
804               grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
805               GRML_SWP="$GRML_SWP $SWAPFILE"
806               eend 0
807            fi
808            mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
809         fi
810
811         # use a image as home
812         IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
813         if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
814            if [ -n "$HOMEDIR" ]; then
815               if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
816                  continue
817               fi
818            fi
819            if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
820               GRML_IMG="$IMAGE"
821               mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
822            fi
823         fi
824         eend 0
825
826         # Umount, if not in use
827         [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
828
829       done <<EOT
830       $(cat /etc/fstab)
831 EOT
832    fi # -n $partitions
833 fi # -z $INSTALLED
834 }
835 # }}}
836
837 # {{{ CPU-detection
838 config_cpu(){
839 if checkbootparam 'nocpu'; then
840   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
841   return 0
842 fi
843
844 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
845    einfo "Found CPU:"
846    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)
847    echo $CPU | sed 's/ \{1,\}/ /g'
848    eend 0
849 else
850    einfo "Found 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
851 fi
852
853 # no cpufreq setup inside VirtualBox
854 if $VIRTUALBOX ; then
855    einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
856    return 0
857 fi
858
859 if [ -x /etc/init.d/loadcpufreq ] ; then
860    einfo "Trying to set up cpu frequency scaling:"
861    eindent
862    SKIP_CPU_GOVERNOR=''
863    LOADCPUFREQ=$(mktemp)
864    /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
865    if grep -q FATAL "$LOADCPUFREQ" ; then
866       eindent
867         SKIP_CPU_GOVERNOR=1
868         oldIFS="$IFS"
869         IFS="
870 "
871          for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
872              eerror "$line" ; eend $RC
873          done
874          IFS="$oldIFS"
875       eoutdent
876    elif grep -q done "$LOADCPUFREQ" ; then
877       MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
878       if [ -n "$MODULE" -a "$MODULE" != none ]; then
879          einfo "Loading cpufreq kernel module $MODULE" ; eend 0
880       else
881          SKIP_CPU_GOVERNOR=1
882          ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
883       fi
884    fi
885
886    rm -f "$LOADCPUFREQ"
887
888    if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
889      if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
890        if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
891          einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
892        else
893          einfo "Setting ondemand governor"
894          RC=0
895          for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
896            echo ondemand > $file || RC=1
897          done
898          eend $RC
899        fi
900      fi
901    fi
902
903    eoutdent
904 fi
905 }
906 # }}}
907
908 # {{{ autostart of ssh
909 config_ssh(){
910 if checkbootparam 'ssh' ; then
911    local PASSWD
912    PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
913
914    config_userlocal
915    einfo "Bootoption ssh found, trying to set password for root and user $localuser"
916    [ -z "$localuser" ] && eend 1
917
918    eindent
919    if [ -z "$PASSWD" ] ; then
920      set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
921    fi
922    eoutdent
923
924    if [ -n "$PASSWD" ] ; then
925       chpass_options=""
926       if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
927         chpass_options="-m"
928       fi
929
930       echo "$localuser:$PASSWD" | chpasswd $chpass_options
931       echo "root:$PASSWD" | chpasswd $chpass_options
932
933       eindent
934       ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
935       eoutdent
936    fi
937
938    einfo "Starting secure shell server in background for root and user $localuser"
939    /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
940    /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
941    eend $?
942
943 fi
944 }
945
946 # }}}
947
948 # {{{ display hostkeys of SSH server
949 config_display_ssh_fingerprints() {
950   if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
951     return 0 # no SSH host keys present
952   fi
953
954   einfo "SSH key fingerprints:"
955   for file in /etc/ssh/ssh_host_*_key ; do
956     einfon
957     ssh-keygen -l -f $file
958   done | column -t
959   eend $?
960 }
961 # }}}
962
963 # {{{ autostart of x11vnc
964 config_vnc(){
965 if checkbootparam 'vnc' ; then
966    config_userlocal
967    VNC_PASSWD=''
968    VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
969    einfo "Bootoption vnc found, trying to set password for user $localuser."
970    eindent
971    if [ -z "$VNC_PASSWD" ] ; then
972       if [ -x /usr/bin/apg ] ; then
973          VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
974       elif [ -x /usr/bin/gpw ] ; then
975          VNC_PASSWD="$(gpw 1)"
976       elif [ -x /usr/bin/pwgen ] ; then
977          VNC_PASSWD="$(pwgen -1 8)"
978       elif [ -x /usr/bin/hexdump ] ; then
979          VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
980       elif [ -n "$RANDOM" ] ; then
981          VNC_PASSWD="${localuser}${RANDOM}"
982       else
983          VNC_PASSWD=''
984          eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
985          eend 1
986       fi
987
988       if [ -n "$VNC_PASSWD" ] ; then
989          ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
990       fi
991    fi
992    eoutdent
993
994    # finally check if we have a password we can use:
995    if [ -n "$VNC_PASSWD" ] ; then
996
997       VNCDIR="/home/${localuser}/.vnc"
998       [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
999
1000       if [ ! -x /usr/bin/x11vnc ] ; then
1001          eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1002          eend 1
1003       else
1004          /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1005          /bin/chown -R "$localuser": "$VNCDIR"
1006       fi
1007    fi
1008    if checkbootparam 'vnc_connect' ; then
1009       VNC_CONNECT=''
1010       VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1011       einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1012       #store the options in a file
1013       VNCDIR="/home/${localuser}/.vnc"
1014       [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1015       echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1016    fi
1017 fi
1018 }
1019 # }}}
1020
1021 # {{{ set password for root and default user
1022 config_passwd(){
1023 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1024   local PASSWD
1025   PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1026
1027   config_userlocal
1028   einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1029   [ -z "$localuser" ] && eend 1
1030
1031   eindent
1032   if [ -z "$PASSWD" ] ; then
1033     set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1034   fi
1035   eoutdent
1036
1037   if [ -n "$PASSWD" ] ; then
1038     chpass_options=""
1039     if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1040       chpass_options="-m"
1041     fi
1042
1043     echo "$localuser:$PASSWD" | chpasswd $chpass_options
1044     echo "root:$PASSWD" | chpasswd $chpass_options
1045
1046     eindent
1047     ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1048     eoutdent
1049   fi
1050
1051 fi
1052
1053 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1054   local PASSWD
1055   PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1056
1057   if [ -z "$PASSWD" ] ; then
1058     eerror "No hashed password found, can not set password."
1059     eend 1
1060     return
1061   fi
1062
1063   config_userlocal
1064   einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1065   [ -z "$localuser" ] && eend 1
1066
1067   if [ -n "$PASSWD" ] ; then
1068     chpass_options="-e"
1069
1070     echo "$localuser:$PASSWD" | chpasswd $chpass_options
1071     echo "root:$PASSWD" | chpasswd $chpass_options
1072
1073     eindent
1074     ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1075     eoutdent
1076   fi
1077
1078 fi
1079 }
1080 # }}}
1081
1082 # {{{ Sound
1083 config_mixer () {
1084    if ! [ -x /usr/bin/amixer ] ; then
1085       eerror "amixer binary not available. Can not set sound volumes therefore."
1086       eend 1
1087    else
1088       if ! [ -r /proc/asound/cards ] ; then
1089          ewarn "No soundcard present, skipping mixer settings therefore."
1090          eend 0
1091          return
1092       fi
1093
1094       for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1095          einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1096          eindent
1097
1098          if checkbootparam 'vol' ; then
1099             VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1100             if [ -z "$VOL" ] ; then
1101                eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1102                VOL='75'
1103                eend 1
1104             fi
1105          else
1106             VOL='75'
1107          fi
1108
1109          if checkbootparam 'nosound' ; then
1110             einfo "Muting sound devices on request."
1111             ERROR=$(amixer -q set Master mute)
1112             RC=$?
1113             if [ -n "$ERROR" ] ; then
1114                eindent
1115                eerror "Problem muting sound devices: $ERROR"
1116                eoutdent
1117             fi
1118             eend $RC
1119          elif [ -z "$INSTALLED" ] ; then
1120             einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1121
1122             if checkbootparam 'micvol' ; then
1123                MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1124                einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1125             else
1126                MICVOL=0
1127             fi
1128
1129             CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1130             IFSOLD=${IFS:-}
1131             IFS='
1132 '
1133             for CONTROL in ${=CONTROLS} ; do
1134                # such devices can not be controlled with amixer ... unmute
1135                [[ "$CONTROL" == *Console* ]] && continue
1136
1137                if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1138                    if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1139                       amixer -c $card -q set "${CONTROL}" unmute
1140                    fi
1141                    if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1142                       amixer -c $card -q set "${CONTROL}" "${VOL}"%
1143                    fi
1144                fi
1145
1146                if [ ${MICVOL} -ne 0 ] ; then
1147                   if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1148                      amixer -c $card -q set "${CONTROL}" unmute
1149                   fi
1150                   if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1151                      amixer -c $card -q set "${CONTROL}" $MICVOL%
1152                   fi
1153                   eend $?
1154                fi
1155             done
1156             IFS=$IFSOLD
1157          fi # checkbootparam 'nosound'
1158          eoutdent
1159       done
1160    fi
1161 }
1162 # }}}
1163
1164 # {{{ syslog service
1165 config_syslog(){
1166  if checkbootparam 'nosyslog'; then
1167     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1168  else
1169     SYSLOGD=''
1170     [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1171     [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
1172     [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
1173     [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
1174     [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1175
1176     if [ -z "$SYSLOGD" ] ; then
1177        eerror "No syslog daemon found." ; eend 1
1178     else
1179        einfo "Starting $SYSLOGD in background."
1180        /etc/init.d/$SYSLOGD start >>$DEBUG &
1181        eend 0
1182     fi
1183  fi
1184 }
1185 # }}}
1186
1187 # {{{ gpm
1188 config_gpm(){
1189  if checkbootparam 'nogpm'; then
1190   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1191  else
1192    if ! [ -r /dev/input/mice ] ; then
1193       eerror "No mouse found - not starting GPM." ; eend 1
1194    else
1195       einfo "Starting gpm in background."
1196       /etc/init.d/gpm start >>$DEBUG &
1197       # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1198       eend 0
1199    fi
1200  fi
1201 }
1202 # }}}
1203
1204 # {{{ services
1205 config_services(){
1206  if checkbootparam 'services' ; then
1207     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1208     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1209     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1210     for service in $(echo -e $SERVICELIST) ; do
1211       # support running (custom) init scripts in non-blocking mode
1212       # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1213       if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1214         einfo "Starting service ${service}."
1215         /etc/init.d/${service} start >>$DEBUG
1216       else
1217         einfo "Starting service ${service} in background."
1218         /etc/init.d/${service} start >>$DEBUG &
1219       fi
1220     done
1221     eend $?
1222  fi
1223 }
1224 # }}}
1225
1226 # {{{ remote files
1227 get_remote_file() {
1228   [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1229   SOURCE=$(eval echo "$1")
1230   TARGET="$2"
1231   getconfig() {
1232   wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
1233        --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1234   }
1235   einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1236
1237   if checkbootparam 'getfile.retries' ; then
1238     local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1239   else
1240     local counter=10
1241   fi
1242
1243   while ! getconfig && [[ "$counter" != 0 ]] ; do
1244     echo -n "Sleeping for 1 second and trying to get config again... "
1245     counter=$(( counter-1 ))
1246     echo "$counter tries left" ; sleep 1
1247   done
1248   if [ -s "$TARGET" ] ; then
1249     einfo "Downloading was successfull." ; eend 0
1250     einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1251     md5sum ${TARGET} ; eend 0
1252     return 0;
1253   else
1254     einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1255     return 1;
1256  fi
1257 }
1258 # }}}
1259
1260 # {{{ config files
1261 config_netconfig(){
1262  if checkbootparam 'netconfig' ; then
1263   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1264   CONFIGFILE='/tmp/netconfig.grml'
1265
1266   if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1267     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1268   fi
1269
1270  fi
1271 }
1272 # }}}
1273
1274 # {{{ remote scripts
1275 config_netscript() {
1276  if checkbootparam 'netscript' ; then
1277   CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1278   SCRIPTFILE='/tmp/netscript.grml'
1279
1280   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1281     chmod +x ${SCRIPTFILE}
1282     einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1283   fi
1284
1285  fi
1286 }
1287 # }}}
1288
1289 # {{{ stats
1290 config_stats() {
1291  if ! checkbootparam 'nostats' ; then
1292    BASE_URL="http://stats.grml.org/report/"
1293    ACTION_NAME=Boot
1294
1295    HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1296
1297    grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1298    DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1299    [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1300      VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1301
1302    PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1303
1304    echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1305    [ -z "$BOOT" ] && BOOT="local"
1306
1307    ADDITIONAL_PARAMS=""
1308    ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1309      ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1310
1311    URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\&params=$PARAMS$ADDITIONAL_PARAMS'
1312
1313    get_remote_file "$URI" "/dev/null"  >/dev/null 2>&1 &!
1314  fi
1315 }
1316 # }}}
1317
1318 # {{{ start X window system via grml-x
1319 config_x_startup(){
1320 # make sure we start X only if startx is used *before* a nostartx option
1321 # so it's possible to disable automatic X startup using nostart
1322 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1323  if [ -x "$(which X)" ] ; then
1324   if [ -z "$INSTALLED" ] ; then
1325    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1326    if [ -z "$WINDOWMANAGER" ] ; then
1327      einfo "No window manager specified. Using default one." && eend 0
1328    else
1329      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1330    fi
1331    einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1332    config_userlocal
1333  cat>|/etc/init.d/xstartup<<EOF
1334 #!/bin/sh
1335 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1336 EOF
1337    chmod 755 /etc/init.d/xstartup
1338
1339    # adjust inittab for xstartup
1340    if grep -q '^6:' /etc/inittab ; then
1341       sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
1342    else # just append tty6 to inittab if no definition is present:
1343       echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1344    fi
1345
1346    /sbin/telinit q ; eend $?
1347
1348    if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1349       sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1350    else
1351       echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1352    fi
1353
1354   else
1355     eerror "We are not running in live mode - startx will not work, skipping it."
1356     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1357   fi
1358  else
1359    eerror "/usr/bin/X is not present on this grml flavour."
1360    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
1361  fi
1362 fi
1363 }
1364 # }}}
1365
1366 # {{{ configuration framework
1367 config_extract(){
1368 if checkbootparam 'extract' ; then
1369  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1370  EXTRACTOPTIONS="-- -x $EXTRACT"
1371 fi
1372 }
1373
1374 config_finddcsdir() {
1375 #  - If no GRMLCFG partition is found and noautoconfig is _not_ given
1376 #    on the command line, nothing is changed and the dcs files are
1377 #    searched within the .iso, $dcs-dir is set to the root directory
1378 #    within the .iso
1379 #  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1380 #    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1381 #    set, $dcs-dir is set to the root directory within the .iso.
1382 #  - If myconfig=foo is set on the command line, $dcs-dir is set to
1383 #    foo, even if a GRMLCFG partition is present.
1384 DCSDIR=""
1385 DCSMP="/mnt/grml"
1386 # autoconfig, see issue673
1387 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1388 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1389 if checkbootparam 'noautoconfig' ; then
1390   DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1391   ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1392 else
1393   if [ -z "$INSTALLED" ] ; then
1394     if checkbootparam 'myconfig' ; then
1395       DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1396       if [ -z "$DCSDEVICE" ]; then
1397         eerror "Error: No device for bootoption myconfig provided." ; eend 1
1398       fi # [ -z "$DCSDEVICE" ]
1399     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1400       einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1401       eindent
1402       DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1403
1404       modprobe 9p 2>/dev/null || true
1405       if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1406           if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1407             einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1408             DCSDEVICE="$GRMLCFG"
1409             MOUNTOPTIONS="ro,trans=virtio"
1410             DCSFS="9p"
1411           fi
1412       fi
1413
1414       if [ -n "$DCSDEVICE" ]; then
1415         DCSMP="/mnt/grmlcfg"
1416       fi
1417       eoutdent
1418     fi
1419
1420     # if not specified/present then assume default:
1421     if [ -z "$DCSDEVICE" ]; then
1422       DCSDIR="${LIVECD_PATH}"
1423     else
1424       eindent
1425       einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1426       DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1427       if [ -n "$DCSDIR" ]; then
1428         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1429       else
1430         [ -d $DCSMP ] || mkdir $DCSMP
1431         umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1432         mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE  $DCSMP ; RC="$?"
1433         if [[ $RC == 0 ]]; then
1434           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1435         else
1436           eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1437         fi
1438         DCSDIR="$DCSMP"
1439       fi
1440       eoutdent
1441     fi
1442   fi
1443 fi
1444
1445 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1446   einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1447 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1448   einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1449 fi
1450 }
1451
1452
1453 config_partconf() {
1454 if checkbootparam 'partconf' ; then
1455  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1456  if [ -n "$MOUNTDEVICE" ]; then
1457    [ -d /mnt/grml ] || mkdir /mnt/grml
1458    mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1459     if [[ $RC == 0 ]]; then
1460       einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1461       einfo "Copying files from $MOUNTDEVICE over grml system."
1462       for file in `cat /etc/grml/partconf` ; do
1463         [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1464         [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file}  ${file} && echo "copied: $file"
1465       done && eend 0
1466     else
1467       einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1468     fi # mount $MOUNTDEVICE
1469    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1470  else
1471    einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1472  fi # [ -n "$MOUNTDEVICE" ]
1473 fi
1474 }
1475 # }}}
1476
1477 # {{{ /cdrom/.*-options
1478 config_debs(){
1479 if checkbootparam 'debs' ; then
1480    iszsh && setopt localoptions shwordsplit
1481    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1482    if [ -z "$DEBS" ] ; then
1483       DEBS="*.deb"
1484    fi
1485    if ! echo $DEBS | grep -q '/'; then
1486      # backwards compatibility: if no path is given get debs from debs/
1487      DEBS="debs/$DEBS"
1488    fi
1489    einfo "Trying to install Debian package(s) ${DEBS}"
1490    DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1491    dpkg -i $DEBS ; eend $?
1492 fi
1493 }
1494
1495 config_scripts(){
1496 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1497    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1498    if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1499      SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1500    fi
1501    if ! echo $SCRIPTS | grep -q '/'; then
1502      # backwards compatibility: if no path is given get scripts from scripts/
1503      SCRIPTS="scripts/$SCRIPTS"
1504    fi
1505    if [ -n "$SCRIPTS" ]; then
1506      SCRIPTS="${DCSDIR}/$SCRIPTS"
1507      if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1508        einfo "Trying to execute ${SCRIPTS}"
1509        sh -c $SCRIPTS
1510        eend $?
1511      elif [ -d "$SCRIPTS" ]; then
1512        einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1513        run-parts --regex '.*' $SCRIPTS
1514        eend $?
1515      else
1516        einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1517        sh -c $SCRIPTS
1518        eend $?
1519      fi
1520    fi
1521 fi
1522 }
1523
1524 config_config(){
1525 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1526   CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1527   if [ -z "$CONFIG" ]; then
1528     CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1529   fi
1530   if [ -n "$CONFIG" ]; then
1531     if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1532       einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1533
1534       cp -a ${DCSDIR}/${CONFIG}/* /
1535     elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1536       einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1537
1538       cd /
1539       unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1540     else
1541       ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1542     fi
1543   fi
1544 fi
1545 }
1546 # }}}
1547
1548 # {{{ confing_umount_dcsdir
1549 config_umount_dcsdir(){
1550    # umount $DCSMP if it was mounted by finddcsdir
1551    grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1552 }
1553 # }}}
1554
1555 # {{{ mypath
1556 config_mypath(){
1557 if checkbootparam 'mypath' ; then
1558    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1559    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1560    touch /etc/grml/my_path
1561    chmod 644 /etc/grml/my_path
1562    # make sure the directories exist:
1563    eindent
1564    for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1565        if ! [ -d "$i" ] ; then
1566           einfo "Creating directory $i"
1567           mkdir -p "$i" ; eend $?
1568        fi
1569    done
1570    grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1571    eoutdent
1572 fi
1573 }
1574 # }}}
1575
1576 # {{{ SW-RAID
1577 config_swraid(){
1578   [ -n "$INSTALLED" ] && return 0
1579
1580   if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
1581      checkbootparam 'raid=noautodetect' ; then
1582      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1583   else
1584     [ -e /proc/mdstat ] || modprobe md_mod
1585     if ! [ -x /sbin/mdadm ] ; then
1586        eerror "mdadm not available, can not execute it." ; eend 1
1587     else
1588
1589        # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1590        # find out whether we have a valid configuration file already
1591        if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1592           einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1593           [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1594           MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1595         else
1596           ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1597        fi
1598
1599        if ! checkbootparam 'swraid' ; then
1600           eindent
1601           einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1602           eoutdent
1603        else
1604           einfo "Bootoption swraid found. Searching for software RAID arrays:"
1605           eindent
1606            IFSOLD=${IFS:-}
1607            IFS='
1608 '
1609            for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1610                case $line in
1611                  *'No arrays found'*)
1612                    ewarn "$line" ; eend 0
1613                    ;;
1614                  *)
1615                    einfo "$line" ; eend 0
1616                    ;;
1617                esac
1618            done
1619            IFS=$IFSOLD
1620          eoutdent
1621
1622          if [ -r /proc/mdstat ] ; then
1623             eindent
1624             MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1625             if [ -z "$MDSTAT" ] ; then
1626                ewarn "No active arrays found" ; eend 0
1627             else
1628                IFSOLD=${IFS:-}
1629                IFS='
1630 '
1631                for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1632                    einfo "active arrays: $line" ; eend 0
1633                done
1634                IFS=$IFSOLD
1635             fi
1636             eoutdent
1637          fi # /proc/mdstat
1638        fi # bootoption swraid
1639
1640      fi # is /sbin/mdadm executable?
1641   fi # check for bootoptions
1642 }
1643 # }}}
1644
1645 # {{{ dmraid
1646 config_dmraid(){
1647   [ -n "$INSTALLED" ] && return 0
1648
1649   if checkbootparam 'nodmraid' ; then
1650     ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1651     return 0
1652   fi
1653
1654   if ! [ -x /sbin/dmraid ] ; then
1655     eerror "dmraid not available, can not execute it." ; eend 1
1656     return
1657   fi
1658
1659   dmraid_wrapper() {
1660     # usage: dmraid_wrapper <dmraid_option>
1661     [ -n "$1" ] || return 1
1662
1663     IFSOLD=${IFS:-}
1664     IFS='
1665 '
1666     eindent
1667
1668     for line in $(dmraid $1 ; echo errcode:$?); do
1669       case $line in
1670         *'no block devices found'*)
1671           einfo "No block devices found" ; eend 0
1672           break
1673           ;;
1674         *'no raid disks'*)
1675           einfo "No active dmraid devices found" ; eend 0
1676           break
1677           ;;
1678         errcode:0)
1679           eend 0;
1680           ;;
1681         errcode:1)
1682           eend 1
1683           ;;
1684         *)
1685           einfo "$line"
1686           ;;
1687       esac
1688     done
1689
1690     eoutdent
1691     IFS=$IFSOLD
1692   }
1693
1694   if checkbootparam 'dmraid' ; then
1695     local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1696     if [ "$ACTION" = "off" ] ; then
1697       # Deactivates all active software RAID sets:
1698       einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1699       dmraid_wrapper -an
1700     else
1701       # Activate all software RAID sets discovered:
1702       einfo "Activating present dmraid sets (as requested via dmraid):"
1703       dmraid_wrapper -ay
1704     fi
1705
1706     return
1707   fi
1708
1709   # by default (no special bootoptions) discover all software RAID devices:
1710   einfo "Searching for any present dmraid sets:"
1711   dmraid_wrapper -r
1712 }
1713 # }}}
1714
1715 # {{{ LVM (Logical Volumes)
1716 config_lvm(){
1717   [ -n "$INSTALLED" ] && return 0
1718
1719   if checkbootparam 'nolvm' ; then
1720      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1721   else
1722     # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
1723     if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
1724        eerror "LVM not available, can not execute it." ; eend 1
1725     else
1726        if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1727           einfo "You seem to have logical volumes (LVM) on your system."
1728           eindent
1729           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1730           eend 0
1731           if checkbootparam 'lvm' ; then
1732              einfo "Bootoption LVM found. Searching for logical volumes:"
1733              /etc/init.d/lvm2 start ; eend $?
1734           fi
1735           eoutdent
1736        fi
1737     fi # check for lvm binary
1738   fi # check for bootoption nolvm
1739 }
1740 # }}}
1741
1742 # {{{ debnet: setup network based on an existing one found on a partition
1743 config_debnet(){
1744 if checkbootparam 'debnet' ; then
1745  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1746  /usr/sbin/debnet
1747 fi
1748 }
1749 # }}}
1750
1751 # {{{ disable console blanking
1752 config_blanking(){
1753 if checkbootparam 'noblank' ; then
1754   einfo "Bootoption noblank found. Disabling monitor blanking."
1755   setterm -blank 0 ; eend $?
1756 fi
1757 }
1758 # }}}
1759
1760 # {{{ debootstrap: automatic installation
1761 config_debootstrap(){
1762
1763 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1764
1765 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1766
1767 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1768    eindent
1769    eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1770    eoutdent
1771    exit 1
1772 fi
1773
1774 if checkbootparam 'target' ; then
1775   TARGET=''
1776   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1777   # notice: the following checks whether the given partition is available, if not the skip
1778   # execution of grml-debootstrap as it might result in data loss...
1779   if ! [ -r "$TARGET" ] ; then
1780      eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1781   fi
1782 else
1783   eindent
1784   eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1785   eoutdent
1786   exit 1
1787 fi
1788
1789 if checkbootparam 'grub' ; then
1790   GRUB=''
1791   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1792 fi
1793
1794 if checkbootparam 'groot' ; then
1795   GROOT=''
1796   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1797 fi
1798
1799 if checkbootparam 'release' ; then
1800   RELEASE=''
1801   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1802 fi
1803
1804 if checkbootparam 'mirror' ; then
1805   MIRROR=''
1806   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1807 fi
1808
1809 if checkbootparam 'boot_append' ; then
1810   BOOT_APPEND=''
1811   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1812 fi
1813
1814 if checkbootparam 'password' ; then
1815   PASSWORD=''
1816   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1817 fi
1818
1819 # now check which options are available
1820 if [ -n "TARGET" ] ; then
1821    TARGETCMD="--target $TARGET"
1822 else
1823    TARGETCMD=''
1824    eindent
1825    eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1826    eoutdent
1827    exit 1
1828 fi
1829 [ -n "$GRUB" ]     && GRUBCMD="--grub $GRUB"               || GRUBCMD=''
1830 [ -n "$GROOT" ]    && GROOTCMD="--groot $GROOT"            || GROOTCMD=''
1831 [ -n "$RELEASE" ]  && RELEASECMD="--release $RELEASE"      || RELEASECMD=''
1832 [ -n "$MIRROR" ]   && MIRRORCMD="--mirror $MIRROR"         || MIRRORCMD=''
1833 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD"   || PASSWORDCMD=''
1834 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1835
1836 # and finally write script and execute it
1837 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1838 #!/bin/sh
1839 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1840 EOF
1841
1842 chmod 750  /usr/bin/grml-debootstrap_noninteractive
1843
1844 screen /usr/bin/grml-debootstrap_noninteractive
1845 einfo "Invoking a shell, just exit to continue booting..."
1846 /bin/zsh
1847
1848 fi # checkbootparam "BOOT_IMAGE=debian2hd
1849 }
1850 # }}}
1851
1852 # {{{ virtualbox shared folders
1853 config_virtualbox_shared_folders() {
1854 if $VIRTUALBOX ; then
1855   einfo "VirtualBox detected, trying to set up Shared Folders."
1856   if ! modinfo vboxsf &>/dev/null ; then
1857     ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1858     eend 0
1859   elif ! [ -x /usr/sbin/VBoxService ] ; then
1860     ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1861     eend 0
1862   else
1863     eindent
1864
1865       einfo "Loading vboxsf driver."
1866       lsmod | grep -q vboxsf || modprobe vboxsf
1867       eend $?
1868
1869       einfo "Adjusting /dev/vboxguest."
1870       chown root:vboxsf /dev/vboxguest
1871       chmod 660 /dev/vboxguest
1872       eend $?
1873
1874       config_userfstab
1875
1876       einfo "Adding $fstabuser to group vboxsf."
1877       adduser grml vboxsf &>/dev/null
1878       eend $?
1879
1880       einfo "Starting VBoxService."
1881       VBoxService >/dev/null
1882       eend $?
1883
1884       local vbautomation='automation'
1885       if checkbootparam 'vbautomation'; then
1886         vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1887       fi
1888
1889       if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1890         ewarn "No automount shared folder '$vbautomation' available"
1891         eend 0
1892       else
1893         einfo "Found automount shared folder '$vbautomation'"
1894         eend 0
1895
1896         local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1897         [ -n "$distri" ] || distri='grml'
1898
1899         local vbox_auto_sf="/media/sf_${vbautomation}"
1900
1901         sleep 1 # ugly but necessary
1902
1903         counter=10
1904         eindent
1905         while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1906           einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1907           sleep 1
1908           counter=$(( counter-1 ))
1909           eend 0
1910         done
1911         eoutdent
1912
1913         if ! [ -d "${vbox_auto_sf}" ] ; then
1914           eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1915           eend 1
1916         else
1917           einfo "Found shared folders automation directory $vbox_auto_sf"
1918           eend 0
1919
1920           eindent
1921           if checkbootparam 'novbautomation' ; then
1922             einfo "Bootoption novbautomation found. Disabling automation script execution."
1923             eend 0
1924           else
1925             if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1926               ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1927               eend 1
1928             else
1929               einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1930               "${vbox_auto_sf}/${distri}"
1931               eend $?
1932             fi
1933           fi
1934           eoutdent
1935         fi
1936       fi
1937
1938     eoutdent
1939   fi
1940 fi
1941 }
1942 # }}}
1943
1944 # {{{ Support customization
1945 config_distri(){
1946 if checkbootparam 'distri'; then
1947   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1948   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1949      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1950      # make sure the desktop.jpg file is not a symlink, so copying does not file then
1951      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1952      cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1953   fi
1954 fi
1955 }
1956 # }}}
1957
1958 ## END OF FILE #################################################################
1959 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2