X-Git-Url: http://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=ccf12d673b6131d75d2a0a5f79cfd24174b12f3b;hp=7fdb4beb731bfdca5b5f8d9b5c82c9a3df5459ce;hb=176568ce0d352cb56b370737c3263eb09eba8e89;hpb=b067eaa3953382530af6ee343de4a360e3eabec4 diff --git a/autoconfig.functions b/autoconfig.functions index 7fdb4be..ccf12d6 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -23,6 +23,28 @@ umask 022 # 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 @@ -172,12 +194,10 @@ fi # {{{ source lsb-functions , color handling if checkbootparam 'nocolor'; then - RC_NOCOLOR=yes . /etc/grml/lsb-functions einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0 else . /etc/grml/lsb-functions - . /etc/grml_colors fi # }}} @@ -227,24 +247,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 $TIMEOUT > /sys/class/firmware/timeout ; eend $? - fi -} -# }}} - ### {{{ language configuration / localization config_language(){ @@ -466,34 +468,27 @@ config_userlocal() { } # }}} -# {{{ mount configfs -config_configfs() { - einfo "Mounting configfs" - CONFIGFS_DIR=/sys/kernel/config/ - modprobe configfs 2>/dev/null 1>&2 - if ! [ -d "$CONFIGFS_DIR" ] ; then - eindent - einfo "$CONFIGFS_DIR does not exist, can't mount directory" - eend 1 - eoutdent - else - mount -t configfs configfs "$CONFIGFS_DIR" 2>/dev/null 1>&2 - eend $? - fi -} -# }}} - # {{{ Set clock (Local time is more often used than GMT, so it is default) config_time(){ # don't touch the files if running from harddisk: 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) @@ -545,20 +540,24 @@ config_kernel(){ } # }}} -# {{{ 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 +# {{{ secure boot +config_secureboot(){ + if [ -x /usr/bin/mokutil ] ; then + local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled" + if [ -n "$secstate" ] ; then + einfo "SecureBoot is enabled" ; eend 0 + else + einfo "SecureBoot not detected" ; eend 0 + fi + else + if modprobe efivars &>/dev/null ; then + if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then + einfo "SecureBoot is enabled" ; eend 0 + else + einfo "SecureBoot not detected" ; eend 0 + fi + fi + fi } # }}} @@ -588,66 +587,14 @@ 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 '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab - /sbin/telinit q ; eend $? -fi -} -# }}} - # activate serial console {{{ config_console(){ if checkbootparam 'console'; then + # this hack is no longer necessary with systemd + if $SYSTEMD ; then + return + fi + local line local ws ws=' ' @@ -701,15 +648,6 @@ 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 checkbootparam 'testcd' ; then @@ -785,21 +723,26 @@ fi # {{{ ACPI 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 - 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 ;; + if $SYSTEMD ; then + echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG" + return + fi + + 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 + 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" @@ -811,7 +754,8 @@ else fi if ! pgrep acpid >/dev/null ; then einfo "Starting acpi daemon." - /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $? + 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 @@ -821,26 +765,6 @@ 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" -# }}} - # {{{ Start brltty config_brltty() { if checkbootparam 'brltty' ; then @@ -849,27 +773,6 @@ config_brltty() { } # }}} -# {{{ 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 -} -# }}} - # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now config_fstab(){ @@ -983,43 +886,6 @@ fi # -z $INSTALLED } # }}} -# {{{ Mouse -config_mouse(){ -if [ -n "$MOUSE_DEVICE" ] ; then - einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $? -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 -fi -} -# }}} - # {{{ CPU-detection config_cpu(){ if checkbootparam 'nocpu'; then @@ -1042,7 +908,11 @@ if $VIRTUALBOX ; then return 0 fi -if [ -x /etc/init.d/loadcpufreq ] ; then +if ! [ -x /etc/init.d/loadcpufreq ] ; then + ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling." + eend 0 + return 0 +else einfo "Trying to set up cpu frequency scaling:" eindent SKIP_CPU_GOVERNOR='' @@ -1069,22 +939,22 @@ if [ -x /etc/init.d/loadcpufreq ] ; then fi fi - rm -f $LOADCPUFREQ + rm -f "$LOADCPUFREQ" if [ -z "$SKIP_CPU_GOVERNOR" ] ; then - if grep -vq ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then - einfo "Loading cpufreq_ondemand" - modprobe cpufreq_ondemand - eend $? + 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 "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 # cpu-governor + fi eoutdent fi @@ -1122,8 +992,8 @@ if checkbootparam 'ssh' ; then fi einfo "Starting secure shell server in background for root and user $localuser" - /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG - /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG & + service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG + service_wrapper ssh start >>$DEBUG 2>>$DEBUG & eend $? fi @@ -1267,170 +1137,112 @@ fi # {{{ Sound config_mixer () { - if ! [ -x /usr/bin/amixer ] ; then - eerror "amixer binary not available. Can not set sound volumes therefore." - eend 1 - else - if ! [ -r /proc/asound/cards ] ; then - ewarn "No soundcard present, skipping mixer settings therefore." - eend 0 - return - fi + if ! [ -x /usr/bin/amixer ] ; then + logger -t grml-autoconfig "amixer binary not available" + return + fi - for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do - einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\"" - eindent + if ! [ -r /proc/asound/cards ] ; then + ewarn "No soundcard present, skipping mixer settings therefore." + eend 0 + return + fi - if checkbootparam 'vol' ; then - VOL="$(getbootparam 'vol' 2>>$DEBUG)" - if [ -z "$VOL" ] ; then - eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)." - VOL='75' - eend 1 - fi - else - VOL='75' - fi - - if checkbootparam 'nosound' ; then - einfo "Muting sound devices on request." - ERROR=$(amixer -q set Master mute) - RC=$? - if [ -n "$ERROR" ] ; then - eindent - eerror "Problem muting sound devices: $ERROR" - eoutdent - fi - eend $RC - elif [ -z "$INSTALLED" ] ; then - einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}." + for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do + einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\"" + eindent - if checkbootparam 'micvol' ; then - MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)" - einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}." - else - MICVOL=0 - fi + if checkbootparam 'vol' ; then + VOL="$(getbootparam 'vol' 2>>$DEBUG)" + if [ -z "$VOL" ] ; then + eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)." + VOL='75' + eend 1 + fi + else + VOL='75' + fi - 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 - IFS=$IFSOLD - fi # checkbootparam 'nosound' - eoutdent - done - fi -} -# }}} + if checkbootparam 'nosound' ; then + einfo "Muting sound devices on request." + ERROR=$(amixer -q set Master mute) + RC=$? + if [ -n "$ERROR" ] ; then + eindent + eerror "Problem muting sound devices: $ERROR" + eoutdent + fi + eend $RC + elif [ -z "$INSTALLED" ] ; then + einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}." -# {{{ 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 -} -# }}} + if checkbootparam 'micvol' ; then + MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)" + einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}." + else + MICVOL=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#*,}" + 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 - 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 + + 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 + IFS=$IFSOLD + fi # checkbootparam 'nosound' + eoutdent + done } # }}} -# {{{ 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 } # }}} # {{{ gpm config_gpm(){ - if checkbootparam 'nogpm'; then - ewarn "Not starting GPM as requested on boot commandline." ; eend 0 - else - if ! [ -r /dev/input/mice ] ; then + if checkbootparam 'nogpm'; then + ewarn "Not starting GPM as requested on boot commandline." ; eend 0 + else + if ! [ -r /dev/input/mice ] ; then eerror "No mouse found - not starting GPM." ; eend 1 - else + 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 - fi + fi + fi } # }}} @@ -1445,10 +1257,10 @@ config_services(){ # 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}." - /etc/init.d/${service} start >>$DEBUG + service_wrapper "${service}" start >>$DEBUG else einfo "Starting service ${service} in background." - /etc/init.d/${service} start >>$DEBUG & + service_wrapper "${service}" start >>$DEBUG & fi done eend $? @@ -1466,7 +1278,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 )) @@ -1542,16 +1360,10 @@ config_stats() { } # }}} -# {{{ fix/workaround for unionfs -fix_unionfs(){ - if [ -z "$INSTALLED" ]; then - touch /var/cache/apt/*cache.bin - fi -} -# }}} - # {{{ start X window system via grml-x config_x_startup(){ + + # 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 @@ -1565,17 +1377,28 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t fi einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles." config_userlocal - cat>|/etc/init.d/xstartup<|/etc/init.d/startx<|/etc/init.d/startx</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/startx ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab fi /sbin/telinit q ; eend $? @@ -1621,7 +1444,7 @@ DCSMP="/mnt/grml" # autoconfig, see issue673 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)" [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG" -if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then +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 @@ -1721,7 +1544,7 @@ if checkbootparam 'debs' ; 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 @@ -1737,11 +1560,6 @@ 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 @@ -1813,119 +1631,12 @@ 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 -} -# }}} - # {{{ 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 @@ -1945,7 +1656,11 @@ config_swraid(){ if ! checkbootparam 'swraid' ; then eindent - einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart." + if $SYSTEMD ; then + einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart." + else + einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart." + fi eoutdent else einfo "Bootoption swraid found. Searching for software RAID arrays:" @@ -2066,18 +1781,25 @@ 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 einfo "You seem to have logical volumes (LVM) on your system." eindent - einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart." + if $SYSTEMD ; then + einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart." + else + einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart." + fi eend 0 if checkbootparam 'lvm' ; then einfo "Bootoption LVM found. Searching for logical volumes:" - /etc/init.d/lvm2 start ; eend $? + if $SYSTEMD ; then + service_wrapper lvm2-lvmetad start ; eend $? + else + service_wrapper lvm2 start ; eend $? + fi fi eoutdent fi @@ -2104,47 +1826,6 @@ 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 ${LIVECD_PATH}/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 -} -# }}} - # {{{ debootstrap: automatic installation config_debootstrap(){ @@ -2237,6 +1918,7 @@ fi # checkbootparam "BOOT_IMAGE=debian2hd } # }}} +# {{{ virtualbox shared folders config_virtualbox_shared_folders() { if $VIRTUALBOX ; then einfo "VirtualBox detected, trying to set up Shared Folders." @@ -2265,13 +1947,68 @@ if $VIRTUALBOX ; then eend $? einfo "Starting VBoxService." - VBoxService >/dev/null & + 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(){