X-Git-Url: http://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=19a240da44c68fc80e4d80e7a98dcd7edb4aef46;hp=2a3dd66359c8bb000aa3db6d7428112ddd623549;hb=e0dbcabf440a716f05f7b29961596f0fba6ae6f8;hpb=412906c21d0e9176e79dbecbfd1eef46162790c9 diff --git a/autoconfig.functions b/autoconfig.functions index 2a3dd66..19a240d 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -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,13 +62,12 @@ 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 - local TAG="grml-parameters" + TAG="grml-parameters" if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then - local MOUNTDIR="$(mktemp -d)" + MOUNTDIR="$(mktemp -d)" mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR" CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')" umount "$MOUNTDIR" @@ -109,6 +132,28 @@ checkgrmlsmall(){ grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1 } +# 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 @@ -151,6 +196,7 @@ fi if checkbootparam 'nocolor'; then RC_NOCOLOR=yes . /etc/grml/lsb-functions + . /etc/grml_nocolors einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0 else . /etc/grml/lsb-functions @@ -204,24 +250,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(){ @@ -443,40 +471,33 @@ 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) 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 @@ -500,10 +521,10 @@ config_time(){ # {{{ print kernel info config_kernel(){ - if $VIRTUAL ; then - einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0 - else + 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 @@ -522,23 +543,6 @@ 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 -} -# }}} - # {{{ timezone config_timezone(){ # don't touch the files if running from harddisk: @@ -565,63 +569,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 '/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 @@ -678,52 +625,47 @@ 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 - einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option." + einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option." + eindent - ERROR=0 - FOUND_FILE=0 + local ERROR=true + local FOUND_FILE=false + local logfile='/tmp/md5sum.log' - rm -f /tmp/md5sum.log - for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do - einfo "Checking files against $md5, this may take a while..." + rm -f "$logfile" - FOUND_FILE=1 - ( cd $(dirname "$md5") && md5sum -c $(basename "$md5") ; RC=$?) |& tee -a /tmp/md5sum.log + for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do + einfo "Checking files against $md5, this may take a while..." - if [ $RC -ne 0 ] ; then - ERROR=1 - fi - done + 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 - if [ $FOUND_FILE -eq 0 ] ; then - echo "${RED} *** Error: Could not find md5sum file. ***" - return - fi + if ! $FOUND_FILE ; then + eerror 'Error: Could not find md5sum file' ; eend 1 + return + fi - if [ "$ERROR" -eq 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 ! $ERROR ; then + einfo "Everything looks OK" ; eend 0 + else + 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 - eend 0 + eoutdent fi } # }}} @@ -784,7 +726,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 @@ -794,26 +737,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 @@ -822,27 +745,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(){ @@ -956,43 +858,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 @@ -1015,7 +880,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='' @@ -1042,22 +911,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 @@ -1067,56 +936,56 @@ fi # {{{ autostart of ssh config_ssh(){ if checkbootparam 'ssh' ; then - SSH_PASSWD='' - SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)" + 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 "$SSH_PASSWD" ] ; then - if [ -x /usr/bin/apg ] ; then - SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)" - elif [ -x /usr/bin/gpw ] ; then - SSH_PASSWD="$(gpw 1)" - elif [ -x /usr/bin/pwgen ] ; then - SSH_PASSWD="$(pwgen -1 8)" - elif [ -x /usr/bin/hexdump ] ; then - SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')" - elif [ -n "$RANDOM" ] ; then - SSH_PASSWD="grml${RANDOM}" - else - SSH_PASSWD='' - eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping." - eend 1 - fi - if [ -n "$SSH_PASSWD" ] ; then - ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0 - fi + 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 chpass_options="-m" fi - echo "$localuser:$SSH_PASSWD" | chpasswd $chpass_options - echo "root:$SSH_PASSWD" | chpasswd $chpass_options + + 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 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 $? - eindent - ewarn "Warning: please change the password for root and user $localuser 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 @@ -1177,21 +1046,63 @@ fi } # }}} -# {{{ set password for default user +# {{{ set password for root and default user config_passwd(){ if checkbootparam 'passwd' >>$DEBUG 2>&1; then + local PASSWD PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)" + config_userlocal - einfo "Bootoption passwd found, change password for user '$localuser'." + einfo "Bootoption passwd found, trying to set password for root and user $localuser" [ -z "$localuser" ] && eend 1 - if [ -n "$PASSWD" ] ; then - echo "$localuser:$PASSWD" | chpasswd -m ; eend $? - else - eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1 - fi + eindent - ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!" + 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 + +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 } # }}} @@ -1248,6 +1159,9 @@ config_mixer () { 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 @@ -1275,72 +1189,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 -} -# }}} - -# {{{ 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 } # }}} @@ -1354,7 +1210,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 @@ -1373,10 +1229,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 $? @@ -1394,7 +1250,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 )) @@ -1469,16 +1331,15 @@ config_stats() { fi } # }}} -# {{{ 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(){ + + 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 @@ -1548,7 +1409,8 @@ 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 if [ -z "$INSTALLED" ] ; then @@ -1560,13 +1422,6 @@ else elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0 eindent - # We do need the following fix so floppy disk is available to blkid in any case :-/ - if [ -r /dev/fd0 ] ; then - einfo "Floppy device detected. Trying to access floppy disk." - if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then - blkid /dev/fd0 >>$DEBUG 2>&1 - fi - fi DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}') modprobe 9p 2>/dev/null || true @@ -1587,7 +1442,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 @@ -1610,7 +1465,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 @@ -1654,7 +1509,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 @@ -1670,22 +1525,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 @@ -1743,119 +1596,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 @@ -1996,8 +1742,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 @@ -2007,7 +1752,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 @@ -2034,47 +1779,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 /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 -} -# }}} - # {{{ debootstrap: automatic installation config_debootstrap(){ @@ -2167,6 +1871,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." @@ -2195,13 +1900,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(){