From: Peter Iannucci Date: Sun, 1 Mar 2009 00:19:52 +0000 (-0500) Subject: Code for barn-growl utility for OS X. X-Git-Url: https://sipb.mit.edu/gitweb.cgi/snippets/.git/commitdiff_plain/e96471327a498eacda889a1a306f272d795d07d8?ds=sidebyside Code for barn-growl utility for OS X. --- diff --git a/barn-growl/abstfilter.py b/barn-growl/abstfilter.py new file mode 100755 index 0000000..c8a6e11 --- /dev/null +++ b/barn-growl/abstfilter.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +## $Id: abstfilter.py,v 1.1.1.1 2003/07/01 23:28:27 euske Exp $ +## +## abstfilter.py - A framework for cascade filters. +## + + +## AbstractFeeder +## +class AbstractFeeder(object): + + def __init__(self, next_filter): + self.next_filter = next_filter + return + + def feed_next(self, s): + self.next_filter.feed(s) + return + + def close(self): + self.next_filter.close() + return + + +## AbstractFilter +## +class AbstractFilter(object): + + def __init__(self, next_filter): + self.next_filter = next_filter + return + + def process(self, s): + raise NotImplementedError + + def feed(self, s): + self.feed_next(self.process(s)) + return + + def feed_next(self, s): + self.next_filter.feed(s) + return + + def close(self): + self.next_filter.close() + return + + +## AbstractConsumer +## +class AbstractConsumer(object): + + def __init__(self): + return + + def feed(self, s): + raise NotImplementedError + + def close(self): + return + + +## FileGenerator +## +class FileGenerator(AbstractFeeder): + def __init__(self, next_type): + next_filter = next_type(self) + AbstractFeeder.__init__(self, next_filter) + self.results = [] + return + + def feed(self, s): + self.results.append(s) + return + + def close(self): + return + + def pullopen(self, f): + while 1: + s = f.readline() + if not s: break + self.feed_next(s) + if self.results: + for s in self.results: + yield s + self.results = [] + for s in self.results: + yield s + self.results = [] + return + diff --git a/barn-growl/barn-growl.py b/barn-growl/barn-growl.py new file mode 100755 index 0000000..6930f36 --- /dev/null +++ b/barn-growl/barn-growl.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import sexpr +import os +import fcntl +import select +import sys +from abstfilter import AbstractConsumer + +class Growler(AbstractConsumer): + def __init__(self): + return + def feed(self, s): + if s is None or type(s) is type(''): return + print repr(s) + d = dict([(ss[0], len(ss) > 2 and ss[2] or None) for ss in s]) + if d['tzcspew'] == 'message': + zclass = d['class'].lower() + zinstance = d['instance'].lower() + zop = d['opcode'].lower() + zsender = d['sender'].lower() + zauth = d['auth'].lower() == 'yes' + ztime = ':'.join(d['time'].split(' ')[3].split(':')[0:2]) + zmessage = d['message'] + id = '%s/\n%s/\n%s\n %s' % (zclass, zinstance, zsender, ztime) + if zop == 'ping': + header = '%s (%s)' % (id, zsender) + message = '...' + elif zop == 'nil': + header = '%s (%s)' % (id, zmessage[0]) + message = '%s' % zmessage[1] + else: + return + g = os.popen("growlnotify -a MacZephyr -n zephyr -d '%s' -t '%s'" % (id, header), 'w') + g.write(message) + g.close() + def close(self): + return + +def main(argv): + if len(argv) < 2: + print """barn-growl v.0.0.1 + +Usage: +barn-growl USERNAME""" + return 0 + + username = argv[1] + principal = username + if principal.find("@") == -1: + principal += '@ATHENA.MIT.EDU' + bash = "/bin/bash -lc \"kdo %s ssh %s@linerva.mit.edu 'tzc -si'\" 2>/dev/null