X-Git-Url: http://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=3fc02326e436094e74a9d7a53d79e6f74badf45d;hp=420cbfb7261f84d8257e94575d801f37964dd6ee;hb=14ce31b3b73c1ad6b448420d49ebb9d78c70d890;hpb=239898a767fa6222e8ad4f6354c586f8ee90b081 diff --git a/autoconfig.functions b/autoconfig.functions index 420cbfb..3fc0232 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -7,7 +7,7 @@ ################################################################################ # {{{ path, variables, signals, umask, zsh -export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin" +export PATH="/bin:/sbin:/usr/bin:/usr/sbin" DEBUG="/dev/null" KERNEL="$(uname -r)" ARCH="$(uname -m)" @@ -15,12 +15,36 @@ umask 022 # old linuxrc version: [ -d /cdrom ] && export LIVECD_PATH=/cdrom -# new initramfs layout: +# initramfs layout until around December 2012: [ -d /live/image ] && export LIVECD_PATH=/live/image +# initramfs layout since around December 2012: +[ -d /lib/live/mount/medium ] && export LIVECD_PATH=/lib/live/mount/medium # Ignore these signals in non-interactive mode: INT, TERM, SEGV [ -z "$PS1" ] && trap "" 2 3 11 +if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then + SYSTEMD=true +else + SYSTEMD=false +fi + +service_wrapper() { + if [ "$#" -lt 2 ] ; then + echo "Usage: service_wrapper " >&2 + return 1 + fi + + local service="$1" + local action="$2" + + if $SYSTEMD ; then + systemctl "$action" "$service" + else + /etc/init.d/"$service" "$action" + fi +} + # zsh stuff iszsh(){ if [ -n "$ZSH_VERSION" ] ; then @@ -38,8 +62,18 @@ 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' ' ')" + [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')" + modprobe 9p 2>/dev/null || true + if grep -q 9p /proc/filesystems ; then + TAG="grml-parameters" + if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then + MOUNTDIR="$(mktemp -d)" + mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR" + CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')" + umount "$MOUNTDIR" + rmdir "$MOUNTDIR" + fi + fi fi # }}} @@ -98,10 +132,28 @@ checkgrmlsmall(){ grep -q small /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 "$*" +# if no password is set return a random password +set_passwd() { + [ -n "$PASSWD" ] && return 0 + + if [ -x /usr/bin/apg ] ; then + PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)" + elif [ -x /usr/bin/gpw ] ; then + PASSWD="$(gpw 1)" + elif [ -x /usr/bin/pwgen ] ; then + PASSWD="$(pwgen -1 8)" + elif [ -x /usr/bin/hexdump ] ; then + PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')" + elif [ -n "$RANDOM" ] ; then + PASSWD="grml${RANDOM}" + else + PASSWD='' + eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping." + eend 1 + return 1 + fi } + ### }}} # {{{ filesystems (proc, pts, sys) and fixes @@ -121,10 +173,23 @@ mount_sys(){ # {{{ Check if we are running in live mode or from HD INSTALLED="" [ -e /etc/grml_cd ] || INSTALLED="yes" +# }}} + +# {{{ provide information about virtual environments +VIRTUAL=false # assume physical system by default +KVM=false +VIRTUALBOX=false +VMWARE=false -# testcd -TESTCD="" -checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes" +if vmware-detect &>/dev/null; then + VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware' +elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \ + [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then + VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM' +elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \ + [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then + VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox' +fi # }}} # {{{ source lsb-functions , color handling @@ -184,24 +249,6 @@ fi } # }}} -# {{{ set firmware timeout via bootparam -config_fwtimeout(){ - if checkbootparam 'fwtimeout' ; then - TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)" - einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module." - rmmod firmware_class >>$DEBUG 2>&1 - modprobe firmware_class ; eend $? - fi - if [ -z "$TIMEOUT" ] ; then - TIMEOUT="100" # linux kernel default: 10 - fi - if [ -f /sys/class/firmware/timeout ] ; then - einfo "Setting timeout for firmware loading to ${TIMEOUT}." - echo 100 > /sys/class/firmware/timeout ; eend $? - fi -} -# }}} - ### {{{ language configuration / localization config_language(){ @@ -223,10 +270,10 @@ config_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" + /usr/sbin/grml-setlang "$LANGUAGE" # otherwise default to lang=en else - checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en" + /usr/sbin/grml-setlang "en" fi fi @@ -245,12 +292,8 @@ config_language(){ fi # export it now, so error messages get translated, too - if checkgrmlsmall ; then - export LANG='C' # grml-small does not provide any further locales - else - [ -r /etc/default/locale ] && . /etc/default/locale - export LANG LANGUAGE - fi + [ -r /etc/default/locale ] && . /etc/default/locale + export LANG LANGUAGE # configure keyboard layout, read in already set values first: [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard @@ -373,33 +416,57 @@ config_language(){ # {{{ Set hostname config_hostname(){ - if checkbootparam 'hostname' ; then + if ! checkbootparam 'hostname' ; then + return 0 + fi + HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)" if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then - einfo "Generating random hostname as no hostname was specified." - HOSTNAME="$(/usr/bin/random-hostname)" - eend $? + einfo "Generating random hostname as no hostname was specified." + HOSTNAME="$(/usr/bin/random-hostname)" + eend $? fi + einfo "Setting hostname to $HOSTNAME as requested." - grml-hostname $HOSTNAME >>$DEBUG ; RC=$? - [ "$RC" = "0" ] && hostname $HOSTNAME - eend $RC - else - hostname --file /etc/hostname - fi + grml-hostname $HOSTNAME >>$DEBUG + eend $? } # }}} # fstabuser (needed when running from harddisk with username != grml {{{ config_userfstab(){ + # force load of build-in and local config [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig + [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local + + # 1st. try configured fstab user if [ -n "$CONFIG_FSTAB_USER" ] ; then - fstabuser="$CONFIG_FSTAB_USER" - else - fstabuser=$(getent passwd 1000 | cut -d: -f1) + fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1) fi - # if not yet set fall back to default 'grml' user - [ -n "$fstabuser" ] || fstabuser='grml' + + # 2nd. use standard user id + [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1) + + # 3rd. use standard user name + [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1) + + # if not yet set fall back to 'root' user, avoid bad /etc/fstab + [ -n "$fstabuser" ] || fstabuser='root' +} +# }}} + +# local_user (needed when running with username != grml {{{ +config_userlocal() { + + # force load of build-in and local config + [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig + [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local + + # 1st. try id of primary user + localuser=$(getent passwd 1000 | cut -d: -f1) + + # 2nd. use name standard user + [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1) } # }}} @@ -409,17 +476,27 @@ config_time(){ if [ -z "$INSTALLED" ]; then # 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" + + if [ -f /etc/default/rcS ] ; then + 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" + # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime + elif [ -f /etc/adjtime ] ; then + checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime + checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime + checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime + grep -q "^UTC$" /etc/adjtime && UTC="-u" + fi + # hwclock uses the TZ variable 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" + KTZ="UTC" ewarn "Falling back to timezone $KTZ" ; eend 0 fi @@ -443,76 +520,28 @@ config_time(){ # {{{ print kernel info config_kernel(){ - vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}" - [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel - einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0 + if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then + einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0 + else + einfo "Running Linux Kernel $KERNEL" ; eend 0 + fi + if [ -r /proc/cpuinfo ] ; then - if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then - eindent - einfo 'CPU(s) featuring virtualization technology detected' ; eend 0 - eoutdent - fi + if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then + eindent + einfo 'CPU(s) featuring virtualization technology detected' ; eend 0 + eoutdent + fi fi + if [ -d /proc/xen ] ; then - eindent - einfo 'Running kernel featuring support for Xen detected' ; eend 0 - eoutdent + eindent + einfo 'Running kernel featuring support for Xen detected' ; eend 0 + eoutdent fi } # }}} -# {{{ vmware specific stuff -config_vmware(){ -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 || 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 -} -# }}} - -# {{{ qemu specific stuff -config_qemu(){ -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 $? - fi -fi -} -# }}} - -# {{{ ld.so.cache + depmod -config_ld_mod(){ -if [ -n "$INSTALLED" ]; then - if ! [ -r /etc/grml.first.boot ] ; then - einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:" - eindent -# Regenerate ld.so.cache and module dependencies on HD - einfo "Running ldconfig" ; ldconfig ; eend $? - einfo "Running depmod" ; depmod -a ; eend $? - touch /etc/grml.first.boot - eend 0 - eoutdent - fi -fi -} -# }}} - # {{{ timezone config_timezone(){ # don't touch the files if running from harddisk: @@ -539,63 +568,6 @@ config_timezone(){ } # }}} -# small computer / nearly no ram {{{ -config_small(){ - -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 - einfo "Information: ${RAM} kB of RAM available." ; eend 0 - einfo "Bootoption small detected. Activating small system." - if [ -r /etc/inittab.small ] ; then - mv /etc/inittab /etc/inittab.normal - mv /etc/inittab.small /etc/inittab - else - sed -i 's/^9/#&/' /etc/inittab - sed -i 's/^10/#&/' /etc/inittab - sed -i 's/^11/#&/' /etc/inittab - sed -i 's/^12/#&/' /etc/inittab - fi - /sbin/telinit q ; eend $? -else - if checkgrmlsmall ; then - if [[ $RAM -lt 25000 ]] ; then - ewarn "Information: ${RAM} kB of RAM available." ; eend 1 - ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1 - ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0 - ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0 - /bin/zsh --login - else - einfo "Information: ${RAM} kB of RAM available." ; eend 0 - fi - else - if [[ $RAM -lt 58000 ]] ; then - ewarn "Information: ${RAM} kB of RAM available." ; eend 1 - ewarn "At least 64MB of RAM should be available for grml." ; eend 1 - ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0 - ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0 - /bin/zsh --login - else - einfo "Information: ${RAM} kB of RAM available." ; eend 0 - fi - fi -fi -eoutdent -} -# }}} - -# skip startup of w3m {{{ -config_fast(){ -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 -} -# }}} - # activate serial console {{{ config_console(){ if checkbootparam 'console'; then @@ -633,7 +605,7 @@ if checkbootparam 'console'; then eindent einfo "Activating console login on device ${device} with speed ${speed}." local number="${device#ttyS}" - sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/bin/zsh-login $speed vt100 || sleep 30\"" /etc/inittab + sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab eend $? telinitq="1" eoutdent @@ -652,164 +624,47 @@ fi } # }}} -# For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{ -config_cdrom_perm(){ -CDROMS="" -for DEVICE in /proc/ide/hd?; do - [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}" -done -[ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null -} -# }}} - -# {{{ Bring up loopback interface now -config_local_net(){ - if [ -z "$INSTALLED" ] ; then - if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then - grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo - else - ifconfig lo up - fi - fi -} -# }}} - -# firewire devices {{{ -# the raw1394 driver does not yet export info into SYSFS, -# so let's create raw1394 device manually -# http://www.michael-prokop.at/blog/index.php?p=352 -config_firewire_dev(){ -if checkbootparam 'nofirewiredev' ; then - ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0 -else -#if [ "${KERNEL%-*}" == "2.6.11" ] ; then - einfo "Creating some firewire devices (fix kernel 2.6-bug)." -# cd /dev && MAKEDEV video1394 raw1394 - [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0 - [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16 -# mknod -m 666 /dev/dv1394 c 171 32 # for NTSC - [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL - chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394 - chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $? -fi -#fi -} -# }}} - -# {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour) -# otherwise we will get: passwd: Authentication token lock busy -config_fix_passwd(){ - if [ -z "$INSTALLED" ] ; then - touch /etc/.pwd.lock - fi -} -# }}} - # {{{ 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}" - - 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 +if checkbootparam 'testcd' ; then + einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option." + eindent - eend 0 -fi -} -# }}} + local ERROR=true + local FOUND_FILE=false + local logfile='/tmp/md5sum.log' -# {{{ hardware detection via discover -config_discover(){ -if checkbootparam 'nodisc' ; then - ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0 -else - if [ -x /sbin/discover ] ; then - einfo "Discovering hardware. Trying to load the following modules in background:" - eindent - einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)" - eoutdent - /sbin/discover-modprobe -v >>$DEBUG 2>&1 & - eend 0 - else - eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0 - fi -fi -} -# }}} + rm -f "$logfile" -# {{{ hardware detection via hwinfo -config_hwinfo(){ -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: " - for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done - eend 0 -fi -} -# }}} + for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do + einfo "Checking files against $md5, this may take a while..." -# {{{ disable hotplug agents on request -config_hotplug_agent(){ -if checkbootparam 'noagent' ; then - AGENT="$(getbootparam 'noagent' 2>>$DEBUG)" - AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g') - AGENTNL=$(echo "$AGENT" | sed 's/,/ /g') - einfo "Disabling hotplug-agent(s) $AGENTNL" - for agent in $(echo -e $AGENTLIST) ; do - mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc + FOUND_FILE=true + OLD_PWD=$(pwd) + cd $(dirname "$md5") + md5sum -c $(basename "$md5") |& tee -a "${logfile}" + if [ $pipestatus[1] -eq 0 ] ; then + ERROR=false + fi + cd "${OLD_PWD}" done - [ "$?" == "0" ] ; eend $? -fi -} -# }}} -# {{{ blacklist of hotplug-modules -config_hotplug_blacklist(){ -if checkbootparam 'black' ; then - BLACK="$(getbootparam 'black' 2>>$DEBUG)" - BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g') - BLACKNL=$(echo "$BLACK" | sed 's/,/ /g') - einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light" - echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light - echo -e "$BLACKLIST" >> /etc/hotplug/blacklist - eend 0 -fi -} -# }}} + if ! $FOUND_FILE ; then + eerror 'Error: Could not find md5sum file' ; eend 1 + return + fi -# {{{ run hotplug -config_hotplug(){ -if checkbootparam 'nohotplug' ; then - ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0 -else - if [ -r /etc/init.d/hotplug ] ; then - einfo "Starting hotplug system in background." - /etc/init.d/hotplug start >>$DEBUG 2>>$DEBUG & - eend 0 - elif [ -r /etc/init.d/hotplug-light ] ; then - einfo "Starting hotplug-light system in background." - /etc/init.d/hotplug-light start >>$DEBUG 2>>$DEBUG & - eend 0 + if ! $ERROR ; then + einfo "Everything looks OK" ; eend 0 else - ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0 + eerror 'Checksum failed for theses files:' ; eend 1 + egrep -v '(^md5sum:|OK$)' "${logfile}" + eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1 + einfon "Hit return to continue, or press the power button to shut down system." + read a fi + + eoutdent fi } # }}} @@ -843,331 +698,49 @@ fi # }}} # {{{ ACPI -config_acpi_apm(){ -if [ -d /proc/acpi ]; then - 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 (disable via bootoption noacpi / nogrmlacpi): " - eindent - found="" - for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do - basename="${a##*/}" - basename="${basename%%.*}" - case "$basename" in *_acpi) - egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;; - esac - modprobe $basename >>$DEBUG 2>&1 && found="yes" - local BASE="$BASE $basename" - done - if [ -n "$found" ] ; then - einfo "$BASE" ; eend 0 - else - ewarn "(none)" ; eend 1 - fi - 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 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" - eend 1 - fi - else - ewarn "acpi daemon already running." - eend 0 - fi - eoutdent - fi +config_acpi(){ +if checkbootparam 'noacpi'; then + ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0 +elif checkbootparam 'nogrmlacpi' ; then + ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0 +elif [ ! -d /proc/acpi ] ; then + ewarn "ACPI: Kernel support not present." ; eend 0 else -# APM - if checkbootparam 'noapm'; then - ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0 + einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): " + eindent + found="" + for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do + basename="${a##*/}" + basename="${basename%%.*}" + case "$basename" in *_acpi) + egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;; + esac + modprobe $basename >>$DEBUG 2>&1 && found="yes" + local BASE="$BASE $basename" + done + if [ -n "$found" ] ; then + einfo "$BASE" ; eend 0 else - modprobe apm power_off=1 >>$DEBUG 2>&1 - if [ "$?" = "0" ] ; then - if [ -x /etc/init.d/apmd ] ;then - einfo "APM Bios found, enabling power management functions." - /etc/init.d/apmd start ; eend $? - fi - else - eerror "Loading apm module failed." ; eend 1 - fi - fi -fi -} -# }}} - -# {{{ PCMCIA Check/Setup -# This needs to be done before other modules are being loaded (by hwsetup) -config_pcmcia(){ -if checkbootparam 'nopcmcia'; then - ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0 -else - if /usr/sbin/laptop-detect ; then - einfo "Detected Laptop - checking for PCMCIA." && eend 0 - modprobe pcmcia_core >>$DEBUG 2>&1 - # Try Cardbus or normal PCMCIA socket drivers - modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1 - if [ "$?" = "0" ]; then - modprobe ds >>$DEBUG 2>&1 - if [ -d /proc/bus/pccard ] ; then - if [ -x /sbin/cardmgr ] ; then - einfo "PCMCIA found, starting cardmgr." - cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0 - else - eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1 - fi - fi - fi + ewarn "(none)" ; eend 1 fi -fi -} -# }}} - -# {{{ run software synthesizer via speakup -config_swspeak(){ - 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 -} -# }}} - -# {{{ Check for blind option or brltty -config_blind(){ -BLIND="" -checkbootparam 'blind' && BLIND="yes" -BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)" - -if [ -n "$BLIND" -o -n "$BRLTTY" ]; then - if [ -x /sbin/brltty ]; then - # Blind option detected, start brltty now. - # modprobe serial_core parport_serial generic_serial && echo "done" - CMD=brltty - BRLTYPE="" - BRLDEV="" - BRLTEXT="" - if [ -n "$BRLTTY" ]; then - # Extra options - BRLTYPE="${BRLTTY%%,*}" - R="${BRLTTY#*,}" - if [ -n "$R" -a "$R" != "$BRLTTY" ]; then - BRLTTY="$R" - BRLDEV="${BRLTTY%%,*}" - R="${BRLTTY#*,}" - if [ -n "$R" -a "$R" != "$BRLTTY" ]; then - BRLTTY="$R" - BRLTEXT="${BRLTTY%%,*}" - R="${BRLTTY#*,}" - fi - fi - fi - [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE" - [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV" - [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT" - einfo "Starting braille-display manager." -# ( exec $CMD & ) - ( sh -c "$CMD" & ) - sleep 2 && BLINDSOUND="yes" + if ! pgrep acpid >/dev/null ; then + einfo "Starting acpi daemon." + service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $? + service_wrapper acpid start >>$DEBUG 2>&1 ; eend $? + else + ewarn "acpi daemon already running." eend 0 fi + eoutdent fi } # }}} -# {{{ Interactive configuration -config_interactive(){ - 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 -# Probe for AGP. Hope this can fail safely - 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 - RUNLEVEL="$(runlevel)" - AUTOMOUNTER="" - [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes" - -addautomount(){ -# /dev/ice options - d="${1##*/}" - if [ -n "$AUTOMOUNTER" ]; then - [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d - [ -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" - 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" +# {{{ Start brltty +config_brltty() { + if checkbootparam 'brltty' ; then + [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh fi - grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab -} - - AUTOMOUNTS="floppy cdrom" -# Add new devices to /etc/fstab and /etc/auto.mnt - for i in /dev/cdrom?*; do - if [ -L $i ]; then - addautomount "$i" "ro" - fi - done -fi - -if [ -n "$AUTOMOUNTER" ]; then -# Check for floppy dir, reinstall with automounter - [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy - [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy - [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy - [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom - [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom - [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom - rm -f /etc/fstab.new -# Replace paths from bootfloppy - sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new - mv -f /etc/fstab.new /etc/fstab -# Start automounter now - einfo "Starting automounter for ${AUTOMOUNTS}." - /etc/init.d/autofs start >>$DEBUG ; eend $? -fi -} -# }}} - -# {{{ Collect partitions from /proc/partitions first for enabling DMA -check_partitions(){ -partitions="" -IDEDISKS="" -while read major minor blocks partition relax; do - partition="${partition##*/}" - [ -z "$partition" -o ! -e "/dev/$partition" ] && continue - case "$partition" in - hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk - sd?) ;; # SCSI Harddisk, entire disk -# [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition - [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition - esac -done </dev/null 2>&1 # avoid output "check_partitions:3: read-only file system" -# }}} - -# {{{ 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 - 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 - if test -d /proc/ide/$d; then - if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then - MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)" - test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]" - einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}" - echo "using_dma:1" >/proc/ide/$d/settings - eend 0 - fi - fi - done -fi } # }}} @@ -1180,19 +753,6 @@ if checkbootparam 'swap' || checkbootparam 'anyswap' ; then checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP="" fi -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)" - iszsh && setopt nonomatch - if [ -x /usr/sbin/rebuildfstab ] ; then - config_userfstab || fstabuser=grml - /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $? - else - ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1 - fi -fi # checkbootparam nofstab/forensic - # Scan for swap, config, homedir - but only in live-mode if [ -z "$INSTALLED" ] ; then [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested." @@ -1297,230 +857,143 @@ fi # -z $INSTALLED } # }}} -# {{{ Mouse -config_mouse(){ -if [ -n "$MOUSE_DEVICE" ] ; then - einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $? +# {{{ CPU-detection +config_cpu(){ +if checkbootparam 'nocpu'; then + ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0 + return 0 fi -} -# }}} -# {{{ IPv6 configuration -# Load IPv6 kernel module and print IP adresses -config_ipv6(){ -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 - sleep 2 - NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)" - for DEVICE in `echo "$NETDEVICES"`; do - eindent - einfo "$DEVICE:" - ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')" - COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')" - eindent - for ADDR in `echo "$ADDRESSES"` ; do - einfo "$ADDR" - done - if [ "$COUNT" -eq "0" ] ; then - einfo "(none)" ; eend 1 - fi - eoutdent - eoutdent - done - eend 0 +if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then + einfo "Found CPU:" + 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) + echo $CPU | sed 's/ \{1,\}/ /g' + eend 0 +else + einfo "Found CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0 fi -} -# }}} -# {{{ Fat-Client-Version: DHCP Broadcast for IP address -config_dhcp(){ -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)" - rm -rf /etc/network/status ; mkdir -p /etc/network/status - for DEVICE in `echo "$NETDEVICES"` ; do - 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 --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 +# no cpufreq setup inside VirtualBox +if $VIRTUALBOX ; then + einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0 + return 0 fi -} -# }}} -# {{{ CPU-detection -config_cpu(){ -if checkbootparam 'nocpu'; then - ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0 +if ! [ -x /etc/init.d/loadcpufreq ] ; then + ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling." + eend 0 + return 0 else - # check module dependencies - cpufreq_check() { - 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 + einfo "Trying to set up cpu frequency scaling:" + eindent + 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 - [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1 + SKIP_CPU_GOVERNOR=1 + ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1 fi fi - } - if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then - einfo "Detecting CPU:" - 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) - echo $CPU | sed 's/ \{1,\}/ /g' - eend 0 - 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 + rm -f "$LOADCPUFREQ" - # 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 - # 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 + if [ -z "$SKIP_CPU_GOVERNOR" ] ; then + if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then + if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then + einfo "Ondemand governor not available for CPU(s), not modifying governor configuration" + else + einfo "Setting ondemand governor" + RC=0 + for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do + echo ondemand > $file || RC=1 + done + eend $RC + 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" >>$DEBUG || modprobe "$MODULE_FALLBACK" >>$DEBUG - RC=$? - if [[ "$RC" == 0 ]]; then - eend 0 - else - SKIP_CPU_GOVERNOR=1 - eend $RC - 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" - RC=0 - 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 -} -# }}} + fi -# {{{ autostart of ssh -config_ssh(){ -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 + eoutdent +fi +} +# }}} - if [ -n "$SSH_PASSWD" ] ; then - ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0 - fi +# {{{ autostart of ssh +config_ssh(){ +if checkbootparam 'ssh' ; then + local PASSWD + PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)" + + config_userlocal + einfo "Bootoption ssh found, trying to set password for root and user $localuser" + [ -z "$localuser" ] && eend 1 + + eindent + if [ -z "$PASSWD" ] ; then + set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0 fi eoutdent - # finally check if we have a password we can use: - if [ -n "$SSH_PASSWD" ] ; then - # chpasswd sucks, seriously. + if [ -n "$PASSWD" ] ; then + chpass_options="" if chpasswd --help 2>&1 | grep -q -- '-m,' ; then - echo "grml:$SSH_PASSWD" | chpasswd -m - else - echo "grml:$SSH_PASSWD" | chpasswd + chpass_options="-m" fi + + echo "$localuser:$PASSWD" | chpasswd $chpass_options + echo "root:$PASSWD" | chpasswd $chpass_options + + eindent + ewarn "Warning: please change the password for root and user $localuser as soon as possible!" + eoutdent fi - einfo 'Starting secure shell server in background.' - /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG - /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG & + einfo "Starting secure shell server in background for root and user $localuser" + service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG + service_wrapper ssh start >>$DEBUG 2>>$DEBUG & eend $? - eindent - ewarn 'Warning: please change the password for user grml as soon as possible!' - eoutdent fi } + +# }}} + +# {{{ display hostkeys of SSH server +config_display_ssh_fingerprints() { + if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then + return 0 # no SSH host keys present + fi + + einfo "SSH key fingerprints:" + for file in /etc/ssh/ssh_host_*_key ; do + einfon + ssh-keygen -l -f $file + done | column -t + eend $? +} # }}} # {{{ autostart of x11vnc config_vnc(){ - -USER=grml # TODO: make it dynamically configurable if checkbootparam 'vnc' ; then + config_userlocal VNC_PASSWD='' VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)" - einfo "Bootoption vnc found, trying to set password for user $USER." + einfo "Bootoption vnc found, trying to set password for user $localuser." eindent if [ -z "$VNC_PASSWD" ] ; then if [ -x /usr/bin/apg ] ; then @@ -1532,7 +1005,7 @@ if checkbootparam 'vnc' ; then 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}" + VNC_PASSWD="${localuser}${RANDOM}" else VNC_PASSWD='' eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping." @@ -1548,7 +1021,7 @@ if checkbootparam 'vnc' ; then # finally check if we have a password we can use: if [ -n "$VNC_PASSWD" ] ; then - VNCDIR="/home/${USER}/.vnc" + VNCDIR="/home/${localuser}/.vnc" [ -d "$VNCDIR" ] || mkdir "$VNCDIR" if [ ! -x /usr/bin/x11vnc ] ; then @@ -1556,7 +1029,7 @@ if checkbootparam 'vnc' ; then eend 1 else /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $? - /bin/chown -R "$USER": "$VNCDIR" + /bin/chown -R "$localuser": "$VNCDIR" fi fi if checkbootparam 'vnc_connect' ; then @@ -1564,7 +1037,7 @@ if checkbootparam 'vnc' ; then VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)" einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT." #store the options in a file - VNCDIR="/home/${USER}/.vnc" + VNCDIR="/home/${localuser}/.vnc" [ -d "$VNCDIR" ] || mkdir "$VNCDIR" echo " --connect $VNC_CONNECT " >> $VNCDIR/options fi @@ -1572,27 +1045,63 @@ fi } # }}} -# {{{ set password for user grml +# {{{ set password for root and default user config_passwd(){ if checkbootparam 'passwd' >>$DEBUG 2>&1; then - einfo "Bootoption passwd found." + local PASSWD PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)" - if [ -n "$PASSWD" ] ; then - echo "grml:$PASSWD" | chpasswd -m ; eend $? - else - eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1 - fi + + config_userlocal + einfo "Bootoption passwd found, trying to set password for root and user $localuser" + [ -z "$localuser" ] && eend 1 + eindent - ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!" + if [ -z "$PASSWD" ] ; then + set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0 + fi eoutdent + + if [ -n "$PASSWD" ] ; then + chpass_options="" + if chpasswd --help 2>&1 | grep -q -- '-m,' ; then + chpass_options="-m" + fi + + echo "$localuser:$PASSWD" | chpasswd $chpass_options + echo "root:$PASSWD" | chpasswd $chpass_options + + eindent + ewarn "Warning: please change the password for root and user $localuser as soon as possible!" + eoutdent + fi + fi -} -# }}} -# {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file. -config_homedir(){ -if checkbootparam 'home' ; then - ewarn "The \"home\" bootoption is deprecated, please use the persistency feature instead."; eend 1 +if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then + local PASSWD + PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)" + + if [ -z "$PASSWD" ] ; then + eerror "No hashed password found, can not set password." + eend 1 + return + fi + + config_userlocal + einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser" + [ -z "$localuser" ] && eend 1 + + if [ -n "$PASSWD" ] ; then + chpass_options="-e" + + echo "$localuser:$PASSWD" | chpasswd $chpass_options + echo "root:$PASSWD" | chpasswd $chpass_options + + eindent + ewarn "Warning: please change the password for root and user $localuser as soon as possible!" + eoutdent + fi + fi } # }}} @@ -1610,7 +1119,7 @@ config_mixer () { fi for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do - einfo "Configuring soundcard $(cat /proc/asound/cards| grep -e "$card" | awk -F\[ '{print $2}' | awk '{print $1}')" + einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\"" eindent if checkbootparam 'vol' ; then @@ -1639,22 +1148,39 @@ config_mixer () { if checkbootparam 'micvol' ; then MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)" + einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}." else MICVOL=0 fi - for CONTROL in Master PCM ; do - if amixer -q | grep -q "Simple mixer control.*$CONTROL" ; then - amixer -q set "${CONTROL}" "${VOL}"% + CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}') + IFSOLD=${IFS:-} + IFS=' +' + for CONTROL in ${=CONTROLS} ; do + # such devices can not be controlled with amixer ... unmute + [[ "$CONTROL" == *Console* ]] && continue + + if ! echo "${CONTROL}" | grep -q -i "mic" ; then + if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then + amixer -c $card -q set "${CONTROL}" unmute + fi + if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then + amixer -c $card -q set "${CONTROL}" "${VOL}"% + fi + fi + + if [ ${MICVOL} -ne 0 ] ; then + if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then + amixer -c $card -q set "${CONTROL}" unmute + fi + if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then + amixer -c $card -q set "${CONTROL}" $MICVOL% + fi eend $? fi done - - if [ ${MICVOL} -ne 0 ] ; then - einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}." - amixer -q set "Mic" $MICVOL &> /dev/null - eend $? - fi + IFS=$IFSOLD fi # checkbootparam 'nosound' eoutdent done @@ -1662,100 +1188,14 @@ config_mixer () { } # }}} -# {{{ modem detection -config_modem(){ -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. Start it running 'Start sl-modem-daemon'." - eend 0 - fi - fi -fi -} -# }}} - -# {{{ keyboard add-ons -config_setkeycodes(){ -if checkbootparam 'setkeycodes' ; then - einfo "Setting keycodes as requested via bootparameter 'setkeycodes'." - # MS MM keyboard add-on - # fix - setkeycodes e001 126 &>/dev/null - setkeycodes e059 127 &>/dev/null - # fn keys - setkeycodes e03b 59 &>/dev/null - setkeycodes e008 60 &>/dev/null - setkeycodes e007 61 &>/dev/null - setkeycodes e03e 62 &>/dev/null - setkeycodes e03f 63 &>/dev/null - setkeycodes e040 64 &>/dev/null - setkeycodes e041 65 &>/dev/null - setkeycodes e042 66 &>/dev/null - setkeycodes e043 67 &>/dev/null - setkeycodes e023 68 &>/dev/null - setkeycodes e057 87 &>/dev/null - setkeycodes e058 88 &>/dev/null - # hp keycodes - setkeycodes e00a 89 e008 90 &>/dev/null - eend 0 -fi -} -# }}} - -# {{{ wondershaper -config_wondershaper(){ - if checkbootparam 'wondershaper' ; then - WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)" - CMD=wondershaper - DEVICE="" - DOWNSTREAM="" - UPSTREAM="" - if [ -n "$WONDER" ]; then - # Extra options - DEVICE="${WONDER%%,*}" - R="${WONDER#*,}" - if [ -n "$R" -a "$R" != "$WONDER" ]; then - WONDER="$R" - DOWNSTREAM="${WONDER%%,*}" - R="${WONDER#*,}" - if [ -n "$R" -a "$R" != "$WONDER" ]; then - WONDER="$R" - UPSTREAM="${WONDER%%,*}" - R="${WONDER#*,}" - fi - fi - fi - [ -n "$DEVICE" ] && CMD="$CMD $DEVICE" - [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM" - [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM" - einfo "Starting wondershaper (${CMD}) in background." - ( sh -c $CMD & ) && eend 0 - fi -} -# }}} - -# {{{ syslog-ng +# {{{ syslog service config_syslog(){ if checkbootparam 'nosyslog'; then ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0 else - 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 >>$DEBUG & - eend 0 - fi + einfo "Starting rsyslog in background." + service_wrapper rsyslog start >>$DEBUG & + eend 0 fi } # }}} @@ -1769,7 +1209,7 @@ config_gpm(){ eerror "No mouse found - not starting GPM." ; eend 1 else einfo "Starting gpm in background." - /etc/init.d/gpm start >>$DEBUG & + service_wrapper gpm start >>$DEBUG & # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) & eend 0 fi @@ -1783,11 +1223,18 @@ config_services(){ 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." for service in $(echo -e $SERVICELIST) ; do - /etc/init.d/${service} start >>$DEBUG & + # support running (custom) init scripts in non-blocking mode + # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND". + if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then + einfo "Starting service ${service}." + service_wrapper "${service}" start >>$DEBUG + else + einfo "Starting service ${service} in background." + service_wrapper "${service}" start >>$DEBUG & + fi done - [ "$?" == "0" ] ; eend $? + eend $? fi } # }}} @@ -1802,7 +1249,13 @@ get_remote_file() { --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1 } einfo "Trying to get ${WHITE}${TARGET}${NORMAL}" - counter=10 + + if checkbootparam 'getfile.retries' ; then + local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)" + else + local counter=10 + fi + while ! getconfig && [[ "$counter" != 0 ]] ; do echo -n "Sleeping for 1 second and trying to get config again... " counter=$(( counter-1 )) @@ -1849,40 +1302,43 @@ config_netscript() { } # }}} -# {{{ blindsound -config_blindsound(){ - if checkbootparam 'blind' ; then - beep - flitewrapper "welcome to the gremel system" - fi -} -# }}} +# {{{ stats +config_stats() { + if ! checkbootparam 'nostats' ; then + BASE_URL="http://stats.grml.org/report/" + ACTION_NAME=Boot -# {{{ welcome sound -config_welcome(){ - if checkbootparam 'welcome' ; then - flitewrapper "welcome to the gremel system" - fi -} -# }}} + HOST_ID=$(cat /proc/sys/kernel/random/boot_id) -# {{{ fix/workaround for unionfs -fix_unionfs(){ - if [ -z "$INSTALLED" ]; then - touch /var/cache/apt/*cache.bin - fi -} -# }}} + grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0" + DATE_STRING=$(date +'h=%H&m=%M&s=%S') + [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \ + VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}') + + PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )" + + echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote" + [ -z "$BOOT" ] && BOOT="local" + + ADDITIONAL_PARAMS="" + ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \ + ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))" + + URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS' -# {{{ create all /mnt-directories -create_mnt_dirs(){ - ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need." - ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0 + get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &! + fi } # }}} # {{{ start X window system via grml-x config_x_startup(){ + + if $SYSTEMD ; then + ewarn "The startx boot option isn't yet supported via systemd, sorry." ; eend 0 + return + fi + # 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 @@ -1890,24 +1346,23 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t if [ -z "$INSTALLED" ] ; then WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)" if [ -z "$WINDOWMANAGER" ] ; then - einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0 - WINDOWMANAGER="wm-ng" + einfo "No window manager specified. Using default one." && eend 0 else einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0 fi einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles." - config_userfstab || fstabuser='grml' + config_userlocal cat>|/etc/init.d/xstartup</dev/tty6 2>\&1 /dev/tty6 2>\&1 /dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab + echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab fi /sbin/telinit q ; eend $? @@ -1923,7 +1378,7 @@ EOF 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." + eerror "/usr/bin/X is not present on this grml flavour." eerror " -> Boot parameter startx does not work therefore." ; eend 1 fi fi @@ -1950,8 +1405,12 @@ config_finddcsdir() { # 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 +# autoconfig, see issue673 +GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)" +[ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG" +if checkbootparam 'noautoconfig' ; then + DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected + ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0 else if [ -z "$INSTALLED" ] ; then if checkbootparam 'myconfig' ; then @@ -1960,16 +1419,20 @@ else 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 + 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 >>$DEBUG 2>&1 ; then - blkid /dev/fd0 >>$DEBUG 2>&1 - fi + DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}') + + modprobe 9p 2>/dev/null || true + if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then + if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then + einfo "Found 9p-virtio fs with mount_tag $GRMLCFG" + DCSDEVICE="$GRMLCFG" + MOUNTOPTIONS="ro,trans=virtio" + DCSFS="9p" + fi fi - DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}') + if [ -n "$DCSDEVICE" ]; then DCSMP="/mnt/grmlcfg" fi @@ -1978,7 +1441,7 @@ else # if not specified/present then assume default: if [ -z "$DCSDEVICE" ]; then - DCSDIR="/live/image" + DCSDIR="${LIVECD_PATH}" else eindent einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0 @@ -1988,7 +1451,7 @@ else else [ -d $DCSMP ] || mkdir $DCSMP umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted - mount -o ro -t auto $DCSDEVICE $DCSMP ; RC="$?" + mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?" if [[ $RC == 0 ]]; then einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0 else @@ -2001,7 +1464,7 @@ else fi fi -if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then +if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; 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 @@ -2038,11 +1501,14 @@ config_debs(){ if checkbootparam 'debs' ; then iszsh && setopt localoptions shwordsplit DEBS="$(getbootparam 'debs' 2>>$DEBUG)" + if [ -z "$DEBS" ] ; then + DEBS="*.deb" + fi 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}" + einfo "Trying to install Debian package(s) ${DEBS}" DEBS="$(eval echo ${DCSDIR}/$DEBS)" dpkg -i $DEBS ; eend $? fi @@ -2058,22 +1524,20 @@ if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; 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 + eend $? elif [ -d "$SCRIPTS" ]; then einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:" - run-parts $SCRIPTS + run-parts --regex '.*' $SCRIPTS + eend $? else einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:" sh -c $SCRIPTS + eend $? fi fi fi @@ -2100,9 +1564,13 @@ if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then fi fi fi -# umount $DCSMP if it was mounted by finddcsdir -# this doesn't really belong here -grep -q '$DCSMP' /proc/mounts && umount $DCSMP +} +# }}} + +# {{{ confing_umount_dcsdir +config_umount_dcsdir(){ + # umount $DCSMP if it was mounted by finddcsdir + grep -q "$DCSMP" /proc/mounts && umount "$DCSMP" } # }}} @@ -2127,153 +1595,15 @@ fi } # }}} -# {{{ distcc -config_distcc(){ -if checkbootparam 'distcc' ; then - OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)" - if [ -n "$OPTIONS" ]; then - NET="" - INTERFACE="" - if [ -n "$OPTIONS" ]; then - NET="${OPTIONS%%,*}" - R="${OPTIONS#*,}" - if [ -n "$R" -a "$R" != "$OPTIONS" ]; then - OPTIONS="$R" - INTERFACE="${OPTIONS%%,*}" - R="${OPTIONS#*,}" - fi - fi - fi - CONFIG=/etc/default/distcc - sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG - sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG - - if [ -n "$INTERFACE" ] ; then - IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}') - - counter=10 - while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do - counter=$(( counter-1 )) - ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left." - sleep 3 - IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}') - done - fi - - if [ -n "$IP" ] ; then - sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG - - einfo "Bootoption distcc found. Preparing setup for distcc daemon." - eindent - id distccd >/dev/null 2>&1 || \ - ( - einfo "Creating distcc user" ; \ - adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $? - ) - - einfo "Starting distcc for network ${NET}, listening on ${IP}." - /etc/init.d/distcc start >/dev/null ; eend $? - eoutdent - else - eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1 - fi -fi - -if checkbootparam 'gcc'; then - GCC="$(getbootparam 'gcc' 2>>$DEBUG)" - eindent - einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}." - eoutdent - rm -f /usr/bin/gcc - ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $? -fi - -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 - rm -f /usr/bin/g++ - ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $? - fi - einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}." - if [ -x /usr/bin/cpp-${GPP} ] ; then - rm -f /usr/bin/cpp - ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $? - fi - eoutdent -fi - -} -# }}} - -# {{{ load modules -# Notice: use it only on live-cd system, if running from harddisk please -# add modules to /etc/modules and activate /etc/init.d/module-init-tools -# in /etc/runlevel.conf -config_modules(){ -MODULES_FILE=/etc/grml/modules -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 - einfo "Loading modules specified in ${MODULES_FILE}:" - eindent - grep '^[^#]' $MODULES_FILE | \ - while read module args; do - [ "$module" ] || continue - einfo "${module}" - modprobe $module $args ; eend $? - done - eoutdent - else - ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1 - fi -fi -} -# }}} - -# {{{ 915resolution -config_915resolution(){ -if checkbootparam '915resolution' ; then - OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)" - if [ -x /usr/sbin/915resolution ]; then - CMD=915resolution - MODE="" - XRESO="" - YRESO="" - if [ -n "$OPTIONS" ]; then - # Extra options - MODE="${OPTIONS%%,*}" - R="${OPTIONS#*,}" - if [ -n "$R" -a "$R" != "$OPTIONS" ]; then - OPTIONS="$R" - XRESO="${OPTIONS%%,*}" - R="${OPTIONS#*,}" - if [ -n "$R" -a "$R" != "$OPTIONS" ]; then - OPTIONS="$R" - YRESO="${OPTIONS%%,*}" - R="${OPTIONS#*,}" - fi - fi - fi - einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}." - [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & ) - eend 0 - fi -fi -} -# }}} - # {{{ SW-RAID config_swraid(){ [ -n "$INSTALLED" ] && return 0 - # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption if checkbootparam 'noraid' || checkbootparam 'noswraid' || \ - checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then + checkbootparam 'raid=noautodetect' ; then ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0 else + [ -e /proc/mdstat ] || modprobe md_mod if ! [ -x /sbin/mdadm ] ; then eerror "mdadm not available, can not execute it." ; eend 1 else @@ -2411,8 +1741,7 @@ config_lvm(){ 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 + if ! [ -x /sbin/lvm ] ; then eerror "LVM not available, can not execute it." ; eend 1 else if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then @@ -2422,7 +1751,7 @@ config_lvm(){ eend 0 if checkbootparam 'lvm' ; then einfo "Bootoption LVM found. Searching for logical volumes:" - /etc/init.d/lvm2 start ; eend $? + service_wrapper lvm2 start ; eend $? fi eoutdent fi @@ -2434,45 +1763,8 @@ config_lvm(){ # {{{ debnet: setup network based on an existing one found on a partition config_debnet(){ if checkbootparam 'debnet' ; then - iszsh && setopt localoptions shwordsplit - DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")" - DEVICES="$DEVICES $(ls /dev/mapper/*)" - FOUND_DEBNET="" - einfo "Bootoption 'debnet' found. Searching for Debian network configuration: " - eindent - if ! mount | grep '/mnt ' >/dev/null 2>&1 ; then - for i in $DEVICES; do - if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then - einfo "Scanning on $i" - if [ -f /mnt/etc/network/interfaces ]; then - einfo "/etc/network/interfaces found on ${i}" ; eend 0 - FOUND_DEBNET="$i" - break - fi - umount /mnt - fi - done - - if [ -n "$FOUND_DEBNET" ]; then - einfo "Stopping network." - pump -k >/dev/null 2>&1 - /etc/init.d/networking stop >/dev/null 2>&1 ; eend $? - einfo "Copying Debian network configuration from $FOUND_DEBNET to running system." - rm -rf /etc/network/run - cp -a /mnt/etc/network /etc - rm -rf /etc/network/run - mkdir /etc/network/run - umount /mnt ; eend $? - einfo "Starting network." - invoke-rc.d networking start ; eend $? - else - eerror "/etc/network/interfaces not found." ; eend 1 - fi - eoutdent - else - eerror "Error: /mnt already mounted." ; eend 1 - fi + /usr/sbin/debnet fi } # }}} @@ -2486,103 +1778,10 @@ 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 checkbootparam "BOOT_IMAGE=grml2hd" ; 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 - FILESYSTEM='' - FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)" - sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1 -fi - -if checkbootparam 'partition' ; then - PARTITION='' - PARTITION="$(getbootparam 'partition' 2>>$DEBUG)" - # notice: the following checks whether the given partition is available, if not the skip - # execution of grml2hd as it might result in data loss... - if [ -r $PARTITION ] ; then - sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 - else - ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1 - fi -fi - -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 -fi - -cat>|/usr/bin/grml2hd_noninteractive</dev/null ; then + ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders." + eend 0 + elif ! [ -x /usr/sbin/VBoxService ] ; then + ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders." + eend 0 + else + eindent + + einfo "Loading vboxsf driver." + lsmod | grep -q vboxsf || modprobe vboxsf + eend $? + + einfo "Adjusting /dev/vboxguest." + chown root:vboxsf /dev/vboxguest + chmod 660 /dev/vboxguest + eend $? + + config_userfstab + + einfo "Adding $fstabuser to group vboxsf." + adduser grml vboxsf &>/dev/null + eend $? + + einfo "Starting VBoxService." + VBoxService >/dev/null + eend $? + + local vbautomation='automation' + if checkbootparam 'vbautomation'; then + vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)" + fi + + if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then + ewarn "No automount shared folder '$vbautomation' available" + eend 0 + else + einfo "Found automount shared folder '$vbautomation'" + eend 0 + + local distri="$(getbootparam 'distri' 2>>$DEBUG)" + [ -n "$distri" ] || distri='grml' + + local vbox_auto_sf="/media/sf_${vbautomation}" + + sleep 1 # ugly but necessary + + counter=10 + eindent + while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do + einfo "Waiting another second to retry access to ${vbox_auto_sf}" + sleep 1 + counter=$(( counter-1 )) + eend 0 + done + eoutdent + + if ! [ -d "${vbox_auto_sf}" ] ; then + eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist" + eend 1 + else + einfo "Found shared folders automation directory $vbox_auto_sf" + eend 0 + + eindent + if checkbootparam 'novbautomation' ; then + einfo "Bootoption novbautomation found. Disabling automation script execution." + eend 0 + else + if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then + ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}" + eend 1 + else + einfo "Executing '${vbox_auto_sf}/${distri}' now:" + "${vbox_auto_sf}/${distri}" + eend $? + fi + fi + eoutdent + fi + fi + + eoutdent + fi +fi +} +# }}} + # {{{ Support customization config_distri(){ if checkbootparam 'distri'; then @@ -2685,14 +1976,5 @@ fi } # }}} -### {{{ backwards compatible stuff -config_environment(){ - ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0 -} -config_keyboard(){ - ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0 -} -# }}} - ## END OF FILE ################################################################# -# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3 +# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2