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