Rework config_swspeak once more, move code to script 'swspeak'
[grml-autoconfig.git] / autoconfig.functions
index cd3c764..0084161 100755 (executable)
@@ -4,7 +4,6 @@
 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Son Jän 20 19:51:41 CET 2008 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -13,6 +12,11 @@ DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 umask 022
 
+# old linuxrc version:
+[ -d /cdrom ]      && export LIVECD_PATH=/cdrom
+# new initramfs layout:
+[ -d /live/image ] && export LIVECD_PATH=/live/image
+
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
@@ -72,6 +76,11 @@ checkgrmlsmall(){
 checkgrmlusb(){
   grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
+
+# execute flite only if it's present
+flitewrapper() {
+   [ -x /usr/bin/flite ] && flite -o play -t "$*"
+}
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -91,7 +100,7 @@ mount_sys(){
 # {{{ Read in boot parameters
 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
 CMDLINE="$(cat /proc/cmdline)"
-[ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
+[ -d "${LIVECD_PATH}"/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
 # }}}
 
 # {{{ Check if we are running from the grml-CD or HD
@@ -123,6 +132,8 @@ config_debug(){
   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
@@ -595,13 +606,8 @@ if [ -n "$TESTCD" ]; then
    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
    echo -n "${RED}"
 
-   # /linuxrc grml version:
-   [ -d /cdrom/GRML ]      && TESTCD_PATH=/cdrom/GRML
-   # live-initramfs version:
-   [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
-
-   if [ -n "$TESTCD_PATH" ] ; then
-      ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
+   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
@@ -817,27 +823,63 @@ fi
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
-if checkbootparam swspeak ; then
- if [ -d /proc/speakup/ ] ; then
-  einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
-  eindent
-   if [ -x /etc/init.d/speech-dispatcher ] ; then
-     einfo "Starting speech-dispatcher."
-     /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
-     einfo "Activating sftsyn in Kernel."
-     echo sftsyn >/proc/speakup/synth_name ; eend $?
-     einfo "Just run swspeak if you want to use software synthesizer via speakup."
-     flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
-   else
-    eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
-    flite -o play -t "speech-dispatcher not available. speakup will not work without it."
+   if checkbootparam swspeak ; then
+      einfo "Bootoption swspeak found."
+
+      if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
+         ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
+         eindent
+         einfo "Loading speakup_soft"
+         if modprobe speakup_soft ; then
+            eend 0
+         else
+            flitewrapper "Fatal error setting up software speakup"
+            eend 1
+            return 1
+         fi
+         eoutdent
+      fi
+
+      if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
+         einfo "Kernel supports speakup." ; eend 0
+         eindent
+            einfo "Just run swspeak if you want to use software synthesizer via speakup."
+            flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
+         eoutdent
+      else
+         eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
+         flitewrapper "Kernel does not seem to support speakup. Sorry."
+      fi
+   fi
+}
+# }}}
+
+# {{{ support hardware synthesizer via speakup
+config_hwspeak(){
+   if checkbootparam hwspeak ; then
+      einfo "Bootoption hwspeak found."
+
+      if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
+         ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
+         eindent
+         for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
+                         sed 's#.*speakup/##g ; s#.ko$##g' | \
+                         grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
+            einfo "Trying to load $module"
+            modprobe $module
+            eend $?
+         done
+         eoutdent
+      fi
+
+      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
+         einfo "Kernel should support speakup now." ; eend 0
+         flitewrapper "Kernel should support speakup now."
+      else
+         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
+         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
+      fi
    fi
-  eoutdent
- else
-  eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
-  flite -o play -t "Kernel does not seem to support speakup. Sorry."
- fi
-fi
 }
 # }}}
 
@@ -1240,10 +1282,12 @@ if checkbootparam "nocpu"; then
 else
   # check module dependencies
   cpufreq_check() {
-   if [ -e /lib64 ] ; then
-      [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
-   else
-      [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+   if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
+      if [ -e /lib64 ] ; then
+         [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
+      else
+         [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+      fi
    fi
   }
 
@@ -1337,20 +1381,46 @@ fi # checkbootparam nocpu
 # {{{ autostart of ssh
 config_ssh(){
 if checkbootparam ssh ; then
-  SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
-  einfo "Bootoption passwd found."
-  if [ -n "$SSH_PASSWD" ] ; then
-    echo "grml:$SSH_PASSWD" | chpasswd -m
-    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 &
-    eend 0
-  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!"
-  eoutdent
+   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 [ -n "$SSH_PASSWD" ] ; then
+         ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
+      fi
+   fi
+   eoutdent
+
+   # finally check if we have a password we can use:
+   if [ -n "$SSH_PASSWD" ] ; then
+      echo "grml:$SSH_PASSWD" | chpasswd -m
+   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 &
+   eend $?
+
+   eindent
+   ewarn 'Warning: please change the password for user grml as soon as possible!'
+   eoutdent
 fi
 }
 # }}}
@@ -1459,10 +1529,10 @@ fi # checkbootparam home
 # {{{ Check for scripts on CD-ROM
 config_cdrom_scripts(){
 if checkbootparam "script"; then
-  for script in /cdrom/scripts/* ; do
-    einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
-    . $script
-  done
+   for script in "${LIVECD_PATH}"/scripts/* ; do
+       einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
+       . $script
+   done
 fi
 }
 # }}}
@@ -1612,11 +1682,22 @@ config_wondershaper(){
 # {{{ syslog-ng
 config_syslog(){
  if checkbootparam "nosyslog"; then
-  ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
+    ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
-  einfo "Starting syslog-ng in background."
-  /etc/init.d/syslog-ng start 1>>$DEBUG &
-  eend 0
+    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 1>>$DEBUG &
+       eend 0
+    fi
  fi
 }
 # }}}
@@ -1626,10 +1707,14 @@ config_gpm(){
  if checkbootparam "nogpm"; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  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 ) &
-  eend 0
+   if ! [ -r /dev/input/mice ] ; then
+      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 ) &
+      eend 0
+   fi
  fi
 }
 # }}}
@@ -1682,7 +1767,7 @@ config_netconfig(){
 config_blindsound(){
  if checkbootparam "blind" ; then
     beep
-    flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
@@ -1690,7 +1775,7 @@ config_blindsound(){
 # {{{ welcome sound
 config_welcome(){
  if checkbootparam welcome ; then
-  flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
@@ -1771,13 +1856,13 @@ if checkbootparam noautoconfig || checkbootparam forensic ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
-  einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
+  einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
   eindent
   [ -d /mnt/grml ] || mkdir /mnt/grml
   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
 # 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. (Disable this via boot option: noautoconfig)"
+     einfo "Floppy device detected. Trying to access floppy disk."
 #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
      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
@@ -1821,7 +1906,7 @@ if checkbootparam "config" ; then
   einfo "Bootoption config found. config is set to: $CONFIG"
   eindent
     einfo "Trying to extract configuration file ${CONFIG}:"
-    cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
+    cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
   eoutdent
 fi
 
@@ -1890,18 +1975,39 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam "debs" ; then
-  DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
-  einfo "Tring to install debian package(s) ${DEBS}"
-  dpkg -i /cdrom/debs/$DEBS* ; eend $?
+   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   einfo "Tring to install debian package(s) ${DEBS}"
+   dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
 fi
 }
 
 config_scripts(){
 if checkbootparam "scripts" ; then
-  SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
-  [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
-  einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
-  sh -c /cdrom/scripts/$SCRIPTS ; eend $?
+   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
+   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
+   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
+   sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
+fi
+}
+# }}}
+
+# {{{ mypath
+config_mypath(){
+if checkbootparam "mypath" ; then
+   MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
+   einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
+   touch /etc/grml/my_path
+   chmod 644 /etc/grml/my_path
+   # make sure the directories exist:
+   eindent
+   for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
+       if ! [ -d "$i" ] ; then
+          einfo "Creating directory $i"
+          mkdir -p "$i" ; eend $?
+       fi
+   done
+   grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
+   eoutdent
 fi
 }
 # }}}
@@ -2357,11 +2463,11 @@ fi # stringinstring "BOOT_IMAGE=debian2hd
 config_distri(){
 if checkbootparam "distri"; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
-  if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
-     [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
+  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 /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
+     cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
   fi
 fi
 }