summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@krebs>2011-05-05 09:45:18 +0200
committerroot <root@krebs>2011-05-05 09:47:58 +0200
commit13d7ab68a3dfe881fffdcca16aa9f6ea56b2d583 (patch)
tree63ee04614f903e8f45bf2e3632020b13d16d6dc5
parent548e5e53d3bcfec31c1fb89d61da3405aec50924 (diff)
parent4b65c37645b6b72a0531fbbdb75310bf93ee99de (diff)
Merge branch 'import-noise'
-rw-r--r--modules/noise/TODO60
-rwxr-xr-xmodules/noise/cron/bin/zeit16
-rwxr-xr-xmodules/noise/init.d/noise48
-rwxr-xr-xmodules/noise/modules/cat14
-rwxr-xr-xmodules/noise/modules/chat33
-rwxr-xr-xmodules/noise/modules/date6
-rwxr-xr-xmodules/noise/modules/echo6
-rwxr-xr-xmodules/noise/modules/ein_mal_eins37
-rwxr-xr-xmodules/noise/modules/espeak34
-rwxr-xr-xmodules/noise/modules/help24
-rwxr-xr-xmodules/noise/modules/join15
-rwxr-xr-xmodules/noise/modules/lang22
-rwxr-xr-xmodules/noise/modules/mpc14
-rwxr-xr-xmodules/noise/modules/names22
-rwxr-xr-xmodules/noise/modules/nick10
-rwxr-xr-xmodules/noise/modules/part15
-rwxr-xr-xmodules/noise/modules/ping24
-rwxr-xr-xmodules/noise/modules/play36
-rwxr-xr-xmodules/noise/modules/pong26
-rwxr-xr-xmodules/noise/modules/query23
-rwxr-xr-xmodules/noise/modules/send_to_channel17
-rwxr-xr-xmodules/noise/modules/sendmail55
-rwxr-xr-xmodules/noise/modules/shackstatus104
-rwxr-xr-xmodules/noise/modules/sleep10
-rwxr-xr-xmodules/noise/modules/stream64
-rwxr-xr-xmodules/noise/modules/temp56
-rwxr-xr-xmodules/noise/modules/test13
-rwxr-xr-xmodules/noise/modules/twitter125
-rwxr-xr-xmodules/noise/modules/vvs17
-rwxr-xr-xmodules/noise/modules/wall8
-rwxr-xr-xmodules/noise/modules/zeit19
-rwxr-xr-xmodules/noise/noise182
-rwxr-xr-xmodules/noise/noise-as-user4
-rwxr-xr-xmodules/noise/noise-server4
34 files changed, 1163 insertions, 0 deletions
diff --git a/modules/noise/TODO b/modules/noise/TODO
new file mode 100644
index 00000000..a20f74e9
--- /dev/null
+++ b/modules/noise/TODO
@@ -0,0 +1,60 @@
+#### file:noise/TODO
+
+- /channels
+- /hist N -- zum anzeigen von N letzten Nachrichten
+ - Log? Es werden maximal chat_histsize Zeilen gespeichert.
+- Anbindung ans MoinMoin
+- IRC <-> 23.shack - Brücke
+- when nick changes say "You're now known as XXX" to yourself
+- twitter: push new tweets as they arrive to all connected clients with
+ the variable tweet_me set to ON
+
+- Author, Maintainer etc. direkt in die Module in der erweiterten Hilfe, also
+ in /help MODULENAME -> man sollte sich auf ein einheitliches Dokmentierungs-
+ Format einigen.
+ - All modules should contain:
+ - Author(s) w/ e-mail, Copyright, License
+ - Maintainer(s) w/ e-mail
+ - Module-Version
+ - last tested System-Version
+ - we need to export the system version
+- GIT commits tweeten (shack und root)
+- /kick [CHANNEL] # from channel / telnet
+- /ban # :-)
+- /op
+- USER-A: /ping USER-B
+ - USER-B: /pong
+ - write time to USER-{A,B}
+- style-sheets for everything MOAR!!1
+- libraries
+- HTTP-interface
+- /whois, /whoami, /whowas
+- join,part&co. should support multiple channels
+- /TODO,/bug,/issue or something should be added as tracking-system
+- /part should say something like "X has left."
+- /join should say something like "X has joined."
+ # it's obvious that the channels is meant...
+ - or else say: "X has joined channel Y." when we can join more than one
+ channel
+- /part should unset chat_channel (somehow) else keeping /part'ing will
+ broadcast to chat_channel that X has quit...
+- split /twitter into /tweet and X, to make it clear when tweets are fired
+- POP3 mail off googlemail and show them to curious telnetters
+- /set x 23 -> blah $x
+
+- /rewrite -- e.g. /rewrite "!%s" "/play %s" oder sowasi
+- Zugriff per ssh
+- module to standard unix-commands (name like /system)
+ - unix-commands should simply link to system
+- /save TOKEN, /load TOKEN
+- /op # NUR VIA SSH! (s.o.)
+- MODULE-TEST-SUITE [blackbox]
+- sub-modules like /chat-join which may be abbreviated as /join when
+ $default_command is set to /chat, YAY
+ - unclutter /help:
+ - /help -> show all (main) modules
+ - /help MODULE -> show help of MODULE and show all sub-modules
+ - /help MODULE SUB-MODULE -> show help of SUB-MODULE and show all sub^2...
+- watchdog
+
+#### end of file.
diff --git a/modules/noise/cron/bin/zeit b/modules/noise/cron/bin/zeit
new file mode 100755
index 00000000..ec50c898
--- /dev/null
+++ b/modules/noise/cron/bin/zeit
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+expect >/dev/null <<EOF
+spawn nc localhost telnet
+expect READY.
+send "/zeit\r"
+expect READY.
+# pitch set to 10
+expect READY.
+# Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
+expect READY.
+# pitch changed from 10 to 100
+expect READY.
+EOF
+sleep 1
+/sbin/morse -l 100 -f 700 `date +%k`
diff --git a/modules/noise/init.d/noise b/modules/noise/init.d/noise
new file mode 100755
index 00000000..991f14b7
--- /dev/null
+++ b/modules/noise/init.d/noise
@@ -0,0 +1,48 @@
+#!/bin/sh -e
+### BEGIN INIT INFO
+# Provides: noise
+# Required-Start: $remote_fs $syslog dbus
+# Required-Stop: $remote_fs $syslog dbus
+# Default-Start: 2 3 4 5
+# Default-Stop: 1
+# Short-Description: Start the noise "Telnet" server
+# Description: System mode startup script for
+# the noise "Telnet" server.
+### END INIT INFO
+
+DAEMON=/root/noise/noise-server
+
+test -x $DAEMON || exit 1
+
+noise_pid() {
+ ps aux | grep tcpserver | grep noise-as-user | awk '{print$2}'
+}
+
+noise_start() {
+ "$DAEMON" &
+}
+
+noise_stop() {
+ kill "`noise_pid`"
+}
+
+case "$1" in
+ start|stop)
+ noise_${1}
+ ;;
+ restart|reload|force-reload)
+ noise_stop
+ noise_start
+ ;;
+ #force-stop) ;;
+ status)
+ kill -s 0 "`noise_pid`"
+ exit $?
+ ;;
+ *)
+ echo "Usage: /etc/init.d/noise {start|stop|force-stop|restart|reload|force-reload|status}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/modules/noise/modules/cat b/modules/noise/modules/cat
new file mode 100755
index 00000000..e090acba
--- /dev/null
+++ b/modules/noise/modules/cat
@@ -0,0 +1,14 @@
+#! /bin/sh
+case "$1" in
+ (--help) : ;;
+ (*)
+ while read line ; do
+ case "$line" in
+ (/quit)
+ break 2
+ ;;
+ (*)
+ echo "[$line]"
+ esac
+ done
+esac
diff --git a/modules/noise/modules/chat b/modules/noise/modules/chat
new file mode 100755
index 00000000..e5badc36
--- /dev/null
+++ b/modules/noise/modules/chat
@@ -0,0 +1,33 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo send text to everyone with @@ prepended ;;
+ (/nick)
+ echo set nick to $2
+ echo /set chat_nick $2 >$NOISE_linefeed;;
+ (/names)
+ cd /tmp/noise
+ . $NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+ channel="$chat_channel"
+ echo "Users in channel $channel"
+ for client in * ; do
+ . $client/environment
+ chat_nick="${chat_nick-$client}"
+ if test "$channel" = "$chat_channel" && test "$default_command" = chat ; then
+ echo "$chat_nick"
+ fi
+ unset chat_nick
+ unset chat_channel
+ unset default_command
+ done ;;
+ (*)
+ cd /tmp/noise
+ . $NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+
+ echo "/send_to_channel $chat_channel $nick: $*" > $NOISE_linefeed
+
+
+ #echo /wall @@ $* >$NOISE_linefeed
+esac
diff --git a/modules/noise/modules/date b/modules/noise/modules/date
new file mode 100755
index 00000000..8cd1b0c1
--- /dev/null
+++ b/modules/noise/modules/date
@@ -0,0 +1,6 @@
+#! /bin/sh
+case "$1" in
+ (--help) : ;;
+ (*)
+ date --rfc-3339=s
+esac
diff --git a/modules/noise/modules/echo b/modules/noise/modules/echo
new file mode 100755
index 00000000..344dd963
--- /dev/null
+++ b/modules/noise/modules/echo
@@ -0,0 +1,6 @@
+#! /bin/sh
+case "$1" in
+ (--help) : ;;
+ (*)
+ echo "$*"
+esac
diff --git a/modules/noise/modules/ein_mal_eins b/modules/noise/modules/ein_mal_eins
new file mode 100755
index 00000000..fb385b31
--- /dev/null
+++ b/modules/noise/modules/ein_mal_eins
@@ -0,0 +1,37 @@
+#! /bin/bash
+
+R() {
+ echo "`od -t d -N 1 /dev/urandom | sed -rn '1s/^[0-9]+ +//p'` % $@" | bc
+}
+
+
+
+
+case "$1" in
+ (--help) echo Stellt eine einfache Aufgabe ;;
+ (*)
+ a="`R 69`"
+ b="`R 69`"
+ op="`echo "\
+Was ist, A hoch B
+Was ist, A plus B
+Was ist, A minus B
+Was ist, A mal B
+Was ist, sinus von 0
+Was ist, Pi halbe mal 2
+Was ist, 2 hoch 8
+Was ist, 2 hoch 16
+Was ist, 2 hoch 32
+Was ist, 42 geteilt durch Pi mal 100
+Was ist, l n von 1
+Was ist, 42
+Was ist, 23
+Starte den Server neu
+Löte ein Kabel an einen Kompjuter
+Was ist, A geteilt durch B"`"
+ o="$(R `echo "$op" | wc -l` + 1)"
+
+ aufgabe=`echo "$op" | sed -n "$o{s/A/$a/;s/B/$b/;p}"`
+
+ echo "/espeak -v Löse die Aufgabe: $aufgabe?" >$NOISE_linefeed
+esac
diff --git a/modules/noise/modules/espeak b/modules/noise/modules/espeak
new file mode 100755
index 00000000..4e88918f
--- /dev/null
+++ b/modules/noise/modules/espeak
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+print_var() {
+ echo "$1 = $2"
+}
+
+speak() {
+ p="${noise_pitch-100}"
+ v="${noise_lang-de}"
+ k="${noise_capital-0}"
+ a="${noise_amplitude-100}"
+ g="${noise_gap-1}"
+ if test "$debug" = true; then
+ print_var pitch $p
+ print_var lang $v
+ print_var capital $k
+ print_var amplitude $a
+ print_var gap $g
+ fi
+ if test "$verbose" = true; then
+ echo "espeak: $@"
+ fi
+ #echo "espeak -p \"$pitch\" -v \"$lang\" \"$*\"" >&2
+ (espeak --stdout -a $a -k $k -p $p -v $v -g $g | aplay -Dplug:default)<<EOF
+$*
+EOF
+}
+
+case "$1" in
+ (--help) echo say something with espeak ;;
+ (-d|--debug) shift; debug=true speak "$@";;
+ (-v|--verbose) shift; verbose=true speak "$@";;
+ (*) speak "$@";;
+esac
diff --git a/modules/noise/modules/help b/modules/noise/modules/help
new file mode 100755
index 00000000..bc4c2931
--- /dev/null
+++ b/modules/noise/modules/help
@@ -0,0 +1,24 @@
+#! /bin/sh
+case "$1" in
+ (-*) : ;; # ignore all options
+ ('') { for directory in `echo "$NOISE_PATH" | tr : \ ` ; do
+ for module in "$directory"/* ; do
+ echo `basename "$module"` `$module --help`
+ done 2>/dev/null
+ done
+ ## print all documented built-in commands
+ sed -rn 's:^noise_([a-z]+)\(\) \{ # (.+)?$:\1 \2:p' "$NOISE"
+ } | sort | uniq | sed -rn '
+ $s/$//
+ s:^([a-z]+) (.+):type /\1 to \2:p' ;;
+ (*)
+ ## call
+ for directory in `echo "$NOISE_PATH" | tr : \ ` ; do
+ for module in "$directory/$1" ; do
+ if test -e $module ; then
+ shift
+ exec $module --help --verbose "$@" 2>&1
+ fi
+ done
+ done
+esac
diff --git a/modules/noise/modules/join b/modules/noise/modules/join
new file mode 100755
index 00000000..68afcb66
--- /dev/null
+++ b/modules/noise/modules/join
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo set default_command to chat and join channel ;;
+ (*)
+ . /tmp/noise/$NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+ echo /send_to_channel "${1-#23}" "$nick" joined the channel >$NOISE_linefeed
+ echo /set default_command chat >$NOISE_linefeed
+ echo /set chat_channel "${1-#23}" >$NOISE_linefeed
+ echo " joined channel ${1-#23}"
+ echo /part to go back to espeak ;;
+
+
+esac
diff --git a/modules/noise/modules/lang b/modules/noise/modules/lang
new file mode 100755
index 00000000..07b6802e
--- /dev/null
+++ b/modules/noise/modules/lang
@@ -0,0 +1,22 @@
+#! /bin/sh
+
+case "$1" in
+ (--help)
+ echo "set language or list available languages" ;;
+ (list)
+ espeak --voices | sed -n '1!p' | awk '{\
+ printf"/lang %s set lang to %s\n",$2,$4
+ }' ;;
+ ('')
+ echo /set lang >$NOISE_linefeed ;;
+ (*)
+ if test -z "$2" ; then
+ echo /set lang "$1"
+ else
+ echo /set lang "$1"
+ shift
+ echo "$*"
+ echo /set lang "${noise_lang-de}"
+ fi >$NOISE_linefeed
+esac
+
diff --git a/modules/noise/modules/mpc b/modules/noise/modules/mpc
new file mode 100755
index 00000000..0ab72058
--- /dev/null
+++ b/modules/noise/modules/mpc
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+case "$1" in
+ (--help)
+ case "$2" in
+ (--verbose) mpc --help ;;
+ (*) echo access mpd
+ esac ;;
+ (*)
+ ##echo test-module called with following arguments: "$@"
+ ## send command for re-evaluation:
+ ##echo /espeak test >$NOISE_linefeed
+ MPD_HOST=mpd.shack mpc $@
+esac
diff --git a/modules/noise/modules/names b/modules/noise/modules/names
new file mode 100755
index 00000000..f5922064
--- /dev/null
+++ b/modules/noise/modules/names
@@ -0,0 +1,22 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo send text to everyone with @@ prepended ;;
+ (*)
+ cd /tmp/noise
+ . $NOISE_pid/environment
+ if test "$default_command" != chat ; then exit ; fi
+ nick="${chat_nick-$NOISE_pid}"
+ channel="${1-$chat_channel}"
+ echo "Users in channel $channel"
+ for client in * ; do
+ . $client/environment
+ chat_nick="${chat_nick-$client}"
+ if test "$channel" = "$chat_channel" && test "$default_command" = chat ; then
+ echo "$chat_nick"
+ fi
+ unset chat_nick
+ unset chat_channel
+ unset default_command
+ done
+esac
diff --git a/modules/noise/modules/nick b/modules/noise/modules/nick
new file mode 100755
index 00000000..5ed1e9d9
--- /dev/null
+++ b/modules/noise/modules/nick
@@ -0,0 +1,10 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo send text to everyone with @@ prepended ;;
+ (*)
+ . /tmp/noise/$NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+ echo /send_to_channel $chat_channel $nick is now known as $1 > $NOISE_linefeed
+ echo /set chat_nick $1 >$NOISE_linefeed;;
+esac
diff --git a/modules/noise/modules/part b/modules/noise/modules/part
new file mode 100755
index 00000000..d35ac501
--- /dev/null
+++ b/modules/noise/modules/part
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo leave chat mode ;;
+ (*)
+ . /tmp/noise/$NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+
+ echo "/send_to_channel $chat_channel $nick has quit ${*-no reason}" > $NOISE_linefeed
+
+ echo /set default_command espeak >$NOISE_linefeed
+ echo "disabled chat mode (set back to espeak)" ;;
+
+
+esac
diff --git a/modules/noise/modules/ping b/modules/noise/modules/ping
new file mode 100755
index 00000000..acf2529f
--- /dev/null
+++ b/modules/noise/modules/ping
@@ -0,0 +1,24 @@
+#! /bin/sh
+cd /tmp/noise
+case "$1" in
+ (--help) : ;;
+ ('')
+ . $NOISE_pid/environment
+ ping_timestamp=${ping_timestamp-0}
+ ping_challenger=${ping_challenger-0}
+ if test $ping_challenger != 0 ; then
+ echo There is already a ping challange running
+ else
+ timestamp=`date +%s%N`
+ for client in * ; do
+ echo /ping $NOISE_pid $timestamp >$client/linefeed &
+ done
+ fi
+ ;;
+ (*)
+ echo "/set -q ping_timestamp $2" >$NOISE_pid/linefeed
+ if test $NOISE_pid != $1 ; then
+ echo "/set -q ping_challenger $1" >$NOISE_pid/linefeed
+ echo "PING?"
+ fi
+esac
diff --git a/modules/noise/modules/play b/modules/noise/modules/play
new file mode 100755
index 00000000..749b450a
--- /dev/null
+++ b/modules/noise/modules/play
@@ -0,0 +1,36 @@
+#! /bin/sh
+case "$1" in
+ (--help)
+ echo "play an audio file" ;;
+ (*)
+ exec 2>&1
+ ffs='wav mp3 ogg asf flac'
+
+ if test -z "$*" ; then
+ ls $HOME/noise/samples | sed -r '
+ s:\.('"`echo "$ffs" | tr \ \|`"')$: \1:
+ s:^:/play :
+ s:.*:&:
+ '
+ else
+ for i in $ffs ; do
+ f=$HOME/noise/samples/$1.$i
+ test -f "$f" &&
+ case "$i" in
+ wav) aplay "$f" & ;;
+ *) mplayer "$f" & ;;
+ esac && break
+ done || cat<<EOF
+\
+Keine Audiodatei mit dem Namen
+
+ $1.EXT
+
+gefunden... am besten gleich uploaden:
+
+ scp NAME shack@shack.shack:noise/samples/
+
+folgende Dateiendungen werden erkannt: $ffs
+EOF
+ fi
+esac
diff --git a/modules/noise/modules/pong b/modules/noise/modules/pong
new file mode 100755
index 00000000..eb2df46d
--- /dev/null
+++ b/modules/noise/modules/pong
@@ -0,0 +1,26 @@
+#! /bin/sh
+cd /tmp/noise
+case "$1" in
+ (--help) : ;;
+ ('')
+ . $NOISE_pid/environment
+ ping_timestamp=${ping_timestamp-0}
+ ping_challenger=${ping_challenger-0}
+ if test $ping_challenger = 0 ; then
+ echo There is no ping challange running
+ else
+ timestamp=`date +%s%N`
+ echo /pong $NOISE_pid $timestamp >$ping_challenger/linefeed
+ ## reset ping TODO /unset
+ echo /set -q ping_timestamp 0 >$NOISE_pid/linefeed
+ echo /set -q ping_challenger 0 >$NOISE_pid/linefeed
+ fi
+ ;;
+ (*)
+ . $1/environment
+ # XXX is attendee the right counterpart to 'challenger'?
+ attendee_nick=$chat_nick
+ . $NOISE_pid/environment
+ time=`echo "scale=3; ($2 - $ping_timestamp)/10^9" | bc`
+ echo "PONG! $attendee_nick ${time}s"
+esac
diff --git a/modules/noise/modules/query b/modules/noise/modules/query
new file mode 100755
index 00000000..ceeff8a5
--- /dev/null
+++ b/modules/noise/modules/query
@@ -0,0 +1,23 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) echo send a message to a specific user ;;
+ (*)
+ cd /tmp/noise
+ . $NOISE_pid/environment
+ nick="${chat_nick-$NOISE_pid}"
+ target="$1"
+ shift
+ for client in * ; do
+ . $client/environment
+ if test "$target" = "${chat_nick-$client}" ; then
+ echo "/echo <-- $nick: $*" > $client/linefeed
+ echo "--> $target: $*"
+ exit
+ fi
+ unset chat_channel
+
+ done
+
+ echo "$nick not found"
+esac
diff --git a/modules/noise/modules/send_to_channel b/modules/noise/modules/send_to_channel
new file mode 100755
index 00000000..4a0470af
--- /dev/null
+++ b/modules/noise/modules/send_to_channel
@@ -0,0 +1,17 @@
+#! /bin/sh
+
+case "$1" in
+ (--help) : ;;
+ (*)
+ cd /tmp/noise
+ channel="$1"
+ shift
+ for client in * ; do
+ . $client/environment
+ if test "$channel" = "$chat_channel" && test "$default_command" = chat ; then
+ echo "/echo $*" > $client/linefeed
+ fi
+ unset chat_channel
+
+ done
+esac
diff --git a/modules/noise/modules/sendmail b/modules/noise/modules/sendmail
new file mode 100755
index 00000000..182d96e3
--- /dev/null
+++ b/modules/noise/modules/sendmail
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+import os,sys,smtplib,string
+'''
+ Mail Plugin for the noise telnet suite
+ See: http://docs.python.org/library/smtplib.html
+ Author: Felix
+'''
+
+# help
+if len(sys.argv) == 2:
+ if sys.argv[1] == "--help":
+ print "send an e-mail ( \"TO(s)\" \"SUBJECT\" [string instead of EOF])"
+ sys.exit(0)
+
+# sanity
+if len(sys.argv) <= 2:
+ print "wrong number of parameters, see help"
+ sys.exit(1)
+
+# write variables
+# check of EOF
+if len(sys.argv) == 4 :
+ EOFstring="%s\n"% sys.argv[3]
+else:
+ EOFstring="EOF\n"
+
+fromaddr=u"Karl Koch<shockspasm@googlemail.com>"
+toaddrs=sys.argv[1]
+subject=sys.argv[2]
+
+
+#write header:
+msg = u"From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (fromaddr, toaddrs,subject)
+print "Write your text now, finish with %s" % EOFstring
+sys.stdout.flush() # flushing is important to make sure the line is written
+
+while 1:
+ try:
+ line = sys.stdin.readline()
+ if line == EOFstring:
+ break
+ msg = msg + line
+ except EOFError:
+ break
+
+msg = msg + "[!] Written with NOISE telnet"
+
+print "Thank you for your message! Delivering it now..."
+sys.stdout.flush()
+server = smtplib.SMTP('localhost')
+#server.set_debuglevel(1)
+server.sendmail(fromaddr,toaddrs.split(','),msg)
+server.quit()
+print "mail send successfully"
+sys.exit(0)
diff --git a/modules/noise/modules/shackstatus b/modules/noise/modules/shackstatus
new file mode 100755
index 00000000..a5058f0a
--- /dev/null
+++ b/modules/noise/modules/shackstatus
@@ -0,0 +1,104 @@
+#! /bin/bash
+
+main() {
+ case "$1" in
+ (--help)
+ echo "report status of all shack services."
+ ;;
+ (*)
+ test "$(dig +short localhost @10.42.0.10 )" = "127.0.0.1" &&
+ STAT_DNS_I="läuft" || STAT_DNS_I="antwortet nicht"
+ test "$(dig +short shackspace.de @10.42.0.10 )" = "141.31.176.214" &&
+ STAT_DNS_E="läuft" || STAT_DNS_E="antwortet nicht"
+ test "$(dig +short shackspace.de @141.31.176.214 )" = "141.31.176.214" &&
+ STAT_DNS_X="läuft"|| STAT_DNS_X="antwortet nicht"
+
+ STAT_LINE=$(ping -c 5 -i 0.2 -q 141.31.176.214 |
+ awk '/packet loss/ { print 100-$6}' )
+
+ cat <<-EOF >$NOISE_linefeed
+ /set pitch 10
+ /espeak -v Hallo - Ich bin Krebs.
+ /espeak -v Heute ist `wochentag`, der `tag` --- `monat` -- `date +%Y`
+ /zeit
+ /espeak -v tcheck der systeme:
+ /espeak -v Energie versorgung -- aktiv
+ /espeak -v shackhost -- läuft
+ /espeak -v telnet -- läuft
+ /espeak -v interner - D N S -- interne - do-mejn -- $STAT_DNS_I
+ /espeak -v interner - D N S -- externe - do-mejn -- $STAT_DNS_E
+ /espeak -v externer - D N S - $STAT_DNS_X
+ /espeak -v Leitungsqualität - $STAT_LINE prozent.
+ /temp
+ /espeak -v krebs kompjuting bereit
+ EOF
+ ;;
+ esac 2>&1
+}
+
+wochentag() {
+ case $(date +%a) in
+ (Mon) echo Montag ;;
+ (Tue) echo Dienstag ;;
+ (Wed) echo Mittwoch ;;
+ (Thu) echo Donnerstag ;;
+ (Fri) echo Freitag ;;
+ (Sat) echo Samstag ;;
+ (Sun) echo Sonntag ;;
+ esac
+}
+
+tag() {
+ case $(date +%d) in
+ (1) echo erste ;;
+ (2) echo zweite ;;
+ (3) echo dritte ;;
+ (4) echo vierte ;;
+ (5) echo fünfte ;;
+ (6) echo sechste ;;
+ (7) echo siebte ;;
+ (8) echo achte ;;
+ (9) echo neunte ;;
+ (10) echo zehnte ;;
+ (11) echo elfte ;;
+ (12) echo zwölfte ;;
+ (13) echo dreizehnte ;;
+ (14) echo vierzehnte ;;
+ (15) echo fünfzehnte ;;
+ (16) echo sechzehnte ;;
+ (17) echo siebzehnte ;;
+ (18) echo achtzehnte ;;
+ (19) echo neunzehnte ;;
+ (20) echo zwanzigste ;;
+ (21) echo einundzwanzigste ;;
+ (22) echo zweiundzwanzigste ;;
+ (23) echo dreiundzwanzigste ;;
+ (24) echo vierundzwanzigste ;;
+ (25) echo füfundzwanzigste ;;
+ (26) echo sechsundzwanzigste ;;
+ (27) echo siebenundzwanzigste ;;
+ (28) echo achtundzwanzigste ;;
+ (29) echo neunundzwanzigste ;;
+ (30) echo dreissigste ;;
+ (31) echo einunddreissigste ;;
+ esac
+}
+
+monat() {
+ case $(date +%b) in
+ (Jan) echo Januar ;;
+ (Feb) echo Februar ;;
+ (Mar) echo März ;;
+ (Apr) echo April ;;
+ (May) echo Mai ;;
+ (Jun) echo Juni ;;
+ (Jul) echo Juli ;;
+ (Aug) echo August ;;
+ (Sep) echo September ;;
+ (Oct) echo Oktober ;;
+ (Nov) echo November ;;
+ (Dec) echo Dezember ;;
+ esac
+}
+
+main "$@"
diff --git a/modules/noise/modules/sleep b/modules/noise/modules/sleep
new file mode 100755
index 00000000..89712cac
--- /dev/null
+++ b/modules/noise/modules/sleep
@@ -0,0 +1,10 @@
+#! /bin/sh
+case "$1" in
+ (--help) echo "pause for NUMBER seconds" ;;
+ (*)
+ if echo "$1" | grep -Eq '^([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)$' ; then
+ sleep "$1"
+ else
+ echo 'FAIL: $1 is not a number'
+ fi
+esac
diff --git a/modules/noise/modules/stream b/modules/noise/modules/stream
new file mode 100755
index 00000000..1e6fd0c5
--- /dev/null
+++ b/modules/noise/modules/stream
@@ -0,0 +1,64 @@
+#! /bin/sh
+inputdir=$HOME/noise/streams
+basename="`basename "$0"`"
+case "$1" in
+ (--help)
+ if echo "$0 $*" | grep -q '[[:space:]]--verbose\>'; then
+ echo -e "\x1B[35mtype \x1B[32m/$basename off \x1B[35mto turn stream off\x1B[m"
+ for i in `ls $inputdir` ; do
+ filename="$inputdir/$i"
+ shortcut=`xmlstarlet sel -t -v /station/@shortcut "$inputdir/$i"`
+ title=`xmlstarlet sel -t -v /station/@title "$inputdir/$i"`
+ topic=`xmlstarlet sel -t -v /station/@topic "$inputdir/$i"`
+ stream=`xmlstarlet sel -t -v /station/@stream "$inputdir/$i"`
+ echo -e "\x1B[35mtype \x1B[32m/$basename $shortcut \x1B[35mfor $topic\x1B[m"
+ done
+ else
+ echo "play an audio stream"
+ fi
+ ;;
+ (*)
+ exec 2>&1
+ ffs='xml'
+
+ if test -z "$*" ; then
+ echo -e "\x1B[32m/stream off \x1B[33m- turn stream off\x1B[m"
+ for i in `ls $inputdir` ; do
+ filename="$inputdir/$i"
+ shortcut=`xmlstarlet sel -t -v /station/@shortcut "$inputdir/$i"`
+ title=`xmlstarlet sel -t -v /station/@title "$inputdir/$i"`
+ topic=`xmlstarlet sel -t -v /station/@topic "$inputdir/$i"`
+ stream=`xmlstarlet sel -t -v /station/@stream "$inputdir/$i"`
+ echo -e "\x1B[32m/stream $shortcut \x1B[33m- $title \x1B[35m$topic\x1B[m"
+ done
+ else if [ "$1" = "off" ]; then
+ [ ! -d /tmp/noise ] || ( echo "no directory /tmp/noise; aborting" ; exit 1 )
+ [ -f /tmp/noise/stream.pid ] && ( kill ` cat /tmp/noise/stream.pid ` )
+ [ -e /tmp/noise/stream.pid ] && rm /tmp/noise/stream.pid || ( echo "can't remove /tmp/noise/stream.pid; aborting" ; exit 1 )
+ else
+ for i in `ls $inputdir` ; do
+ filename="$inputdir/$i"
+ shortcut=`xmlstarlet sel -t -v /station/@shortcut "$inputdir/$i"`
+ stream=`xmlstarlet sel -t -v /station/@stream "$inputdir/$i"`
+ if [ "$shortcut" == "$1" ]; then
+ [ ! -d /tmp/noise ] || ( umask 077 ; mkdir /tmp/noise ) || ( echo "can't create /tmp/noise; aborting" ; exit 1 )
+ [ -f /tmp/noise/stream.pid ] && ( kill ` cat /tmp/noise/stream.pid ` )
+ [ -e /tmp/noise/stream.pid ] && rm /tmp/noise/stream.pid || ( echo "can't remove /tmp/noise/stream.pid; aborting" ; exit 1 )
+ mplayer -cache 2048 -quiet "$stream" &
+ ( umask 077 ; echo $! > /tmp/noise/stream.pid )
+ break
+ fi
+ done || cat<<EOF
+\