X-Git-Url: http://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=3cc12ee3ca8d9b067c2c03c8fe4a888b3f6ac552;hp=6909dccd90dfc78db59e452b1126763a262effb8;hb=34be1a5b46d770b134219692d080aa7f82070c09;hpb=1039de1e609003d2414e59207863133cb12bf774 diff --git a/autoconfig.functions b/autoconfig.functions index 6909dcc..3cc12ee 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -1,18 +1,23 @@ #!/bin/zsh # Filename: autoconfig.functions # Purpose: basic system configuration and hardware setup for grml system -# Authors: grml-team (grml.org), (c) Klaus Knopper , (c) Michael Prokop +# Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Sam Mai 12 00:46:15 CEST 2007 [mika] ################################################################################ # {{{ path, variables, signals, umask, zsh export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin" DEBUG="/dev/null" KERNEL="$(uname -r)" +ARCH="$(uname -m)" umask 022 +# old linuxrc version: +[ -d /cdrom ] && export LIVECD_PATH=/cdrom +# new initramfs layout: +[ -d /live/image ] && export LIVECD_PATH=/live/image + # Ignore these signals in non-interactive mode: INT, TERM, SEGV [ -z "$PS1" ] && trap "" 2 3 11 @@ -28,49 +33,74 @@ fi iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!" # }}} -### {{{ Utility Functions - -# Simple shell grep -stringinfile(){ - case "$(cat $2)" in *$1*) return 0;; esac - return 1 -} +# {{{ Read in boot parameters +if [ -z "$CMDLINE" ]; then + # if CMDLINE was set from the outside, we're debugging. + # otherwise, take CMDLINE from Kernel and config files. + CMDLINE="$(cat /proc/cmdline)" + [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')" + [ -d /live/image/bootparams/ ] && CMDLINE="$CMDLINE $(cat /live/image/bootparams/* | tr '\n' ' ')" +fi +# }}} -# same for strings -stringinstring(){ - case "$2" in *$1*) return 0;; esac - return 1 -} +### {{{ Utility Functions -# Reread boot command line; echo last parameter's argument or return false. +# Get a bootoption's parameter: read boot command line and either +# echo last parameter's argument or return false. getbootparam(){ - stringinstring " $1=" "$CMDLINE" || return 1 - result="${CMDLINE##*$1=}" - result="${result%%[ ]*}" - echo "$result" - return 0 + local line + local ws + ws=' ' + line=" $CMDLINE " + case "$line" in + *[${ws}]"$1="*) + result="${line##*[$ws]$1=}" + result="${result%%[$ws]*}" + echo "$result" + return 0 ;; + *) # no match? + return 1 ;; + esac } # Check boot commandline for specified option checkbootparam(){ - stringinstring " $1" "$CMDLINE" - return "$?" + [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 ) + local line + local ws + ws=' ' + line=" $CMDLINE " + case "$line" in + *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*) + return 0 ;; + *) + return 1 ;; + esac +} + +# Check if currently using a framebuffer +hasfb() { + [ -e /dev/fb0 ] && return 0 || return 1 } +# Check wheter a configuration variable (like $CONFIG_TOHD) is +# enabled or not checkvalue(){ - if [ "$1" = "yes" ] ; then - return 0 - else - return 1 - fi + case "$1" in + [yY][eE][sS]) return 0 ;; # it's set to 'yes' + [tT][rR][uU][eE]) return 0 ;; # it's set to 'true' + *) return 1 ;; # default + esac } +# Are we using grml-small? checkgrmlsmall(){ grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1 } -checkgrmlusb(){ - grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1 +# execute flite only if it's present +flitewrapper() { + [ -x /usr/bin/flite ] && flite -o play -t "$*" } ### }}} @@ -80,7 +110,7 @@ mount_proc(){ } mount_pts(){ - stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null + grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null } mount_sys(){ @@ -88,23 +118,17 @@ mount_sys(){ } # }}} -# {{{ Read in boot parameters -[ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too -CMDLINE="$(cat /proc/cmdline)" -[ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')" -# }}} - -# {{{ Check if we are running from the grml-CD or HD +# {{{ Check if we are running in live mode or from HD INSTALLED="" -[ -e /GRML/etc/grml_cd ] || INSTALLED="yes" +[ -e /etc/grml_cd ] || INSTALLED="yes" # testcd TESTCD="" -checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes" +checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes" # }}} # {{{ source lsb-functions , color handling -if checkbootparam "nocolor"; then +if checkbootparam 'nocolor'; then RC_NOCOLOR=yes . /etc/grml/lsb-functions einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0 @@ -116,26 +140,29 @@ fi # {{{ debug config_debug(){ - if checkbootparam "debug"; then - BOOTDEBUG="yes" - fi - if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then - BOOTDEBUG="yes" - fi + checkbootparam 'debug' && BOOTDEBUG="yes" + checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes" + rundebugshell(){ if [ -n "$BOOTDEBUG" ]; then - einfo "Starting intermediate shell stage $stage as requested by \"debug\" option." - eindent - if [ -r /etc/grml/screenrc ] ; then - einfo "Starting GNU screen to be able to use a full featured shell environment." - einfo "Just exit the shells (and therefore screen) to continue boot process..." - /bin/zsh -c "screen -c /etc/grml/screenrc" - else - einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!" - einfo "Just exit the shell to continue boot process..." - /bin/zsh - fi - eoutdent + einfo "Starting intermediate shell stage $stage as requested by \"debug\" option." + if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then + einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!" + einfo "Just exit the shell to continue boot process..." + /bin/zsh + else + eindent + if [ -r /etc/grml/screenrc ] ; then + einfo "Starting GNU screen to be able to use a full featured shell environment." + einfo "Just exit the shells (and therefore screen) to continue boot process..." + /bin/zsh -c "screen -c /etc/grml/screenrc" + else + einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!" + einfo "Just exit the shell to continue boot process..." + /bin/zsh + fi + eoutdent + fi fi } } @@ -143,28 +170,23 @@ config_debug(){ # {{{ log config_log(){ -if checkbootparam "log"; then - export DEBUG="/tmp/grml.log.`date +%Y%m%d`" - touch $DEBUG - einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot." - eindent - einfo "Starting bootlogd." - bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $? - eoutdent +if checkbootparam 'log' || checkbootparam 'debug' ; then + export DEBUG="/tmp/grml.log.`date +%Y%m%d`" + touch $DEBUG + einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot" + eindent + einfo "Starting bootlogd." # known to be *very* unreliable :( + bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $? + eoutdent else - DEBUG="/dev/null" + DEBUG="/dev/null" fi } # }}} -# {{{ Check if we are in interactive startup mode -INTERACTIVE="" -stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes" -# }}} - # {{{ set firmware timeout via bootparam config_fwtimeout(){ - if checkbootparam fwtimeout ; then + if checkbootparam 'fwtimeout' ; then TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)" einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module." rmmod firmware_class 1>>$DEBUG 2>&1 @@ -192,22 +214,27 @@ config_language(){ grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8='' # check for bootoption which overrides config from /etc/grml/autoconfig: - BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)" + BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)" [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE" # set default to 'en' in live-cd mode if $LANGUAGE is not yet set: if [ -z "$INSTALLED" ] ; then - [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8' + [ -n "$LANGUAGE" ] || LANGUAGE='en' fi - # if bootoption lang is used update /etc/default/locale, otherwise *not*! - if [ -n "$BOOT_LANGUAGE" ] ; then - [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE" + if [ -x /usr/sbin/grml-setlang ] ; then + # if bootoption lang is used update /etc/default/locale accordingly + if [ -n "$BOOT_LANGUAGE" ] ; then + checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "$LANGUAGE" + # otherwise default to lang=en + else + checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en" + fi fi # set console font if [ -z "$CONSOLEFONT" ] ; then - if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then + if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16' # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then @@ -215,6 +242,9 @@ config_language(){ else ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1 fi + if ! hasfb ; then + CONSOLEFONT='Lat15-Terminus16' + fi fi fi @@ -230,7 +260,7 @@ config_language(){ [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard # now allow keyboard override by boot commandline for later use: - KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)" + KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)" [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD" # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead: [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys @@ -242,7 +272,7 @@ config_language(){ local LANGUAGE="$BOOT_LANGUAGE" . /etc/grml/language-functions # allow setting xkeyboard explicitly different than console keyboard - KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)" + KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)" if [ -n "$KXKEYBOARD" ]; then XKEYBOARD="$KXKEYBOARD" KDEKEYBOARD="$KXKEYBOARD" @@ -254,7 +284,7 @@ config_language(){ # duplicate of previous code to make sure /etc/grml/language-functions # does not overwrite our values.... # now allow keyboard override by boot commandline for later use: - KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)" + KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)" [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD" # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead: [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys @@ -262,10 +292,12 @@ config_language(){ # write keyboard related variables to file for later use [ -d /etc/sysconfig ] || mkdir /etc/sysconfig - echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard - echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard - echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard - echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard + if ! [ -e /etc/sysconfig/keyboard ] ; then + echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard + echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard + echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard + echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard + fi fi [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard @@ -273,39 +305,44 @@ config_language(){ # activate unicode console if running within utf8 environment if [ -r /etc/default/locale ] ; then if grep -q "LANG=.*UTF" /etc/default/locale ; then - if checkgrmlsmall && [ -z "$INSTALLED" ] ; then - ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0 - else - einfo "Setting up unicode environment." - unicode_start 2>>$DEBUG ; eend $? - fi + einfo "Setting up unicode environment." + unicode_start 2>>$DEBUG ; eend $? fi fi # Set default keyboard before interactive setup if [ -n "$KEYTABLE" ] ; then - einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background" - loadkeys -q $KEYTABLE & - eend $? + einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background" + loadkeys -q $KEYTABLE & + eend $? fi # we have to set up all consoles, therefore loop it over all ttys: - NUM_CONSOLES=`fgconsole --next-available` - NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1` + NUM_CONSOLES=$(fgconsole --next-available) + NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1) [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6 + CUR_CONSOLE=$(fgconsole) + if [ -n "$CHARMAP" ] ; then einfo "Running consolechars for ${CHARMAP}" for vc in `seq 0 ${NUM_CONSOLES}` ; do consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$? done + [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE eend $RC fi - if [ -n "$CONSOLEFONT" ] ; then - einfo "Running consolechars using ${CONSOLEFONT}" - for vc in `seq 0 ${NUM_CONSOLES}` ; do - consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d - done - eend $? + + if checkbootparam 'noconsolefont' ; then + ewarn "Skipping setting console font as requested on boot commandline." ; eend 0 + else + if [ -n "$CONSOLEFONT" ] ; then + einfo "Running consolechars using ${CONSOLEFONT}" + for vc in `seq 0 ${NUM_CONSOLES}` ; do + consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$? + done + [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE + eend $? + fi fi eoutdent @@ -314,11 +351,12 @@ config_language(){ # {{{ Set hostname config_hostname(){ - if checkbootparam hostname ; then + if checkbootparam 'hostname' ; then HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)" einfo "Setting hostname to $HOSTNAME as requested." - sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts - hostname $HOSTNAME ; eend $? + grml-hostname $HOSTNAME >>$DEBUG ; RC=$? + [ "$RC" = "0" ] && hostname $HOSTNAME + eend $RC else hostname --file /etc/hostname fi @@ -342,26 +380,36 @@ config_userfstab(){ config_time(){ # don't touch the files if running from harddisk: if [ -z "$INSTALLED" ]; then - UTC="" - checkbootparam utc >>$DEBUG 2>&1 && UTC="-u" - checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u" + # The default hardware clock timezone is stated as representing local time. + UTC="--localtime" + grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS + checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS + checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS + checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS + grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u" # hwclock uses the TZ variable - [ -r /etc/timezone ] && TZ=$(cat /etc/timezone) - [ -n "$TZ" ] || TZ=Europe/Vienna + KTZ="$(getbootparam 'tz' 2>>$DEBUG)" + [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone) + if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then + ewarn "Warning: unknown timezone $KTZ" ; eend 1 + KTZ="Europe/Vienna" + ewarn "Falling back to timezone $KTZ" ; eend 0 + fi if ! [ -r /dev/rtc ] ; then - ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0 - else - ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$? - if [ -n "$ERROR" ] ; then - eindent - ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1) - if [ -n "$ERROR" ] ; then - eerror "Problem running hwclock: $ERROR" ; eend 1 - fi - eoutdent - fi + ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0 + fi + + ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$? + if [ -n "$ERROR" ] ; then + eindent + ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1) + if [ -n "$ERROR" ] ; then + eerror "Problem running hwclock: $ERROR" ; eend 1 + fi + eoutdent fi + fi } # }}} @@ -388,17 +436,22 @@ config_kernel(){ # {{{ vmware specific stuff config_vmware(){ -if checkbootparam novmware ; then +if checkbootparam 'novmware' ; then ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0 else if [ -z "$INSTALLED" ] ; then - if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then - if ! checkbootparam qemu ; then + if vmware-detect || checkbootparam "BOOT_IMAGE=vmware" ; then + if ! checkbootparam 'qemu' ; then if [ -r /etc/X11/xorg.conf.vmware ] ; then einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf" cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $? fi fi + elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then + if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then + einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf' + cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $? + fi fi fi fi @@ -407,7 +460,7 @@ fi # {{{ qemu specific stuff config_qemu(){ -if checkbootparam qemu ; then +if checkbootparam 'qemu' ; then if [ -r /etc/X11/xorg.conf.example ] ; then einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf" cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $? @@ -433,22 +486,28 @@ fi } # }}} -# update_progress {{{ -update_progress(){ - # be sure we are non-blocking - (echo "$1" > /etc/sysconfig/progress) & -} -# }}} - # {{{ timezone config_timezone(){ # don't touch the files if running from harddisk: if [ -z "$INSTALLED" ]; then - einfo "Setting timezone." - KTZ="$(getbootparam tz 2>>$DEBUG)" - [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ" - rm -f /etc/localtime - cp "/usr/share/zoneinfo/$TZ" /etc/localtime && eend 0 + KTZ="$(getbootparam 'tz' 2>>$DEBUG)" + if [ -n "$KTZ" ] ; then + if [ ! -f "/usr/share/zoneinfo/$KTZ" ] + then + ewarn "Warning: unknown timezone $KTZ"; eend 0 + else + einfo "Setting timezone." + # update debconf + area=$(echo $KTZ | cut -d '/' -f1) + zone=$(echo $KTZ | cut -d '/' -f2) + echo "tzdata tzdata/Areas select $area" | debconf-set-selections + echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections + # update files + echo $KTZ > /etc/timezone + rm -f /etc/localtime + cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $? + fi + fi fi } # }}} @@ -460,7 +519,7 @@ RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo) # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo) eindent -if checkbootparam "small"; then +if checkbootparam 'small'; then einfo "Information: ${RAM} kB of RAM available." ; eend 0 einfo "Bootoption small detected. Activating small system." if [ -r /etc/inittab.small ] ; then @@ -502,8 +561,8 @@ eoutdent # skip startup of w3m {{{ config_fast(){ -if checkbootparam "fast"; then - ewarn "Bootoption fast detected. Skipping startup of w3m." +if checkbootparam 'fast'; then + ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig." sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab /sbin/telinit q ; eend $? fi @@ -512,11 +571,11 @@ fi # activate serial console {{{ config_console(){ -if checkbootparam "console"; then +if checkbootparam 'console'; then einfo "Bootoption (for serial) console detected." eindent if [ -r /etc/mgetty/mgetty.config ] ; then - MODE=$(getbootparam console | awk -F, '{print $2}') + MODE=$(getbootparam 'console' | awk -F, '{print $2}') MODE=${MODE%%n*} [ -n "$MODE" ] || MODE=9600 # default mode einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps" @@ -559,7 +618,7 @@ config_local_net(){ # so let's create raw1394 device manually # http://www.michael-prokop.at/blog/index.php?p=352 config_firewire_dev(){ -if checkbootparam "nofirewiredev" ; then +if checkbootparam 'nofirewiredev' ; then ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0 else #if [ "${KERNEL%-*}" == "2.6.11" ] ; then @@ -588,28 +647,35 @@ config_fix_passwd(){ # {{{ CD Checker config_testcd(){ if [ -n "$TESTCD" ]; then - einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option." - einfo "Reading files and checking against GRML/md5sums, this may take a while..." - echo -n "${RED}" - ( cd /cdrom/GRML/ ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ) - if [ "$?" = "0" ]; then - echo " ${GREEN}Everything looks OK${NORMAL}" - else - echo "${RED} *** CHECKSUM FAILED FOR THESE FILES: ***" - egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log - echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}" - echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM. ***${NORMAL}" - echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL} " - read a - fi - eend 0 + einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option." + einfo "Reading files and checking against GRML/md5sums, this may take a while..." + echo -n "${RED}" + + if [ -n "${LIVECD_PATH}"/GRML ] ; then + ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? ) + else + echo "${RED} *** Error: Could not find md5sum file. ***" + fi + + if [ "$RC" = "0" ]; then + einfo "Everything looks OK" ; eend 0 + else + eerror 'Checksum failed for theses files:' ; eend 1 + egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log + eerror 'Data on the grml medium is possibly incomplete/damaged or...' + eerror '... RAM of your computer is broken.' ; eend 1 + einfon "Hit return to continue, or press the reset button to quit." + read a + fi + + eend 0 fi } # }}} # {{{ hardware detection via discover config_discover(){ -if checkbootparam "nodisc" ; then +if checkbootparam 'nodisc' ; then ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0 else if [ -x /sbin/discover ] ; then @@ -628,7 +694,7 @@ fi # {{{ hardware detection via hwinfo config_hwinfo(){ -if checkbootparam hwinfo >>$DEBUG 2>&1; then +if checkbootparam 'hwinfo' >>$DEBUG 2>&1; then einfo "Discovering hardware via hwinfo:" MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//') echo -n " Loading modules: " @@ -640,7 +706,7 @@ fi # {{{ disable hotplug agents on request config_hotplug_agent(){ -if checkbootparam "noagent" ; then +if checkbootparam 'noagent' ; then AGENT="$(getbootparam 'noagent' 2>>$DEBUG)" AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g') AGENTNL=$(echo "$AGENT" | sed 's/,/ /g') @@ -655,7 +721,7 @@ fi # {{{ blacklist of hotplug-modules config_hotplug_blacklist(){ -if checkbootparam "black" ; then +if checkbootparam 'black' ; then BLACK="$(getbootparam 'black' 2>>$DEBUG)" BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g') BLACKNL=$(echo "$BLACK" | sed 's/,/ /g') @@ -669,7 +735,7 @@ fi # {{{ run hotplug config_hotplug(){ -if checkbootparam "nohotplug" ; then +if checkbootparam 'nohotplug' ; then ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0 else if [ -r /etc/init.d/hotplug ] ; then @@ -689,23 +755,26 @@ fi # {{{ blacklist specific module [ used in /etc/init.d/udev ] config_blacklist(){ -if checkbootparam "blacklist" ; then +if checkbootparam 'blacklist' ; then if [ -z "$INSTALLED" ]; then einfo "Bootoption blacklist found." BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)" + BLACKLIST_FILE='/etc/modprobe.d/grml.conf' if [ -n "$BLACK" ] ; then - einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml." - echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml - echo "blacklist $BLACK" >> /etc/modprobe.d/grml - echo "alias $BLACK off" >> /etc/modprobe.d/grml - echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $? + for module in $(echo ${BLACK//,/ }) ; do + einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}." + echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" + echo "blacklist $module" >> "$BLACKLIST_FILE" + echo "alias $module off" >> "$BLACKLIST_FILE" + echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $? + done else - eerror "No given module for blacklist found. Blacklisting will not work therefor." + eerror "No given module for blacklist found. Blacklisting will not work therefore." fi else - ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1 + ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1 eindent - einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist." + einfo "Please blacklist the module(s) manually using the 'blacklist' script." eoutdent fi fi @@ -715,10 +784,12 @@ fi # {{{ ACPI config_acpi_apm(){ if [ -d /proc/acpi ]; then - if checkbootparam "noacpi"; then - ewarn "Skipping ACPI Bios detection as requested on boot commandline." ; eend 0 + if checkbootparam 'noacpi'; then + ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0 + elif checkbootparam 'nogrmlacpi' ; then + ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0 else - einfo "ACPI Bios found, activating modules: " + einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): " eindent found="" for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do @@ -735,10 +806,10 @@ if [ -d /proc/acpi ]; then else ewarn "(none)" ; eend 1 fi - if ! [ -S /var/run/acpid.socket ] ; then + if ! ps x | grep -q /usr/sbin/acpid ; then if ! [ -r /var/run/dbus/pid ] ; then einfo "Starting acpi daemon." - /etc/init.d/acpid start >>$DEBUG ; eend $? + /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $? else eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus." eerror "Solution: please activate acpid via /etc/runlevel.conf" @@ -752,7 +823,7 @@ if [ -d /proc/acpi ]; then fi else # APM - if checkbootparam "noapm"; then + if checkbootparam 'noapm'; then ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0 else modprobe apm power_off=1 >>$DEBUG 2>&1 @@ -772,7 +843,7 @@ fi # {{{ PCMCIA Check/Setup # This needs to be done before other modules are being loaded (by hwsetup) config_pcmcia(){ -if checkbootparam "nopcmcia"; then +if checkbootparam 'nopcmcia'; then ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0 else if /usr/sbin/laptop-detect ; then @@ -798,35 +869,100 @@ fi # {{{ run software synthesizer via speakup config_swspeak(){ -if checkbootparam swspeak ; then - if [ -d /proc/speakup/ ] ; then - einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0 - eindent - if [ -x /etc/init.d/speech-dispatcher ] ; then - einfo "Starting speech-dispatcher." - /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $? - einfo "Activating sftsyn in Kernel." - echo sftsyn >/proc/speakup/synth_name ; eend $? - einfo "Just run swspeak if you want to use software synthesizer via speakup." - flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished." - else - eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1 - flite -o play -t "speech-dispatcher not available. speakup will not work without it." + if checkbootparam 'swspeak' ; then + einfo "Bootoption swspeak found." + + if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then + ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0 + eindent + einfo "Loading speakup_soft" + if modprobe speakup_soft ; then + eend 0 + else + flitewrapper "Fatal error setting up software speakup" + eend 1 + return 1 + fi + eoutdent + fi + + if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then + einfo "Kernel supports speakup." ; eend 0 + eindent + einfo "Just run swspeak if you want to use software synthesizer via speakup." + flitewrapper "Finished activating software speakup. Just run swspeak when booting finished." + eoutdent + else + eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1 + flitewrapper "Kernel does not seem to support speakup. Sorry." + fi + fi +} +# }}} + +# {{{ support hardware synthesizer via speakup +config_hwspeak(){ + if checkbootparam 'speakup.synth' ; then + einfo "Bootoption speakup.synth found." + eindent + + module="$(getbootparam 'speakup.synth' 2>>$DEBUG)" + if [ -z "$module" ] ; then + eerror "Sorry, no speakup module specified for bootoption speakup.synth." + flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth." + else + einfo "Trying to load $module" + modprobe "speakup_${module}" + eend $? + fi + + if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then + einfo "Kernel should support speakup now." ; eend 0 + flitewrapper "Kernel should support speakup now." + else + eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1 + flitewrapper "Kernel or hardware do not seem to support speakup. Sorry." + fi + + eoutdent + + # hwspeak: + elif checkbootparam 'hwspeak' ; then + einfo "Bootoption hwspeak found." + + if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then + ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0 + eindent + if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then + eerror "Kernel does not provide speakup modules, sorry." ; eend 1 + else + for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \ + sed 's#.*speakup/##g ; s#.ko$##g' | \ + grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do + einfo "Trying to load $module" + modprobe $module + eend $? + done + fi + eoutdent + fi + + if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then + einfo "Kernel should support speakup now." ; eend 0 + flitewrapper "Kernel should support speakup now." + else + eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1 + flitewrapper "Kernel or hardware do not seem to support speakup. Sorry." + fi fi - eoutdent - else - eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1 - flite -o play -t "Kernel does not seem to support speakup. Sorry." - fi -fi } # }}} # {{{ Check for blind option or brltty config_blind(){ BLIND="" -checkbootparam "blind" && BLIND="yes" -BRLTTY="$(getbootparam brltty 2>>$DEBUG)" +checkbootparam 'blind' && BLIND="yes" +BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)" if [ -n "$BLIND" -o -n "$BRLTTY" ]; then if [ -x /sbin/brltty ]; then @@ -866,39 +1002,23 @@ fi # {{{ Interactive configuration config_interactive(){ -if [ -n "$INTERACTIVE" ] ; then -einfo "Entering interactive configuration second stage." - - echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}" - echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] " - read a - [ "$a" != "n" ] && /usr/sbin/dpkg-reconfigure console-data ; eend $? - - echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] " - read a - [ "$a" != "n" ] && alsaconf && ( exec aumix -m 0 >>$DEBUG 2>&1 & ) ; eend $? - - echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] " - read a - [ "$a" != "n" ] && xorgcfg -textmode ; eend $? - echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}" -fi -eend 0 + ewarn "config_interactive is deprecated nowadays." + ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0 } # }}} # {{{ AGP config_agp(){ -if checkbootparam forceagp ; then +if checkbootparam 'forceagp' ; then # Probe for AGP. Hope this can fail safely - stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0 + grep -q "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0 fi } # }}} # {{{ automount(er) config_automounter(){ -if checkbootparam automounter ; then +if checkbootparam 'automounter' ; then RUNLEVEL="$(runlevel)" AUTOMOUNTER="" [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes" @@ -911,14 +1031,14 @@ addautomount(){ [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d" [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d" anew="$d -fstype=auto,$2 :$i" - stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt + grep -q "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt AUTOMOUNTS="$AUTOMOUNTS $d" new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0" else [ -d /mnt/$d ] && mkdir -p /mnt/$d new="$1 /mnt/$d auto users,noauto,exec,$2 0 0" fi - stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab + grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab } AUTOMOUNTS="floppy cdrom" @@ -972,7 +1092,7 @@ check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only # {{{ Enable DMA for all IDE drives now if not disabled # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems config_dma(){ -if checkbootparam "nodma"; then +if checkbootparam 'nodma'; then ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0 else for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do @@ -994,12 +1114,12 @@ fi config_fstab(){ NOSWAP="yes" # we do not use swap by default! -if checkbootparam "swap" -o checkbootparam "anyswap" ; then +if checkbootparam 'swap' || checkbootparam 'anyswap' ; then NOSWAP='' - checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP="" + checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP="" fi -if checkbootparam "nofstab" -o checkbootparam "forensic" ; then +if checkbootparam 'nofstab' || checkbootparam 'forensic' ; then ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0 else einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)" @@ -1017,7 +1137,7 @@ if [ -z "$INSTALLED" ] ; then [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested." GRML_IMG="" GRML_SWP="" - HOMEDIR="$(getbootparam home)" + HOMEDIR="$(getbootparam 'home')" if [ -n "$partitions" ]; then while read p m f relax; do case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac @@ -1083,7 +1203,7 @@ if [ -z "$INSTALLED" ] ; then einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}." eoutdent fnew="$SWAPFILE swap swap defaults 0 0" - stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab + grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab GRML_SWP="$GRML_SWP $SWAPFILE" eend 0 fi @@ -1127,7 +1247,7 @@ fi # {{{ IPv6 configuration # Load IPv6 kernel module and print IP adresses config_ipv6(){ -if checkbootparam "ipv6"; then +if checkbootparam 'ipv6'; then einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)" modprobe ipv6 # we probably need some time until stateless autoconfiguration has happened @@ -1155,7 +1275,7 @@ fi # {{{ Fat-Client-Version: DHCP Broadcast for IP address config_dhcp(){ -if checkbootparam "nodhcp"; then +if checkbootparam 'nodhcp'; then ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0 else NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)" @@ -1164,11 +1284,15 @@ else einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)" trap 2 3 11 ifconfig $DEVICE up >>$DEBUG 2>&1 - ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) & + ( pump -i $DEVICE --script=/usr/lib/grml-autoconfig/pump-runparts >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) & trap "" 2 3 11 sleep 1 eend 0 done + if [ -n "$INSTALLED" ] ; then + ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.' + eend 0 + fi fi } # }}} @@ -1228,15 +1352,17 @@ return 1 # {{{ CPU-detection config_cpu(){ -if checkbootparam "nocpu"; then +if checkbootparam 'nocpu'; then ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0 else # check module dependencies cpufreq_check() { - if [ -e /lib64 ] ; then - [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1 - else - [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1 + if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then + if [ -e /lib64 ] ; then + [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1 + else + [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1 + fi fi } @@ -1249,29 +1375,77 @@ else einfo "Detecting CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0 fi + # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use: + # * it only if we have the according kernel modules available + # * cpufreq not inside Virtual Box + # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync) + # -> parse output of the initscript and output it according to our look'n'feel + # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present if ! cpufreq_check ; then ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1 else - if /usr/sbin/laptop-detect ; then - einfo "Detected Laptop - trying to use cpu frequency scaling:" - if [ -r /usr/bin/cpufreq-detect.sh ] ; then - eindent - . /usr/bin/cpufreq-detect.sh - if [ -n "$MODULE" -a "$MODULE" != none ]; then - einfo "Loading modules ${MODULE} and cpufreq_ondemand, setting ondemand governor" - modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG - if modprobe cpufreq_ondemand && RC=0 || RC=1 ; then - for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do - echo ondemand > $file - done - fi - eend $RC - else - ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1 - fi - eoutdent - fi # cpufreq-detect - fi # laptop-detect + # Virtual Box supports ACPI and laptop-detect would return with '0', so check for it: + if [ -r /proc/acpi/battery/BAT0/info ] ; then + if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then + einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0 + return 0 + fi + fi + einfo "Trying to set up cpu frequency scaling:" + eindent + if [ -x /etc/init.d/loadcpufreq ] ; then + SKIP_CPU_GOVERNOR='' + LOADCPUFREQ=$(mktemp) + /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$? + if grep -q FATAL "$LOADCPUFREQ" ; then + eindent + SKIP_CPU_GOVERNOR=1 + oldIFS="$IFS" + IFS=" +" + for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do + eerror "$line" ; eend $RC + done + IFS="$oldIFS" + eoutdent + elif grep -q done "$LOADCPUFREQ" ; then + MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/') + if [ -n "$MODULE" -a "$MODULE" != none ]; then + einfo "Loading cpufreq kernel module $MODULE" ; eend 0 + else + ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1 + fi + fi + rm -f $LOADCPUFREQ + elif [ -r /usr/bin/cpufreq-detect.sh ] ; then + . /usr/bin/cpufreq-detect.sh + if [ -n "$MODULE" -a "$MODULE" != none ]; then + einfo "Loading modules ${MODULE}" + modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG + RC=$? + if [[ $RC == 0 ]]; then + eend 0 + else + SKIP_CPU_GOVERNOR=1 + eend $1 + fi + else + ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1 + fi # $MODULE + fi # loadcpufreq + + if [ -z "$SKIP_CPU_GOVERNOR" ] ; then + einfo "Loading cpufreq_ondemand, setting ondemand governor" + if modprobe cpufreq_ondemand ; RC=$? ; then + for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do + echo ondemand > $file + done + fi + eend $RC + fi # cpu-governor + + eoutdent + fi # cpufreq_check fi # checkbootparam nocpu } @@ -1279,28 +1453,109 @@ fi # checkbootparam nocpu # {{{ autostart of ssh config_ssh(){ -if checkbootparam ssh ; then - SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)" - einfo "Bootoption passwd found." - if [ -n "$SSH_PASSWD" ] ; then - echo "grml:$SSH_PASSWD" | chpasswd -m - einfo "Starting secure shell server in background." - /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG - /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG & - eend 0 - else - eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1 - fi - eindent - ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!" - eoutdent +if checkbootparam 'ssh' ; then + SSH_PASSWD='' + SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)" + einfo "Bootoption ssh found, trying to set password for user grml." + eindent + if [ -z "$SSH_PASSWD" ] ; then + if [ -x /usr/bin/apg ] ; then + SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)" + elif [ -x /usr/bin/gpw ] ; then + SSH_PASSWD="$(gpw 1)" + elif [ -x /usr/bin/pwgen ] ; then + SSH_PASSWD="$(pwgen -1 8)" + elif [ -x /usr/bin/hexdump ] ; then + SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')" + elif [ -n "$RANDOM" ] ; then + SSH_PASSWD="grml${RANDOM}" + else + SSH_PASSWD='' + eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping." + eend 1 + fi + + if [ -n "$SSH_PASSWD" ] ; then + ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0 + fi + fi + eoutdent + + # finally check if we have a password we can use: + if [ -n "$SSH_PASSWD" ] ; then + # chpasswd sucks, seriously. + if chpasswd --help 2>&1 | grep -q -- '-m,' ; then + echo "grml:$SSH_PASSWD" | chpasswd -m + else + echo "grml:$SSH_PASSWD" | chpasswd + fi + fi + + einfo 'Starting secure shell server in background.' + /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG + /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG & + eend $? + + eindent + ewarn 'Warning: please change the password for user grml as soon as possible!' + eoutdent +fi +} +# }}} + +# {{{ autostart of x11vnc +config_vnc(){ + +USER=grml # TODO: make it dynamically configurable +if checkbootparam 'vnc' ; then + VNC_PASSWD='' + VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)" + einfo "Bootoption vnc found, trying to set password for user $USER." + eindent + if [ -z "$VNC_PASSWD" ] ; then + if [ -x /usr/bin/apg ] ; then + VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)" + elif [ -x /usr/bin/gpw ] ; then + VNC_PASSWD="$(gpw 1)" + elif [ -x /usr/bin/pwgen ] ; then + VNC_PASSWD="$(pwgen -1 8)" + elif [ -x /usr/bin/hexdump ] ; then + VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')" + elif [ -n "$RANDOM" ] ; then + VNC_PASSWD="${USER}${RANDOM}" + else + VNC_PASSWD='' + eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping." + eend 1 + fi + + if [ -n "$VNC_PASSWD" ] ; then + ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0 + fi + fi + eoutdent + + # finally check if we have a password we can use: + if [ -n "$VNC_PASSWD" ] ; then + + VNCDIR="/home/${USER}/.vnc" + [ -d "$VNCDIR" ] || mkdir "$VNCDIR" + + if [ ! -x /usr/bin/x11vnc ] ; then + eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package." + eend 1 + else + /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $? + /bin/chown -R "$USER": "$VNCDIR" + fi + fi fi } # }}} # {{{ set password for user grml config_passwd(){ -if checkbootparam passwd >>$DEBUG 2>&1; then +if checkbootparam 'passwd' >>$DEBUG 2>&1; then einfo "Bootoption passwd found." PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)" if [ -n "$PASSWD" ] ; then @@ -1317,8 +1572,8 @@ fi # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file. config_homedir(){ -if checkbootparam home ; then - HOMEDIR="$(getbootparam home)" +if checkbootparam 'home' ; then + HOMEDIR="$(getbootparam 'home')" MYHOMEDEVICE="" MYHOMEMOUNTPOINT="" MYHOMEDIR="" @@ -1399,24 +1654,19 @@ fi # checkbootparam home } # }}} -# {{{ Check for scripts on CD-ROM -config_cdrom_scripts(){ -if checkbootparam "script"; then - for script in /cdrom/scripts/* ; do - einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}." - . $script - done -fi -} -# }}} - # {{{ Sound + config_mixer(){ -if ! [ -x /usr/bin/aumix ] ; then - eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1 +if ! [ -x /usr/bin/amixer ] ; then + eerror "amixer binary not available. Can not set sound volumes therefore." ; eend 1 else - if checkbootparam vol ; then + if ! [ -r /proc/asound/cards ] ; then + ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0 + return + fi + + if checkbootparam 'vol' ; then VOL="$(getbootparam 'vol' 2>>$DEBUG)" if [ -z "$VOL" ] ; then eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1 @@ -1426,16 +1676,14 @@ else VOL='75' # default fi - if checkbootparam nosound ; then + if checkbootparam 'nosound' ; then einfo "Muting sound devices on request." - # some IBM notebooks require the following stuff: - if [ -x /usr/bin/amixer ] ; then - if amixer get Front 1>/dev/null 2>>$DEBUG ; then - amixer set Front unmute 1>/dev/null - amixer set Front 0% 1>/dev/null - fi - fi - ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$? + + fix_ibm_sound 0 + # mute the master, this should be sufficient + ERROR=$(amixer -q set Master mute) + RC=$? + if [ -n "$ERROR" ] ; then eindent eerror "Problem muting sound devices: $ERROR" @@ -1444,37 +1692,62 @@ else eend $RC elif [ -z "$INSTALLED" ]; then einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}." - # some IBM notebooks require the following stuff: - if [ -x /usr/bin/amixer ] ; then - if amixer get Front 1>/dev/null 2>>$DEBUG ; then - amixer set Front unmute 1>/dev/null - amixer set Front ${VOL}% 1>/dev/null - fi + + fix_ibm_sound ${VOL} + + # by default assume '0' as volume for microphone: + if checkbootparam 'micvol' ; then + MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)" + else + MICVOL=0 fi - ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$? - if [ -n "$ERROR" ] ; then - eindent - eerror "Problem setting mixer volumes: $ERROR" - eoutdent + + # finally set the volumes: + RC=0 + for CONTROL in Master PCM ; do + amixer -q set ${CONTROL} ${VOL}% + if [ $? -ne 0 ] ; then RC=$? ; fi + done + # dont know how to set microphone volume for all soundcards with amixer, + # so use aumix instead :/ + if [ ${MICVOL} -ne 0 -a -x /usr/bin/aumix ] ; then + aumix -m $MICVOL &>/dev/null + if [ $? -ne 0 ] ; then RC=$? ; fi fi + eend $RC fi fi } + +# on some IBM notebooks the front control has to be toggled +fix_ibm_sound() { + if [ -z $1 ] ; then + return + fi + + VOL=${1} + + if [ -x /usr/bin/amixer ] ; then + if amixer -q get Front 1>/dev/null 2>>$DEBUG ; then + amixer -q set Front unmute &>/dev/null + amixer -q set Front ${VOL}% &>/dev/null + fi + fi +} # }}} # {{{ modem detection config_modem(){ -if checkbootparam "nomodem"; then +if checkbootparam 'nomodem'; then ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0 else if [ -x /etc/init.d/sl-modem-daemon ] ; then - if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then - einfo "AC97 modem controller detected. Starting sl-modem-daemon in background." - /etc/init.d/sl-modem-daemon start >>$DEBUG & - eend 0 - fi + if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then + einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'." + eend 0 + fi fi fi } @@ -1482,7 +1755,7 @@ fi # {{{ keyboard add-ons config_setkeycodes(){ -if checkbootparam "setkeycodes" ; then +if checkbootparam 'setkeycodes' ; then einfo "Setting keycodes as requested via bootparameter 'setkeycodes'." # MS MM keyboard add-on # fix @@ -1510,8 +1783,8 @@ fi # {{{ wondershaper config_wondershaper(){ - if checkbootparam "wondershaper" ; then - WONDER="$(getbootparam wondershaper 2>>$DEBUG)" + if checkbootparam 'wondershaper' ; then + WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)" CMD=wondershaper DEVICE="" DOWNSTREAM="" @@ -1542,33 +1815,48 @@ config_wondershaper(){ # {{{ syslog-ng config_syslog(){ - if checkbootparam "nosyslog"; then - ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0 + if checkbootparam 'nosyslog'; then + ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0 else - einfo "Starting syslog-ng in background." - /etc/init.d/syslog-ng start 1>>$DEBUG & - eend 0 + SYSLOGD='' + [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng' + [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog' + [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog' + [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd' + [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd' + + if [ -z "$SYSLOGD" ] ; then + eerror "No syslog daemon found." ; eend 1 + else + einfo "Starting $SYSLOGD in background." + /etc/init.d/$SYSLOGD start 1>>$DEBUG & + eend 0 + fi fi } # }}} # {{{ gpm config_gpm(){ - if checkbootparam "nogpm"; then + if checkbootparam 'nogpm'; then ewarn "Not starting GPM as requested on boot commandline." ; eend 0 else - einfo "Starting gpm in background." -# /etc/init.d/gpm start 1>>$DEBUG & - ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) & - eend 0 + if ! [ -r /dev/input/mice ] ; then + eerror "No mouse found - not starting GPM." ; eend 1 + else + einfo "Starting gpm in background." + /etc/init.d/gpm start 1>>$DEBUG & + # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) & + eend 0 + fi fi } # }}} # {{{ services config_services(){ - if checkbootparam "services" ; then - SERVICE="$(getbootparam services 2>>$DEBUG)" + if checkbootparam 'services' ; then + SERVICE="$(getbootparam 'services' 2>>$DEBUG)" SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g') SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g') einfo "Starting service(s) ${SERVICENL} in background." @@ -1580,48 +1868,76 @@ config_services(){ } # }}} -# {{{ config files -config_netconfig(){ - if checkbootparam netconfig ; then - CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)" - CONFIGFILE='/tmp/netconfig.grml' - +# {{{ remote files +get_remote_file() { + [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 ) + SOURCE=$(eval echo "$1") + TARGET="$2" getconfig() { - wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \ - --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1 + wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \ + --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1 } - einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}" + einfo "Trying to get ${WHITE}${TARGET}${NORMAL}" counter=10 while ! getconfig && [[ "$counter" != 0 ]] ; do - echo -n "Sleeping for 5 seconds and trying to get config again... " + echo -n "Sleeping for 1 second and trying to get config again... " counter=$(( counter-1 )) echo "$counter tries left" ; sleep 1 done - if [ -r "$CONFIGFILE" ] ; then + if [ -s "$TARGET" ] ; then einfo "Downloading was successfull." ; eend 0 - einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: " - md5sum $CONFIGFILE ; eend 0 - cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $? + einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: " + md5sum ${TARGET} ; eend 0 + return 0; else - einfo "Sorry, could not fetch $CONFIG" ; eend 1 + einfo "Sorry, could not fetch ${SOURCE}" ; eend 1 + return 1; + fi +} +# }}} + +# {{{ config files +config_netconfig(){ + if checkbootparam 'netconfig' ; then + CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)" + CONFIGFILE='/tmp/netconfig.grml' + + if get_remote_file ${CONFIG} ${CONFIGFILE} ; then + cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $? + fi + + fi +} +# }}} + +# {{{ remote scripts +config_netscript() { + if checkbootparam 'netscript' ; then + CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)" + SCRIPTFILE='/tmp/netscript.grml' + + if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then + chmod +x ${SCRIPTFILE} + einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && ${SCRIPTFILE} ; eend $? fi + fi } # }}} # {{{ blindsound config_blindsound(){ - if checkbootparam "blind" ; then + if checkbootparam 'blind' ; then beep - flite -o play -t "welcome to the gremel system" + flitewrapper "welcome to the gremel system" fi } # }}} # {{{ welcome sound config_welcome(){ - if checkbootparam welcome ; then - flite -o play -t "welcome to the gremel system" + if checkbootparam 'welcome' ; then + flitewrapper "welcome to the gremel system" fi } # }}} @@ -1643,8 +1959,10 @@ create_mnt_dirs(){ # {{{ start X window system via grml-x config_x_startup(){ -if checkbootparam startx ; then - if [ -x /usr/X11R6/bin/X ] ; then +# make sure we start X only if startx is used *before* a nostartx option +# so it's possible to disable automatic X startup using nostart +if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then + if [ -x $(which X) ] ; then if [ -z "$INSTALLED" ] ; then WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)" if [ -z "$WINDOWMANAGER" ] ; then @@ -1678,12 +1996,12 @@ EOF fi else - eerror "We are not running from CD - startx will not work, skipping it. - Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1 + eerror "We are not running in live mode - startx will not work, skipping it." + eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1 fi else - eerror "/usr/X11R6/bin/X is not present on this grml flavour. - Boot parameter startx does not work therefore." ; eend 1 + eerror "/usr/X11R6/bin/X is not present on this grml flavour." + eerror " -> Boot parameter startx does not work therefore." ; eend 1 fi fi } @@ -1691,111 +2009,85 @@ fi # {{{ configuration framework config_extract(){ -if checkbootparam extract ; then +if checkbootparam 'extract' ; then EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)" EXTRACTOPTIONS="-- -x $EXTRACT" fi } -config_automount(){ -if checkbootparam noautoconfig -o checkbootparam forensic ; then +config_finddcsdir() { +# - If no GRMLCFG partition is found and noautoconfig is _not_ given +# on the command line, nothing is changed and the dcs files are +# searched within the .iso, $dcs-dir is set to the root directory +# within the .iso +# - If a GRMLCFG partition is found, $dcs-dir is set to the root of +# the GRMLCFG partition unless noautoconfig is set. If noautoconfig is +# set, $dcs-dir is set to the root directory within the .iso. +# - If myconfig=foo is set on the command line, $dcs-dir is set to +# foo, even if a GRMLCFG partition is present. +DCSDIR="" +DCSMP="/mnt/grml" +if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0 else - if [ -z "$INSTALLED" ] ; then - einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0 - eindent - [ -d /mnt/grml ] || mkdir /mnt/grml - umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted -# We do need the following fix so floppy disk is available to blkid in any case :-/ - if [ -r /dev/fd0 ] ; then - einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)" -# dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 - if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then - blkid /dev/fd0 1>>$DEBUG 2>&1 - fi - fi - DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}') - [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?" - if [[ $RC == 0 ]]; then - einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0 - - CONFIG='' - CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)" - if [ -n "$CONFIG" ]; then - einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it." - cd / - unp $CONFIG $EXTRACTOPTIONS ; eend $? - else - ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1 + if [ -z "$INSTALLED" ] ; then + if checkbootparam 'myconfig' ; then + DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)" + if [ -z "$DCSDEVICE" ]; then + eerror "Error: No device for bootoption myconfig provided." ; eend 1 + fi # [ -z "$DCSDEVICE" ] + elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig + einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0 + eindent + # We do need the following fix so floppy disk is available to blkid in any case :-/ + if [ -r /dev/fd0 ] ; then + einfo "Floppy device detected. Trying to access floppy disk." + if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then + blkid /dev/fd0 1>>$DEBUG 2>&1 + fi + fi + DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}') + if [ -n "$DCSDEVICE" ]; then + DCSMP="/mnt/grmlcfg" + fi + eoutdent fi - SCRIPT='' - SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)" - if [ -n "$SCRIPT" ]; then - einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it." - $SCRIPT ; eend $? + # if not specified/present then assume default: + if [ -z "$DCSDEVICE" ]; then + DCSDIR="/live/image" + else + eindent + einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0 + DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')" + if [ -n "$DCSDIR" ]; then + ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0 + else + [ -d $DCSMP ] || mkdir $DCSMP + umount $DCSMP 1>>$DEBUG 2>&1 # make sure it is not mounted + mount -o ro -t auto $DCSDEVICE $DCSMP ; RC="$?" + if [[ $RC == 0 ]]; then + einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0 + else + eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1 + fi + DCSDIR="$DCSMP" + fi + eoutdent fi - grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml - else - ewarn "No devices with label GRMLCFG found." ; eend 0 fi - eoutdent - fi fi -} -config_myconfig(){ - -if checkbootparam "config" ; then - CONFIG="$(getbootparam 'config' 2>>$DEBUG)" - [ -z "$CONFIG" ] && CONFIG='config.tbz' - einfo "Bootoption config found. config is set to: $CONFIG" - eindent - einfo "Trying to extract configuration file ${CONFIG}:" - cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $? - eoutdent +if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then + einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0 +elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then + einfo "Debs, config, scripts will be read from the live image directly." ; eend 0 fi +} -if checkbootparam myconfig ; then - MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)" - if [ -n "$MOUNTDEVICE" ]; then - if checkbootparam file ; then - FILENAME="$(getbootparam 'file' 2>>$DEBUG)" - [ -n "$FILENAME" ] || FILENAME='config.tbz' - fi - [ -d /mnt/grml ] || mkdir /mnt/grml - umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted - mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?" - if [[ $RC == 0 ]]; then - einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0 - eindent - CONFIG='' - CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)" - if [ -n "$CONFIG" ]; then - einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it." - cd / - unp $CONFIG $EXTRACTOPTIONS ; eend $? - else - ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1 - fi - - SCRIPT='' - SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)" - if [ -n "$SCRIPT" ]; then - einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it." - $SCRIPT ; eend $? - fi - eoutdent - else - einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1 - fi # mount $MOUNTDEVICE - grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml - else - einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1 - fi # [ -n "$MOUNTDEVICE" ] -fi # checkbootparam myconfig -if checkbootparam "partconf" ; then +config_partconf() { +if checkbootparam 'partconf' ; then MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)" if [ -n "$MOUNTDEVICE" ]; then [ -d /mnt/grml ] || mkdir /mnt/grml @@ -1820,27 +2112,101 @@ fi # {{{ /cdrom/.*-options config_debs(){ -if checkbootparam "debs" ; then - DEBS="$(getbootparam 'debs' 2>>$DEBUG)" - einfo "Tring to install debian package(s) ${DEBS}" - dpkg -i /cdrom/debs/$DEBS* ; eend $? +if checkbootparam 'debs' ; then + DEBS="$(getbootparam 'debs' 2>>$DEBUG)" + if ! echo $DEBS | grep -q '/'; then + # backwards compatibility: if no path is given get debs from debs/ + DEBS="debs/$DEBS" + fi + einfo "Tring to install debian package(s) ${DEBS}" + DEBS="$(eval echo ${DCSDIR}/$DEBS)" + dpkg -i $DEBS ; eend $? fi } config_scripts(){ -if checkbootparam "scripts" ; then - SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)" - [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh' - einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:" - sh -c /cdrom/scripts/$SCRIPTS ; eend $? +if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then + SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)" + if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then + SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)" + fi + if ! echo $SCRIPTS | grep -q '/'; then + # backwards compatibility: if no path is given get scripts from scripts/ + SCRIPTS="scripts/$SCRIPTS" + fi + if [ "$DCSMP" = "/mnt/grmlcfg" ]; then + # we are executing from a GRMLCFG labeled fs + # kick everything we have done before and start over + SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)" + fi + if [ -n "$SCRIPTS" ]; then + SCRIPTS="${DCSDIR}/$SCRIPTS" + if [ "$DCSMP" = "/mnt/grmlcfg" ]; then + einfo "Trying to execute ${SCRIPTS}" + sh -c $SCRIPTS + elif [ -d "$SCRIPTS" ]; then + einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:" + run-parts $SCRIPTS + else + einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:" + sh -c $SCRIPTS + fi + fi +fi +} + +config_config(){ +if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then + CONFIG="$(getbootparam 'config' 2>>$DEBUG)" + if [ -z "$CONFIG" ]; then + CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)" + fi + if [ -n "$CONFIG" ]; then + if [ -d "${DCSDIR}/${CONFIG}" ] ; then + einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}" + + cp -a ${DCSDIR}/${CONFIG}/* / + elif [ -f "${DCSDIR}/${CONFIG}" ]; then + einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}" + + cd / + unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $? + else + ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1 + fi + fi +fi +# umount $DCSMP if it was mounted by finddcsdir +# this doesn't really belong here +grep -q '$DCSMP' /proc/mounts && umount $DCSMP +} +# }}} + +# {{{ mypath +config_mypath(){ +if checkbootparam 'mypath' ; then + MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)" + einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path" + touch /etc/grml/my_path + chmod 644 /etc/grml/my_path + # make sure the directories exist: + eindent + for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do + if ! [ -d "$i" ] ; then + einfo "Creating directory $i" + mkdir -p "$i" ; eend $? + fi + done + grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $? + eoutdent fi } # }}} # {{{ distcc config_distcc(){ -if checkbootparam "distcc" ; then - OPTIONS="$(getbootparam distcc 2>>$DEBUG)" +if checkbootparam 'distcc' ; then + OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)" if [ -n "$OPTIONS" ]; then NET="" INTERFACE="" @@ -1889,8 +2255,8 @@ if checkbootparam "distcc" ; then fi fi -if checkbootparam "gcc"; then - GCC="$(getbootparam gcc 2>>$DEBUG)" +if checkbootparam 'gcc'; then + GCC="$(getbootparam 'gcc' 2>>$DEBUG)" eindent einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}." eoutdent @@ -1898,8 +2264,8 @@ if checkbootparam "gcc"; then ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $? fi -if checkbootparam "gpp"; then - GPP="$(getbootparam gpp 2>>$DEBUG)" +if checkbootparam 'gpp'; then + GPP="$(getbootparam 'gpp' 2>>$DEBUG)" eindent einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}." if [ -x /usr/bin/g++-${GPP} ] ; then @@ -1923,7 +2289,7 @@ fi # in /etc/runlevel.conf config_modules(){ MODULES_FILE=/etc/grml/modules -if checkbootparam nomodules ; then +if checkbootparam 'nomodules' ; then ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0 elif [ -z "$INSTALLED" ]; then if [ -r $MODULES_FILE ] ; then @@ -1945,8 +2311,8 @@ fi # {{{ 915resolution config_915resolution(){ -if checkbootparam "915resolution" ; then - OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)" +if checkbootparam '915resolution' ; then + OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)" if [ -x /usr/sbin/915resolution ]; then CMD=915resolution MODE="" @@ -1977,10 +2343,11 @@ fi # {{{ SW-RAID config_swraid(){ - if [ -z "$INSTALLED" ] ; then + [ -n "$INSTALLED" ] && return 0 + # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption - if checkbootparam 'noraid' -o checkbootparam 'noswraid' -o \ - checkbootparam 'forensic' -o checkbootparam 'raid=noautodetect' ; then + if checkbootparam 'noraid' || checkbootparam 'noswraid' || \ + checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0 else if ! [ -x /sbin/mdadm ] ; then @@ -2040,13 +2407,105 @@ config_swraid(){ fi # is /sbin/mdadm executable? fi # check for bootoptions - fi # run only in live-cd mode +} +# }}} + +# {{{ dmraid +config_dmraid(){ + [ -n "$INSTALLED" ] && return 0 + + if checkbootparam 'nodmraid' ; then + ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0 + return 0 + fi + + if ! [ -x /sbin/dmraid ] ; then + eerror "dmraid not available, can not execute it." ; eend 1 + return + fi + + dmraid_wrapper() { + # usage: dmraid_wrapper + [ -n "$1" ] || return 1 + + IFSOLD=${IFS:-} + IFS=' +' + eindent + + for line in $(dmraid $1 ; echo errcode:$?); do + case $line in + *'no raid disks'*) + einfo "No active dmraid devices found" ; eend 0 + break + ;; + errcode:0) + eend 0; + ;; + errcode:1) + eend 1 + ;; + *) + einfo "$line" + ;; + esac + done + + eoutdent + IFS=$IFSOLD + } + + if checkbootparam 'dmraid' ; then + local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)" + if [ "$ACTION" = "off" ] ; then + # Deactivates all active software RAID sets: + einfo "Deactivating present dmraid sets (as requested via dmraid=off):" + dmraid_wrapper -an + else + # Activate all software RAID sets discovered: + einfo "Activating present dmraid sets (as requested via dmraid):" + dmraid_wrapper -ay + fi + + return + fi + + # by default (no special bootoptions) discover all software RAID devices: + einfo "Searching for any present dmraid sets:" + dmraid_wrapper -r +} +# }}} + +# {{{ LVM (Logical Volumes) +config_lvm(){ + [ -n "$INSTALLED" ] && return 0 + + if checkbootparam 'nolvm' ; then + ewarn "Skipping LVM code as requested on boot commandline." ; eend 0 + else + # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2 + if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then + eerror "LVM not available, can not execute it." ; eend 1 + else + if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then + einfo "You seem to have logical volumes (LVM) on your system." + eindent + einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart." + eend 0 + if checkbootparam 'lvm' ; then + einfo "Bootoption LVM found. Searching for logical volumes:" + /etc/init.d/lvm2 start ; eend $? + fi + eoutdent + fi + fi # check for lvm binary + fi # check for bootoption nolvm } # }}} # {{{ debnet: setup network based on an existing one found on a partition config_debnet(){ -if checkbootparam "debnet" ; then +if checkbootparam 'debnet' ; then iszsh && setopt shwordsplit DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")" DEVICES="$DEVICES $(ls /dev/mapper/*)" @@ -2078,7 +2537,7 @@ if checkbootparam "debnet" ; then mkdir /etc/network/run umount /mnt ; eend $? einfo "Starting network." - /etc/init.d/networking start ; eend $? + invoke-rc.d networking start ; eend $? else eerror "/etc/network/interfaces not found." ; eend 1 fi @@ -2090,33 +2549,87 @@ fi } # }}} +# {{{ check for broken ipw3945 driver which causes problems (especially on hd install) +config_ipw3945() { + if grep -q ipw3945 /proc/modules ; then + if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then + ewarn "Broken ipw3945 network interface found, reloading module." + rmmod ipw3945 + modprobe ipw3945 + eend $? + fi + fi +} +# }}} + # {{{ disable console blanking config_blanking(){ -if checkbootparam "noblank" ; then +if checkbootparam 'noblank' ; then einfo "Bootoption noblank found. Disabling monitor blanking." setterm -blank 0 ; eend $? fi } # }}} +# {{{ tohd= bootoption +config_tohd() +{ + if checkbootparam 'tohd' ; then + local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)" + if [ -z "$TARGET" ] ; then + eerror "Error: tohd specified without any partition, can not continue." ; eend 1 + eerror "Please use something like tohd=/dev/sda9." ; eend 1 + return 1 + fi + + if ! [ -b "$TARGET" ] ; then + eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1 + return 1 + fi + + if grep -q $TARGET /proc/mounts ; then + eerror "$TARGET already mounted, skipping execution of tohd therefore." + eend 1 + return 1 + fi + + local MOUNTDIR=$(mktemp -d) + + if mount -o rw "$TARGET" "$MOUNTDIR" ; then + einfo "Copyring live system to $TARGET - this might take a while" + rsync -a --progress /live/image/live $MOUNTDIR + sync + umount "$MOUNTDIR" + eend $? + einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0 + else + eerror "Error when trying to mount $TARGET, sorry."; eend 1 + return 1 + fi + + rmdir "$MOUNTDIR" + fi +} +# }}} + # {{{ grml2hd: automatic installation config_grml2hd(){ -if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then +if checkbootparam "BOOT_IMAGE=grml2hd" ; then -if checkbootparam "user" ; then +if checkbootparam 'user' ; then NEWUSER='' NEWUSER="$(getbootparam 'user' 2>>$DEBUG)" sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1 fi -if checkbootparam "filesystem" ; then +if checkbootparam 'filesystem' ; then FILESYSTEM='' FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)" sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1 fi -if checkbootparam "partition" ; then +if checkbootparam 'partition' ; then PARTITION='' PARTITION="$(getbootparam 'partition' 2>>$DEBUG)" # notice: the following checks whether the given partition is available, if not the skip @@ -2128,7 +2641,7 @@ if checkbootparam "partition" ; then fi fi -if checkbootparam "mbr" ; then +if checkbootparam 'mbr' ; then BOOT_PARTITION='' BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)" sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 @@ -2147,14 +2660,14 @@ else ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1 fi -fi # if stringinstring "BOOT_IMAGE=grml2hd ... +fi # if checkbootparam "BOOT_IMAGE=grml2hd ... } # }}} # {{{ debootstrap: automatic installation config_debootstrap(){ -if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then +if checkbootparam "BOOT_IMAGE=debian2hd" ; then einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0 @@ -2165,7 +2678,7 @@ if ! [ -x /usr/sbin/grml-debootstrap ] ; then exit 1 fi -if checkbootparam "target" ; then +if checkbootparam 'target' ; then TARGET='' TARGET="$(getbootparam 'target' 2>>$DEBUG)" # notice: the following checks whether the given partition is available, if not the skip @@ -2180,32 +2693,32 @@ else exit 1 fi -if checkbootparam "grub" ; then +if checkbootparam 'grub' ; then GRUB='' GRUB="$(getbootparam 'grub' 2>>$DEBUG)" fi -if checkbootparam "groot" ; then +if checkbootparam 'groot' ; then GROOT='' GROOT="$(getbootparam 'groot' 2>>$DEBUG)" fi -if checkbootparam "release" ; then +if checkbootparam 'release' ; then RELEASE='' RELEASE="$(getbootparam 'release' 2>>$DEBUG)" fi -if checkbootparam "mirror" ; then +if checkbootparam 'mirror' ; then MIRROR='' MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)" fi -if checkbootparam "boot_append" ; then +if checkbootparam 'boot_append' ; then BOOT_APPEND='' BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)" fi -if checkbootparam "password" ; then +if checkbootparam 'password' ; then PASSWORD='' PASSWORD="$(getbootparam 'password' 2>>$DEBUG)" fi @@ -2239,19 +2752,19 @@ screen /usr/bin/grml-debootstrap_noninteractive einfo "Invoking a shell, just exit to continue booting..." /bin/zsh -fi # stringinstring "BOOT_IMAGE=debian2hd +fi # checkbootparam "BOOT_IMAGE=debian2hd } # }}} # {{{ Support customization config_distri(){ -if checkbootparam "distri"; then +if checkbootparam 'distri'; then DISTRI="$(getbootparam 'distri' 2>>$DEBUG)" - if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then - [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0 + if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then + [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0 # make sure the desktop.jpg file is not a symlink, so copying does not file then [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg - cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg + cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg fi fi } @@ -2267,4 +2780,4 @@ config_keyboard(){ # }}} ## END OF FILE ################################################################# -# vim:foldmethod=marker +# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3