################################################################################
# {{{ 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)"
umask 022
-# old linuxrc version:
-[ -d /cdrom ] && export LIVECD_PATH=/cdrom
-# new initramfs layout:
-[ -d /live/image ] && export LIVECD_PATH=/live/image
+# initramfs layout since December 2012, backwards compatibility:
+[ -d /lib/live/mount/medium ] && export LIVECD_PATH='/lib/live/mount/medium'
+# initramfs layout since December 2018:
+[ -d /run/live/medium ] && export LIVECD_PATH='/run/live/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 <service> <action> [background]" >&2
+ return 1
+ fi
+
+ local service="$1"
+ local action="$2"
+ local background="$3"
+
+ if $SYSTEMD ; then
+ systemctl "$action" "$service"
+ else
+ if [ "${background:-}" = "background" ] ; then
+ /etc/init.d/"$service" "$action" &
+ else
+ /etc/init.d/"$service" "$action"
+ fi
+ fi
+}
+
# zsh stuff
iszsh(){
if [ -n "$ZSH_VERSION" ] ; 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
# }}}
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
# {{{ 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
+
+if virt-what 2>/dev/null | grep -q 'vmware' || \
+ imvirt 2>/dev/null | grep -iq "vmware" ; then
+ VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
+fi
+
+if virt-what 2>/dev/null | grep -q 'kvm' || \
+ [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
+ VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
+fi
-# testcd
-TESTCD=""
-checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes"
+if virt-what 2>/dev/null | grep -q 'virtualbox' || \
+ [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
+ VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
+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
# }}}
-# {{{ debug
-config_debug(){
- checkbootparam 'debug' && BOOTDEBUG="yes"
- checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
-
- rundebugshell(){
- if [ -n "$BOOTDEBUG" ]; then
- einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
- if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
- einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
- einfo "Just exit the shell to continue boot process..."
- /bin/zsh
- else
- eindent
- if [ -r /etc/grml/screenrc ] ; then
- einfo "Starting GNU screen to be able to use a full featured shell environment."
- einfo "Just exit the shells (and therefore screen) to continue boot process..."
- /bin/zsh -c "screen -c /etc/grml/screenrc"
- else
- einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
- einfo "Just exit the shell to continue boot process..."
- /bin/zsh
- fi
- eoutdent
- fi
- fi
- }
-}
-# }}}
-
# {{{ log
config_log(){
if checkbootparam 'log' || checkbootparam 'debug' ; then
export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
- touch $DEBUG
- einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
- eindent
- einfo "Starting bootlogd." # known to be *very* unreliable :(
- bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
- eoutdent
+ touch "${DEBUG}"
+ einfo "Bootparameter log found, debug log file from grml-autoconfig available at '${DEBUG}'"
else
DEBUG="/dev/null"
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(){
- einfo "Activating language settings:"
- eindent
+ einfo "Activating language settings:"
+ eindent
- # people can specify $LANGUAGE and $CONSOLEFONT in a config file
- [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
+ # people can specify $LANGUAGE and $CONSOLEFONT in a config file
+ [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
- # check for bootoption which overrides config from /etc/grml/autoconfig
- BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
- [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
+ # check for bootoption which overrides config from /etc/grml/autoconfig
+ BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
+ [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
- # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
- if [ -z "$INSTALLED" ] ; then
+ # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
+ if [ -z "$INSTALLED" ] ; then
[ -n "$LANGUAGE" ] || LANGUAGE='en'
- fi
+ fi
- 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"
- # otherwise default to lang=en
- else
- checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en"
- fi
- fi
+ if [ -x /usr/sbin/grml-setlang ] ; then
+ # if bootoption lang is used update /etc/default/locale accordingly
+ if [ -n "$BOOT_LANGUAGE" ] ; then
+ /usr/sbin/grml-setlang "$LANGUAGE"
+ # otherwise default to lang=en
+ else
+ /usr/sbin/grml-setlang "en"
+ fi
+ fi
- # set console font
- if [ -z "$CONSOLEFONT" ] ; then
- if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
- if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
+ if ! $SYSTEMD ; then
+ # set console font
+ if [ -z "$CONSOLEFONT" ] ; then
+ if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
+ if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
CONSOLEFONT='Uni3-Terminus16'
- else
- ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
- fi
- if ! hasfb ; then
+ else
+ ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-setup-linux." ; eend 1
+ fi
+ if ! hasfb ; then
CONSOLEFONT='Lat15-Terminus16'
- fi
+ fi
+ fi
fi
- fi
+ fi # not running systemd
+
+ # export it now, so error messages get translated, too
+ [ -r /etc/default/locale ] && . /etc/default/locale
+ export LANG LANGUAGE
+
+ if $SYSTEMD ; then
+ local KEYBOARD
+ KEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
+ [ -n "$KEYBOARD" ] || KEYBOARD="$LANGUAGE"
+ # "symbols/en" doesn't exist, so rewrite to "us"
+ [[ "$KEYBOARD" == 'en' ]] && KEYBOARD="us"
+
+ if [ -r /etc/default/keyboard ] ; then
+ sed -i "s/^XKBLAYOUT=.*/XKBLAYOUT=\"$KEYBOARD\"/" /etc/default/keyboard
+
+ case "$KEYBOARD" in
+ de|at)
+ sed -i "s/^XKBVARIANT=.*/XKBVARIANT=\"nodeadkeys\"/" /etc/default/keyboard
+ ;;
+ esac
- # 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
+ fi
+ service_wrapper console-setup restart >>$DEBUG 2>&1 ; eend $?
+ else # not running systemd, keeing for backwards compatibility:
+ # configure keyboard layout, read in already set values first:
+ [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
+
+ # now allow keyboard override by boot commandline for later use:
+ KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
+ [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
+ # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
+ [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
+ [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
+
+ # modify /etc/sysconfig/keyboard only in live-cd mode:
+ if [ -z "$INSTALLED" ] ; then
+
+ local LANGUAGE="$BOOT_LANGUAGE"
+ . /etc/grml/language-functions
+ # allow setting xkeyboard explicitly different than console keyboard
+ KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
+ if [ -n "$KXKEYBOARD" ]; then
+ XKEYBOARD="$KXKEYBOARD"
+ KDEKEYBOARD="$KXKEYBOARD"
+ elif [ -n "$KKEYBOARD" ]; then
+ XKEYBOARD="$KKEYBOARD"
+ KDEKEYBOARD="$KKEYBOARD"
+ fi
- # configure keyboard layout, read in already set values first:
- [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
-
- # now allow keyboard override by boot commandline for later use:
- KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
- [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
- # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
- [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
- [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
-
- # modify /etc/sysconfig/keyboard only in live-cd mode:
- if [ -z "$INSTALLED" ] ; then
-
- local LANGUAGE="$BOOT_LANGUAGE"
- . /etc/grml/language-functions
- # allow setting xkeyboard explicitly different than console keyboard
- KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
- if [ -n "$KXKEYBOARD" ]; then
- XKEYBOARD="$KXKEYBOARD"
- KDEKEYBOARD="$KXKEYBOARD"
- elif [ -n "$KKEYBOARD" ]; then
- XKEYBOARD="$KKEYBOARD"
- KDEKEYBOARD="$KKEYBOARD"
- fi
+ # duplicate of previous code to make sure /etc/grml/language-functions
+ # does not overwrite our values....
+ # now allow keyboard override by boot commandline for later use:
+ KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
+ [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
+ # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
+ [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
+ [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
+
+ # write keyboard related variables to file for later use
+ [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
+ if ! [ -e /etc/sysconfig/keyboard ] ; then
+ echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
+ echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
+ echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
+ echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
+ fi
+ fi
- # duplicate of previous code to make sure /etc/grml/language-functions
- # does not overwrite our values....
- # now allow keyboard override by boot commandline for later use:
- KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
- [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
- # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
- [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
- [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
-
- # write keyboard related variables to file for later use
- [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
- if ! [ -e /etc/sysconfig/keyboard ] ; then
- echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
- echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
- echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
- echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
- fi
- fi
+ [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
+ fi
- [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
- # activate unicode console if running within utf8 environment
- if [ -r /etc/default/locale ] ; then
- if grep -q "LANG=.*UTF" /etc/default/locale ; then
- einfo "Setting up unicode environment."
- unicode_start >>$DEBUG 2>&1 ; eend $?
+ if ! $SYSTEMD ; then
+ # we have to set up all consoles, therefore loop it over all ttys:
+ NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
+ if [ -n "$NUM_CONSOLES" ] ; then
+ NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
+ [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
fi
- fi
-
- # Set default keyboard before interactive setup
- if [ -n "$KEYTABLE" ] ; then
- einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
- loadkeys -q $KEYTABLE &
- eend $?
- fi
+ CUR_CONSOLE=$(fgconsole 2>/dev/null)
- # we have to set up all consoles, therefore loop it over all ttys:
- NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
- if [ -n "$NUM_CONSOLES" ] ; then
- NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
- [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
- fi
- CUR_CONSOLE=$(fgconsole 2>/dev/null)
-
- if [ -x "$(which setfont)" ] ; then
- use_setfont=true
- elif [ -x "$(which consolechars)" ] ; then
- use_consolechars=true
- else
- eerror "Neither setfont nor consolechars tool present, can not set font."
- eend 1
- return 1
- fi
+ if [ -x "$(which setfont)" ] ; then
+ use_setfont=true
+ elif [ -x "$(which consolechars)" ] ; then
+ use_consolechars=true
+ else
+ eerror "Neither setfont nor consolechars tool present, can not set font."
+ eend 1
+ return 1
+ fi
- if [ -n "$CHARMAP" ] ; then
- einfo "Setting font to ${CHARMAP}"
- RC=0
- for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+ if [ -n "$CHARMAP" ] ; then
+ einfo "Setting font to ${CHARMAP}"
+ RC=0
+ for vc in $(seq 0 ${NUM_CONSOLES}) ; do
if $use_setfont ; then
setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
elif $use_consolechars ; then
consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
fi
- done
- if [ -n "$CUR_CONSOLE" ] ; then
- [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+ done
+ if [ -n "$CUR_CONSOLE" ] ; then
+ [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+ fi
+ eend $RC
fi
- eend $RC
- fi
- if checkbootparam 'noconsolefont' ; then
- ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
- else
- if [ -n "$CONSOLEFONT" ] ; then
- einfo "Setting font to ${CONSOLEFONT}"
- RC=0
- for vc in $(seq 0 ${NUM_CONSOLES}) ; do
- if $use_setfont ; then
- setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
- elif $use_consolechars ; then
- consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
- fi
- done
- if [ -n "$CUR_CONSOLE" ] ; then
+ if checkbootparam 'noconsolefont' ; then
+ ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
+ else
+ if [ -n "$CONSOLEFONT" ] ; then
+ einfo "Setting font to ${CONSOLEFONT}"
+ RC=0
+ for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+ if $use_setfont ; then
+ setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
+ elif $use_consolechars ; then
+ consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
+ fi
+ done
+ if [ -n "$CUR_CONSOLE" ] ; then
[ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
- fi
- eend $RC
+ fi
+ eend $RC
+ fi
+ fi
+
+ # Set default keyboard before interactive setup
+ if [ -n "$KEYTABLE" ] ; then
+ einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
+ loadkeys -q $KEYTABLE &
+ eend $?
fi
- fi
- eoutdent
+ # activate unicode console if running within utf8 environment
+ if [ -r /etc/default/locale ] ; then
+ if grep -q "LANG=.*UTF" /etc/default/locale ; then
+ einfo "Setting up unicode environment."
+ unicode_start ; eend $?
+ fi
+ fi
+ fi # not running systemd
+
+ eoutdent
}
# }}}
# {{{ 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)
}
# }}}
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
# {{{ 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
}
# }}}
-# {{{ 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
+# helper function to check whether we're running under (enabled) Secure Boot
+running_under_secureboot() {
+ # systemd does this for us, but if we are not running under systemd then mokutil
+ # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
+ # /sys/firmware/efi/vars would exist)
+ if ! $SYSTEMD ; then
+ if modprobe efivarfs &>/dev/null ; then
+ mount -t efivarfs efivarfs /sys/firmware/efi/efivars
+ fi
+ fi
+
+ if [[ -x "$(command -v mokutil)" ]] ; then
+ if mokutil --sb-state 2>/dev/null | grep -q 'SecureBoot enabled' ; then
+ return 0
+ else
+ return 1
+ fi
+ else
+ if modprobe efivarfs &>/dev/null ; then
+ if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
+ return 0
+ else
+ return 1
+ fi
+ fi
+ fi
+}
+
+config_secureboot(){
+ if running_under_secureboot ; then
+ einfo "SecureBoot is enabled" ; eend 0
+ else
+ einfo "SecureBoot not detected" ; eend 0
+ fi
}
# }}}
}
# }}}
-# 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
+ # this hack is no longer necessary with systemd
+ if $SYSTEMD ; then
+ return
+ fi
+
local line
local ws
ws=' '
}
# }}}
-# {{{ 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
-}
-# }}}
-
-# {{{ 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 checkbootparam 'testcd' ; then
+ einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
+ eindent
- 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
+ local ERROR=true
+ local FOUND_FILE=false
+ local logfile='/tmp/md5sum.log'
- 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
+ rm -f "$logfile"
+
+ for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
+ einfo "Checking files against $md5, this may take a while..."
+
+ 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 ; then
+ eerror 'Error: Could not find md5sum file' ; eend 1
+ return
+ 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
}
# }}}
# {{{ 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"
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
}
# }}}
-# {{{ 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 <<EOT
-$(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
-EOT
-}
-check_partitions >/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
+# {{{ Start brltty
+config_brltty() {
+ if checkbootparam 'brltty' ; then
+ einfo "Starting brltty service as requested on boot commandline."
+ service_wrapper brltty start ; eend $?
+ fi
}
# }}}
}
# }}}
-# {{{ 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
- ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
- return 0
-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
+ if checkbootparam 'nocpu'; then
+ ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
+ return 0
+ fi
-# no cpufreq setup inside VirtualBox
-if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
- einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
- return 0
-fi
+ if ! [ -x "$(which lscpu)" ] ; then
+ ewarn "Skipping CPU detection due to lack of lscpu."; eend 0
+ return 0
+ fi
-if [ -x /etc/init.d/loadcpufreq ] ; then
- 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
- ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
- fi
- fi
+ local cpu_info num_cpus
- rm -f $LOADCPUFREQ
+ cpu_info="$(lscpu | sed -n '/^Model name:/s/[^:]*:\s*//p')"
+ num_cpus=$(grep -c processor /proc/cpuinfo)
- 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
+ einfo "Found ${num_cpus} CPU(s): ${cpu_info}"
+ eend 0
}
# }}}
# {{{ 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
+if checkbootparam 'ssh' ; then
+ local PASSWD
+ PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
- if [ -n "$SSH_PASSWD" ] ; then
- ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
- fi
+ 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 haveged start >>$DEBUG 2>>$DEBUG
+ service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
+ service_wrapper ssh start background >>$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
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."
# 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
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
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
}
# }}}
-# {{{ 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
-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 [ -n "$PASSWD" ] ; then
+ chpass_options=""
+ if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
+ chpass_options="-m"
+ 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
+ echo "$localuser:$PASSWD" | chpasswd $chpass_options
+ echo "root:$PASSWD" | chpasswd $chpass_options
- 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}."
+ eindent
+ ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
+ eoutdent
+ fi
- if checkbootparam 'micvol' ; then
- MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
- else
- MICVOL=0
- fi
+fi
- for CONTROL in Master PCM ; do
- if amixer -q | grep -q "Simple mixer control '$CONTROL'" ; then
- amixer -q set "${CONTROL}" "${VOL}"%
- eend $?
- fi
- done
+if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
+ local PASSWD
+ PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
- if [ ${MICVOL} -ne 0 ] ; then
- einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
- amixer -q set "Mic" $MICVOL &> /dev/null
- eend $?
- fi
- fi # checkbootparam 'nosound'
- eoutdent
- done
- fi
-}
-# }}}
+ if [ -z "$PASSWD" ] ; then
+ eerror "No hashed password found, can not set password."
+ eend 1
+ return
+ fi
-# {{{ 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
+ 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
}
# }}}
-# {{{ 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
+# {{{ Sound
+config_mixer () {
+ if ! [ -x /usr/bin/amixer ] ; then
+ logger -t grml-autoconfig "amixer binary not available"
+ return
+ fi
+
+ if ! [ -r /proc/asound/cards ] ; then
+ ewarn "No soundcard present, skipping mixer settings therefore."
+ eend 0
+ 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 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
- [ -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 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}."
+
+ if checkbootparam 'micvol' ; then
+ MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+ einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
+ else
+ MICVOL=0
+ fi
+
+ CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
+ IFSOLD=${IFS:-}
+ IFS=$'\n'
+ 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
}
# }}}
-# {{{ 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 &
- # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
+ service_wrapper gpm start background >>$DEBUG
eend 0
- fi
- fi
+ fi
+ fi
}
# }}}
# 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 background >>$DEBUG
fi
done
eend $?
--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 ))
}
# }}}
-# {{{ 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
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'
- cat>|/etc/init.d/xstartup<<EOF
+ config_userlocal
+ if $SYSTEMD ; then
+ if [ -n "$WINDOWMANAGER" ] ; then
+ mkdir -p /var/run/grml-x/
+ echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
+ fi
+ chvt 7
+ return
+ fi
+ cat>|/etc/init.d/startx<<EOF
#!/bin/sh
-su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
+su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
EOF
- chmod 755 /etc/init.d/xstartup
+ chmod 755 /etc/init.d/startx
- # adjust inittab for xstartup
+ # adjust inittab for startx
if grep -q '^6:' /etc/inittab ; then
- sed -i 's|^6:.*|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
+ sed -i 's|^6:.*|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
else # just append tty6 to inittab if no definition is present:
- 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
+ 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 $?
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
# 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
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
+ 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
+
if [ -n "$DCSDEVICE" ]; then
DCSMP="/mnt/grmlcfg"
fi
# 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
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
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
# 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
# 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
}
# }}}
-# {{{ 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
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 'mdadm --assemble --scan' 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:"
eindent
IFSOLD=${IFS:-}
- IFS='
-'
- for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
+ IFS=$'\n'
+ for line in $(mdadm --assemble --scan 2>&1) ; do
case $line in
*'No arrays found'*)
ewarn "$line" ; eend 0
ewarn "No active arrays found" ; eend 0
else
IFSOLD=${IFS:-}
- IFS='
-'
+ IFS=$'\n'
for line in $(grep '^md[0-9]' /proc/mdstat) ; do
einfo "active arrays: $line" ; eend 0
done
fi
if ! [ -x /sbin/dmraid ] ; then
- eerror "dmraid not available, can not execute it." ; eend 1
+ ewarn "dmraid not available, can not execute it." ; eend 1
return
fi
[ -n "$1" ] || return 1
IFSOLD=${IFS:-}
- IFS='
-'
+ IFS=$'\n'
eindent
for line in $(dmraid $1 ; echo errcode:$?); do
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-pvscan@name' to activate LV or VG 'name' 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
+ einfo "Bootoption LVM found, enabling related services."
+ if [ -r /etc/init.d/lvm2-lvmetad ] ; then
+ service_wrapper lvm2-lvmetad start ; eend $?
+ fi
+ if [ -r /etc/init.d/lvm2-lvmpolld ] ; then
+ service_wrapper lvm2-lvmpolld start ; eend $?
+ fi
+ einfo "Searching for logical volumes and enabling them:"
+ vgchange -ay ; eend $?
+ else
+ einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
+ service_wrapper lvm2 start ; eend $?
+ fi
fi
eoutdent
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(){
}
# }}}
+# {{{ virtualbox shared folders
config_virtualbox_shared_folders() {
-if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
- einfo "VirtualBox detected, trying to set up Shared Folders."
- if ! modprobe -l | grep -q vboxsf.ko ; 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
+ if ! $VIRTUALBOX ; then
+ return
+ fi
+
+ if checkbootparam 'novboxsf' ; then
+ ewarn "Skipping VirtualBox Shared Folders setup as requested on boot commandline." ; eend 0
else
- eindent
+ einfo "VirtualBox detected, trying to set up Shared Folders."
+ if ! modinfo vboxsf &>/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
chmod 660 /dev/vboxguest
eend $?
- if [ -n "$CONFIG_FSTAB_USER" ] ; then
- fstabuser="$CONFIG_FSTAB_USER"
- else
- fstabuser=$(getent passwd 1000 | cut -d: -f1)
- fi
- einfo "Adding $fstabuser to group vboxsf."
- adduser grml vboxsf &>/dev/null
+ config_userfstab
+
+ einfo "Adding user ${fstabuser:-grml} to group vboxsf."
+ adduser "${fstabuser:-grml}" vboxsf >>"${DEBUG}" 2>&1
eend $?
einfo "Starting VBoxService."
- VBoxService >/dev/null &
+ VBoxService >/dev/null
eend $?
- eoutdent
+ local vbautomation='automation'
+ if checkbootparam 'vbautomation'; then
+ vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
+ fi
+
+ if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}(\s+|$)" ; 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
-fi
}
+# }}}
+
+# {{{ VirtualBox application
+config_virtualbox_setup() {
+ if checkbootparam 'novbox' ; then
+ ewarn "Skipping VirtualBox setup as requested on boot commandline." ; eend 0
+ return
+ fi
+
+ if ! [ -x /usr/bin/VBox ] ; then
+ return
+ fi
+
+ if running_under_secureboot ; then
+ ewarn "VirtualBox service can not be started as running under enabled Secure Boot." ; eend 0
+ return
+ fi
+
+ einfo "VirtualBox service detected, trying to set up."
+ service_wrapper vboxdrv restart >>"${DEBUG}" 2>&1 ; eend $?
+
+ config_userfstab
+
+ einfo "Adding user ${fstabuser:-grml} to group vboxusers."
+ adduser "${fstabuser:-grml}" vboxusers >>"${DEBUG}" 2>&1
+ eend $?
+}
+# }}}
# {{{ Support customization
config_distri(){
if checkbootparam 'distri'; then
DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
- [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
# make sure the desktop.jpg file is not a symlink, so copying does not file then
[ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
}
# }}}
+# {{{ Easteregg (for 20 years grml.org)
+config_easteregg() {
+ current_date=$(date +%Y-%m-%d)
+ birthday="2023-09-16"
+ one_month_later=$(date -d "${current_date} + 1 month" +%Y-%m-%d)
+
+ einfo "You found the birthday easter egg!" ; eend 0
+
+ # nothing to be done if it's more than one month since $birthday
+ if ! [[ "${current_date}" == "${birthday}" || "${current_date}" == "${one_month_later}" ]]; then
+ return 0
+ fi
+
+ if [[ -x /bin/toilet && -x /usr/games/lolcat ]] ; then
+ visualize() { printf "%s\n" "$*" | toilet | /usr/games/lolcat ; }
+ elif [[ -x /bin/toilet ]] ; then
+ visualize() { printf "%s\n" "$*" | toilet ; }
+ else
+ visualize() { printf "%s\n" "$*" ; }
+ fi
+
+ visualize " \o/ "
+ visualize "20 years"
+ visualize "grml.org"
+}
+# }}}
+
## END OF FILE #################################################################
-# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3
+# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2