X-Git-Url: https://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=8761936d8a15572d6863ecacb4bbcbfc175fd913;hp=b3529ceed865eef1458625d78bfae89ccc024b15;hb=c7daf185362f47217661a1c137cc0f9583258473;hpb=bd549b3181a4f96e56c71a1bcaec04564d5aab0a diff --git a/autoconfig.functions b/autoconfig.functions index b3529ce..8761936 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -4,7 +4,6 @@ # Authors: grml-team (grml.org), (c) Klaus Knopper , (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Don Nov 15 22:01:50 CET 2007 [mika] ################################################################################ # {{{ path, variables, signals, umask, zsh @@ -13,6 +12,11 @@ DEBUG="/dev/null" KERNEL="$(uname -r)" 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 @@ -45,7 +49,7 @@ stringinstring(){ # Reread boot command line; echo last parameter's argument or return false. getbootparam(){ stringinstring " $1=" "$CMDLINE" || return 1 - result="${CMDLINE##*$1=}" + result="${CMDLINE##* $1=}" result="${result%%[ ]*}" echo "$result" return 0 @@ -72,6 +76,11 @@ checkgrmlsmall(){ 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 "$*" +} ### }}} # {{{ filesystems (proc, pts, sys) and fixes @@ -91,7 +100,7 @@ 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' ' ')" +[ -d "${LIVECD_PATH}"/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')" # }}} # {{{ Check if we are running from the grml-CD or HD @@ -116,26 +125,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" + stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && 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,16 +155,16 @@ 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 } # }}} @@ -192,12 +204,16 @@ config_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='us' 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 [ -n "$BOOT_LANGUAGE" -a -x /usr/sbin/grml-setlang ] ; then + if checkgrmlsmall ; then + /usr/sbin/grml-setlang "POSIX" + else + /usr/sbin/grml-setlang "$LANGUAGE" + fi fi # set console font @@ -283,15 +299,17 @@ config_language(){ 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 @@ -303,6 +321,7 @@ config_language(){ 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 @@ -341,26 +360,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 } # }}} @@ -392,12 +421,17 @@ if checkbootparam novmware ; then else if [ -z "$INSTALLED" ] ; then if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then - if ! checkbootparam qemu ; 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 @@ -432,23 +466,27 @@ 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 KTZ="$(getbootparam tz 2>>$DEBUG)" if [ -n "$KTZ" ] ; then - einfo "Setting timezone." - [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ" - rm -f /etc/localtime - cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $? + 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 } @@ -593,13 +631,8 @@ if [ -n "$TESTCD" ]; then einfo "Reading files and checking against GRML/md5sums, this may take a while..." echo -n "${RED}" - # /linuxrc grml version: - [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML - # live-initramfs version: - [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML - - if [ -n "$TESTCD_PATH" ] ; then - ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? ) + 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 @@ -707,18 +740,20 @@ if checkbootparam "blacklist" ; then einfo "Bootoption blacklist found." BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)" 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 /etc/modprobe.d/grml." + echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml + echo "blacklist $module" >> /etc/modprobe.d/grml + echo "alias $module off" >> /etc/modprobe.d/grml + echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $? + done else 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 @@ -813,27 +848,92 @@ 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 } # }}} @@ -1236,10 +1336,12 @@ if checkbootparam "nocpu"; then 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 } @@ -1333,20 +1435,51 @@ 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 + 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 } # }}} @@ -1455,10 +1588,10 @@ 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 + for script in "${LIVECD_PATH}"/scripts/* ; do + einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}." + . $script + done fi } # }}} @@ -1608,11 +1741,22 @@ config_wondershaper(){ # {{{ syslog-ng config_syslog(){ if checkbootparam "nosyslog"; then - ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0 + 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 } # }}} @@ -1622,10 +1766,14 @@ config_gpm(){ 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 } # }}} @@ -1678,7 +1826,7 @@ config_netconfig(){ config_blindsound(){ if checkbootparam "blind" ; then beep - flite -o play -t "welcome to the gremel system" + flitewrapper "welcome to the gremel system" fi } # }}} @@ -1686,7 +1834,7 @@ config_blindsound(){ # {{{ welcome sound config_welcome(){ if checkbootparam welcome ; then - flite -o play -t "welcome to the gremel system" + flitewrapper "welcome to the gremel system" fi } # }}} @@ -1762,50 +1910,72 @@ if checkbootparam extract ; then fi } +config_unpack(){ +MOUNTDEVICE="$1" +MESSAGE="$2" + +if [ ! -b "$MOUNTDEVICE" ] ; then + return; +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 $MESSAGE 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 checkbootparam config ; then + FILENAME="$(getbootparam 'config' 2>>$DEBUG)" + if [ -e /mnt/grml/"${FILENAME}" ] ; then + einfo "Using /mnt/grml/$FILENAME instead of config.tbz" + CONFIG="/mnt/grml/${FILENAME}" + fi + else + FILENAME="$(basename $CONFIG)" + fi + 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 ${FILENAME} on device ${MOUNTDEVICE} ${MESSAGE}." ; 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 + +} + config_automount(){ 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 + 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 + DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}') + config_unpack "$DEVICE" "labeled GRMCFG" 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 - 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 - grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml - else - ewarn "No devices with label GRMLCFG found." ; eend 0 - fi - eoutdent - fi fi } @@ -1817,44 +1987,14 @@ if checkbootparam "config" ; then einfo "Bootoption config found. config is set to: $CONFIG" eindent einfo "Trying to extract configuration file ${CONFIG}:" - cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $? + cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $? eoutdent 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 + config_unpack "$MOUNTDEVICE" else einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1 fi # [ -n "$MOUNTDEVICE" ] @@ -1886,18 +2026,39 @@ 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 $? + DEBS="$(getbootparam 'debs' 2>>$DEBUG)" + einfo "Tring to install debian package(s) ${DEBS}" + dpkg -i "${LIVECD_PATH}"/debs/$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 $? + SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)" + [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh' + einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:" + sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $? +fi +} +# }}} + +# {{{ 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 } # }}} @@ -2205,6 +2366,47 @@ 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(){ @@ -2353,11 +2555,11 @@ fi # stringinstring "BOOT_IMAGE=debian2hd config_distri(){ 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 }