Rework config_swspeak, add config_hwspeak
[grml-autoconfig.git] / autoconfig.functions
index 1f76476..ea88da1 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: Fre Aug 15 23:06:21 CEST 2008 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -819,27 +818,72 @@ 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/ ] ; 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
+            flite -o play -t "Fatal error setting up software speakup"
+            eend 1
+            return 1
+         fi
+         eoutdent
+      fi
+
+      if [ -d /proc/speakup/ ] ; then
+         einfo "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."
+         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
+}
+# }}}
+
+# {{{ support hardware synthesizer via speakup
+config_hwspeak(){
+   if checkbootparam hwspeak ; then
+      einfo "Bootoption hwspeak found."
+
+      if ! [ -d /proc/speakup/ ] ; 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/ ] ; then
+         einfo "Kernel supports speakup now." ; eend 0
+         flite -o play -t "Kernel supports speakup now."
+      else
+         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
+         flite -o play -t "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
 }
 # }}}
 
@@ -1341,20 +1385,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
 }
 # }}}
@@ -1790,13 +1860,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