X-Git-Url: http://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=07e09800936dc4d4c1c55a531d45f4cf65dc8b74;hp=6c729c6bf5fe9314737c684c5bd772f685b621cc;hb=863744b19ebd06192addb6287c47cec4f5f94b2d;hpb=394341318bdafc64bc63ccdc2ed1be53af91c5b4 diff --git a/autoconfig.functions b/autoconfig.functions index 6c729c6..07e0980 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -176,7 +176,7 @@ if checkbootparam 'log' || checkbootparam 'debug' ; then einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot" eindent einfo "Starting bootlogd." # known to be *very* unreliable :( - bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $? + bootlogd -r -c >>$DEBUG 2>&1 ; eend $? eoutdent else DEBUG="/dev/null" @@ -189,7 +189,7 @@ config_fwtimeout(){ if checkbootparam 'fwtimeout' ; then TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)" einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module." - rmmod firmware_class 1>>$DEBUG 2>&1 + rmmod firmware_class >>$DEBUG 2>&1 modprobe firmware_class ; eend $? fi if [ -z "$TIMEOUT" ] ; then @@ -208,34 +208,31 @@ config_language(){ einfo "Activating language settings:" eindent - # people can specify $LANGUAGE and $CONSOLEFONT in a config file: + # people can specify $LANGUAGE and $CONSOLEFONT in a config file [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig - grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8='' - - # check for bootoption which overrides config from /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" - # set default to 'en' in live-cd mode if $LANGUAGE is not yet set: + # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet if [ -z "$INSTALLED" ] ; then [ -n "$LANGUAGE" ] || LANGUAGE='en' fi - # if bootoption lang is used update /etc/default/locale, otherwise *not*! - if [ -n "$BOOT_LANGUAGE" -a -x /usr/sbin/grml-setlang ] ; then - if checkgrmlsmall ; then - /usr/sbin/grml-setlang "POSIX" - else - /usr/sbin/grml-setlang "$LANGUAGE" - fi + 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 # set console font if [ -z "$CONSOLEFONT" ] ; then if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then - # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16' - # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then CONSOLEFONT='Uni3-Terminus16' else @@ -305,7 +302,7 @@ config_language(){ if [ -r /etc/default/locale ] ; then if grep -q "LANG=.*UTF" /etc/default/locale ; then einfo "Setting up unicode environment." - unicode_start 2>>$DEBUG ; eend $? + unicode_start >>$DEBUG 2>&1 ; eend $? fi fi @@ -317,17 +314,21 @@ config_language(){ fi # we have to set up all consoles, therefore loop it over all ttys: - NUM_CONSOLES=$(fgconsole --next-available) - NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1) - [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6 - CUR_CONSOLE=$(fgconsole) - + 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 [ -n "$CHARMAP" ] ; then einfo "Running consolechars for ${CHARMAP}" - for vc in `seq 0 ${NUM_CONSOLES}` ; do + RC=0 + for vc in $(seq 0 ${NUM_CONSOLES}) ; do consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$? done - [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE + if [ -n "$CUR_CONSOLE" ] ; then + [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE + fi eend $RC fi @@ -336,11 +337,14 @@ config_language(){ else if [ -n "$CONSOLEFONT" ] ; then einfo "Running consolechars using ${CONSOLEFONT}" - for vc in `seq 0 ${NUM_CONSOLES}` ; do + RC=0 + for vc in $(seq 0 ${NUM_CONSOLES}) ; do consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$? done - [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE - eend $? + if [ -n "$CUR_CONSOLE" ] ; then + [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE + fi + eend $RC fi fi @@ -352,9 +356,15 @@ config_language(){ config_hostname(){ if checkbootparam 'hostname' ; then 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 $? + fi einfo "Setting hostname to $HOSTNAME as requested." - sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts - hostname $HOSTNAME ; eend $? + grml-hostname $HOSTNAME >>$DEBUG ; RC=$? + [ "$RC" = "0" ] && hostname $HOSTNAME + eend $RC else hostname --file /etc/hostname fi @@ -570,21 +580,55 @@ fi # activate serial console {{{ config_console(){ if checkbootparam 'console'; then - einfo "Bootoption (for serial) console detected." - eindent - if [ -r /etc/mgetty/mgetty.config ] ; then - MODE=$(getbootparam 'console' | awk -F, '{print $2}') - MODE=${MODE%%n*} - [ -n "$MODE" ] || MODE=9600 # default mode - einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps" - sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $? - fi + local line + local ws + ws=' ' - einfo "Activating mgetty." - sed -i 's/^#T0/T0/' /etc/inittab - sed -i 's/^#T1/T1/' /etc/inittab - /sbin/telinit q ; eend $? - eoutdent + einfo "Bootoption for serial console detected:" + + line="$CMDLINE x " + this="" + line="${line#*[$ws]}" + local telinitq="" + while [ -n "$line" ]; do + case "$this" in + console=*) + local serial="$this" + local device="${this%%,*}" + local device="${device##*=}" + if echo $serial | grep -q ttyS ; then + local option="${serial##*,}" + # default (works for kvm & CO): + local speed="115200,57600,38400,19200,9600,4800,2400,1200"; + # ... unless overriden by command line: + case "$option" in + 115200*) speed=115200 ;; + 57600*) speed=57600 ;; + 38400*) speed=38400 ;; + 19200*) speed=19200 ;; + 9600*) speed=9600 ;; + 4800*) speed=4800 ;; + 2400*) speed=2400 ;; + 1200*) speed=1200 ;; + esac + eindent + einfo "Activating console login on device ${device} with speed ${speed}." + local number="${device#ttyS}" + sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/bin/zsh-login $speed vt100 || sleep 30\"" /etc/inittab + eend $? + telinitq="1" + eoutdent + fi + ;; + esac + this="${line%%[$ws]*}" + line="${line#*[$ws]}" + done + + if [ -n "$telinitq" ]; then + /sbin/telinit q + fi + eend $? fi } # }}} @@ -681,7 +725,7 @@ else eindent einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)" eoutdent - /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 & + /sbin/discover-modprobe -v >>$DEBUG 2>&1 & eend 0 else eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0 @@ -738,11 +782,11 @@ if checkbootparam 'nohotplug' ; then else if [ -r /etc/init.d/hotplug ] ; then einfo "Starting hotplug system in background." - /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG & + /etc/init.d/hotplug start >>$DEBUG 2>>$DEBUG & eend 0 elif [ -r /etc/init.d/hotplug-light ] ; then einfo "Starting hotplug-light system in background." - /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG & + /etc/init.d/hotplug-light start >>$DEBUG 2>>$DEBUG & eend 0 else ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0 @@ -807,7 +851,7 @@ if [ -d /proc/acpi ]; then if ! ps x | grep -q /usr/sbin/acpid ; then if ! [ -r /var/run/dbus/pid ] ; then einfo "Starting acpi daemon." - /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $? + /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $? else eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus." eerror "Solution: please activate acpid via /etc/runlevel.conf" @@ -1084,7 +1128,7 @@ done </dev/null 2>&1 # avoid output "check_partitions:3: read-only file system" +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 @@ -1295,59 +1339,6 @@ fi } # }}} -# {{{ helper functions -findfile(){ -FOUND="" -# search all partitions for a file in the root directory -for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do -# See if it's already mounted - [ -f "$i/$1" ] && { echo "$i/$1"; return 0; } - if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then - [ -f "$i/$1" ] && FOUND="$i/$1" - umount -l "$i" 2>>$DEBUG - [ -n "$FOUND" ] && { echo "$FOUND"; return 0; } - fi -done -return 2 -} - -fstype(){ -case "$(file -s $1)" in - *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;; - *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;; - *[Xx][Ff][Ss]*) echo "xfs"; return 0;; - *[Ee][Xx][Tt]3*) echo "ext3"; return 0;; - *[Ee][Xx][Tt]2*) echo "ext2"; return 0;; - *data*) echo "invalid"; return 0;; - *) echo "auto"; return 0;; -esac -} - -# Try to mount this filesystem read-only, without or with encryption -trymount(){ -# Check if already mounted -case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac -# Apparently, mount-aes DOES autodetect AES loopback files. -[ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; } -# We need to mount crypto-loop files with initial rw support -[ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; } -# Mount succeeded? -[ "$RC" = "0" ] && return 0 -echo "" -einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption." -a="y" -while [ "$a" != "n" -a "$a" != "N" ]; do -# We need to mount crypto-loop files with initial rw support - mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0 - echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}" - # Problem with ioctl() from getpasswd()? - # read a - read a -done -return 1 -} -# }}} - # {{{ CPU-detection config_cpu(){ if checkbootparam 'nocpu'; then @@ -1419,21 +1410,23 @@ else . /usr/bin/cpufreq-detect.sh if [ -n "$MODULE" -a "$MODULE" != none ]; then einfo "Loading modules ${MODULE}" - modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG + modprobe "$MODULE" >>$DEBUG || modprobe "$MODULE_FALLBACK" >>$DEBUG RC=$? - if [[ $RC == 0 ]]; then + if [[ "$RC" == 0 ]]; then eend 0 else SKIP_CPU_GOVERNOR=1 - eend $1 + eend $RC fi else - ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1 + ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." + eend 1 fi # $MODULE fi # loadcpufreq if [ -z "$SKIP_CPU_GOVERNOR" ] ; then einfo "Loading cpufreq_ondemand, setting ondemand governor" + RC=0 if modprobe cpufreq_ondemand ; RC=$? ; then for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do echo ondemand > $file @@ -1490,8 +1483,8 @@ if checkbootparam 'ssh' ; then fi einfo 'Starting secure shell server in background.' - /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG - /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG & + /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG + /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG & eend $? eindent @@ -1547,6 +1540,15 @@ if checkbootparam 'vnc' ; then /bin/chown -R "$USER": "$VNCDIR" fi fi + if checkbootparam 'vnc_connect' ; then + VNC_CONNECT='' + 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" + [ -d "$VNCDIR" ] || mkdir "$VNCDIR" + echo " --connect $VNC_CONNECT " >> $VNCDIR/options + fi fi } # }}} @@ -1571,84 +1573,8 @@ fi # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file. config_homedir(){ if checkbootparam 'home' ; then - HOMEDIR="$(getbootparam 'home')" - MYHOMEDEVICE="" - MYHOMEMOUNTPOINT="" - MYHOMEDIR="" - if [ -n "$HOMEDIR" ]; then - einfo "Bootoption home detected." && eend 0 - case "$HOMEDIR" in - /dev/*) - MYHOMEDEVICE="${HOMEDIR##/dev/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - MYHOMEDIR="/mnt/${HOMEDIR##/dev/}" - ;; - /mnt/*) - MYHOMEDEVICE="${HOMEDIR##/mnt/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - MYHOMEDIR="$HOMEDIR" - ;; - [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd]) - MYHOMEDIR="$(findfile grml.img)" - MYHOMEDEVICE="${MYHOMEDIR##/mnt/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - ;; - *) - eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1 - eerror "Option ignored." ; eend 1 - ;; - esac - fi # -n $HOMEDIR - - if [ -n "$MYHOMEDIR" ]; then - if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then - [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img" - while read device mountpoint fs relax; do - case "$mountpoint" in *$MYHOMEMOUNTPOINT*) - case "$fs" in - *[Nn][Tt][Ff][Ss]*) - umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1 - break - ;; - *[Ff][Aa][Tt]*) - # Note: This currently won't work with encrypted partitions - umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT" - if [ ! -f "$MYHOMEDIR" ]; then - ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)." - ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img." - fi - ;; - esac - - if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then - einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}." - if [ -f "$MYHOMEDIR" ]; then - # It's a loopback file, mount it over the /home/grml directory - trymount "$MYHOMEDIR" /home/grml - RC="$?" - [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)" - RC="$?" - else - # Do a --bind mount - ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)" - RC="$?" - fi # -f $MYHOMEDIR - - [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 ) - - fi # mount -o remount,rw,... - break - ;; - esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*) - done </dev/null 2>>$DEBUG ; then + if amixer -q get Front >/dev/null 2>>$DEBUG ; then amixer -q set Front unmute &>/dev/null amixer -q set Front ${VOL}% &>/dev/null fi @@ -1827,7 +1753,7 @@ config_syslog(){ eerror "No syslog daemon found." ; eend 1 else einfo "Starting $SYSLOGD in background." - /etc/init.d/$SYSLOGD start 1>>$DEBUG & + /etc/init.d/$SYSLOGD start >>$DEBUG & eend 0 fi fi @@ -1843,8 +1769,8 @@ config_gpm(){ eerror "No mouse found - not starting GPM." ; eend 1 else einfo "Starting gpm in background." - /etc/init.d/gpm start 1>>$DEBUG & - # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) & + /etc/init.d/gpm start >>$DEBUG & + # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) & eend 0 fi fi @@ -1859,7 +1785,7 @@ config_services(){ SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g') einfo "Starting service(s) ${SERVICENL} in background." for service in $(echo -e $SERVICELIST) ; do - /etc/init.d/${service} start 1>>$DEBUG & + /etc/init.d/${service} start >>$DEBUG & done [ "$?" == "0" ] ; eend $? fi @@ -1916,7 +1842,7 @@ config_netscript() { if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then chmod +x ${SCRIPTFILE} - einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && ${SCRIPTFILE} ; eend $? + einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $? fi fi @@ -1969,20 +1895,19 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t else einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0 fi - einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles." + 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<>$DEBUG +su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER" EOF chmod 755 /etc/init.d/xstartup # adjust inittab for xstartup if grep -q '^6:' /etc/inittab ; then - sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab + sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>\&1 > /etc/inittab + echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab fi /sbin/telinit q ; eend $? @@ -2040,8 +1965,8 @@ else # 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 1>>$DEBUG 2>&1 ; then - blkid /dev/fd0 1>>$DEBUG 2>&1 + 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}') @@ -2062,7 +1987,7 @@ else ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0 else [ -d $DCSMP ] || mkdir $DCSMP - umount $DCSMP 1>>$DEBUG 2>&1 # make sure it is not mounted + umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted mount -o ro -t auto $DCSDEVICE $DCSMP ; RC="$?" if [[ $RC == 0 ]]; then einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0 @@ -2111,6 +2036,7 @@ fi # {{{ /cdrom/.*-options config_debs(){ if checkbootparam 'debs' ; then + iszsh && setopt localoptions shwordsplit DEBS="$(getbootparam 'debs' 2>>$DEBUG)" if ! echo $DEBS | grep -q '/'; then # backwards compatibility: if no path is given get debs from debs/ @@ -2246,7 +2172,7 @@ if checkbootparam 'distcc' ; then ) einfo "Starting distcc for network ${NET}, listening on ${IP}." - /etc/init.d/distcc start 1>/dev/null ; eend $? + /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 @@ -2341,9 +2267,10 @@ fi # {{{ SW-RAID config_swraid(){ - if [ -z "$INSTALLED" ] ; then + [ -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' -o \ + if checkbootparam 'noraid' || checkbootparam 'noswraid' || \ checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0 else @@ -2404,14 +2331,83 @@ config_swraid(){ fi # is /sbin/mdadm executable? fi # check for bootoptions - fi # run only in live-cd mode +} +# }}} + +# {{{ dmraid +config_dmraid(){ + [ -n "$INSTALLED" ] && return 0 + + if checkbootparam 'nodmraid' ; then + ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0 + return 0 + fi + + if ! [ -x /sbin/dmraid ] ; then + eerror "dmraid not available, can not execute it." ; eend 1 + return + fi + + dmraid_wrapper() { + # usage: dmraid_wrapper + [ -n "$1" ] || return 1 + + IFSOLD=${IFS:-} + IFS=' +' + eindent + + for line in $(dmraid $1 ; echo errcode:$?); do + case $line in + *'no block devices found'*) + einfo "No block devices found" ; eend 0 + break + ;; + *'no raid disks'*) + einfo "No active dmraid devices found" ; eend 0 + break + ;; + errcode:0) + eend 0; + ;; + errcode:1) + eend 1 + ;; + *) + einfo "$line" + ;; + esac + done + + eoutdent + IFS=$IFSOLD + } + + if checkbootparam 'dmraid' ; then + local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)" + if [ "$ACTION" = "off" ] ; then + # Deactivates all active software RAID sets: + einfo "Deactivating present dmraid sets (as requested via dmraid=off):" + dmraid_wrapper -an + else + # Activate all software RAID sets discovered: + einfo "Activating present dmraid sets (as requested via dmraid):" + dmraid_wrapper -ay + fi + + return + fi + + # by default (no special bootoptions) discover all software RAID devices: + einfo "Searching for any present dmraid sets:" + dmraid_wrapper -r } # }}} # {{{ LVM (Logical Volumes) config_lvm(){ - if [ -z "$INSTALLED" ] ; then - # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption + [ -n "$INSTALLED" ] && return 0 + if checkbootparam 'nolvm' ; then ewarn "Skipping LVM code as requested on boot commandline." ; eend 0 else @@ -2419,7 +2415,7 @@ config_lvm(){ if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then eerror "LVM not available, can not execute it." ; eend 1 else - if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then + 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." @@ -2432,21 +2428,20 @@ config_lvm(){ fi fi # check for lvm binary fi # check for bootoption nolvm - fi # run only in live-cd mode } # }}} # {{{ debnet: setup network based on an existing one found on a partition config_debnet(){ if checkbootparam 'debnet' ; then - iszsh && setopt shwordsplit + iszsh && setopt localoptions shwordsplit DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")" DEVICES="$DEVICES $(ls /dev/mapper/*)" FOUND_DEBNET="" einfo "Bootoption 'debnet' found. Searching for Debian network configuration: " eindent - if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then + if ! mount | grep '/mnt ' >/dev/null 2>&1 ; then for i in $DEVICES; do if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then einfo "Scanning on $i" @@ -2461,8 +2456,8 @@ if checkbootparam 'debnet' ; then if [ -n "$FOUND_DEBNET" ]; then einfo "Stopping network." - pump -k 1>/dev/null 2>&1 - /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $? + pump -k >/dev/null 2>&1 + /etc/init.d/networking stop >/dev/null 2>&1 ; eend $? einfo "Copying Debian network configuration from $FOUND_DEBNET to running system." rm -rf /etc/network/run cp -a /mnt/etc/network /etc