X-Git-Url: https://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=fd699fc9d0db9445cf12105782491c3c73b0df86;hp=904bbdb539655df73554f231041d4fee53aa1812;hb=39eccfccd198ed1b2b1c6d29f9328b6dfbb8000b;hpb=80de8629cb3c1585c7b64247b9316c40cdb53593 diff --git a/autoconfig.functions b/autoconfig.functions index 904bbdb..fd699fc 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -49,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 @@ -76,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 @@ -199,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 @@ -351,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 } # }}} @@ -453,10 +472,21 @@ config_timezone(){ 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 } @@ -821,38 +851,29 @@ config_swspeak(){ if checkbootparam swspeak ; then einfo "Bootoption swspeak found." - if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then + 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 - flite -o play -t "Fatal error setting up software speakup" + flitewrapper "Fatal error setting up software speakup" eend 1 return 1 fi eoutdent fi - if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then + if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then einfo "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." - fi + 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 - flite -o play -t "Kernel does not seem to support speakup. Sorry." + flitewrapper "Kernel does not seem to support speakup. Sorry." fi fi } @@ -877,11 +898,11 @@ config_hwspeak(){ fi if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then - einfo "Kernel supports speakup now." ; eend 0 - flite -o play -t "Kernel supports speakup now." + 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 - flite -o play -t "Kernel or hardware do not seem to support speakup. Sorry." + flitewrapper "Kernel or hardware do not seem to support speakup. Sorry." fi fi } @@ -1771,7 +1792,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 } # }}} @@ -1779,7 +1800,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 } # }}} @@ -1855,50 +1876,70 @@ 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 + 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 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_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. (Disable this via boot option: noautoconfig)" ; 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." -# 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." + # 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}') + 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 } @@ -1917,37 +1958,7 @@ 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" ] @@ -2319,6 +2330,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(){