Code for barn-growl utility for OS X.
[snippets/.git] / barn-growl / barn-growl.py
1 #!/usr/bin/env python
2
3 import sexpr
4 import os
5 import fcntl
6 import select
7 import sys
8 from abstfilter import AbstractConsumer
9
10 class Growler(AbstractConsumer):
11     def __init__(self):
12         return
13     def feed(self, s):
14         if s is None or type(s) is type(''): return
15         print repr(s)
16         d = dict([(ss[0], len(ss) > 2 and ss[2] or None) for ss in s])
17         if d['tzcspew'] == 'message':
18             zclass = d['class'].lower()
19             zinstance = d['instance'].lower()
20             zop = d['opcode'].lower()
21             zsender = d['sender'].lower()
22             zauth = d['auth'].lower() == 'yes'
23             ztime = ':'.join(d['time'].split(' ')[3].split(':')[0:2])
24             zmessage = d['message']
25             id = '%s/\n%s/\n%s\n %s' % (zclass, zinstance, zsender, ztime)
26             if zop == 'ping':
27                 header = '%s (%s)' % (id, zsender)
28                 message = '...'
29             elif zop == 'nil':
30                 header = '%s (%s)' % (id, zmessage[0])
31                 message = '%s' % zmessage[1]
32             else:
33                 return
34             g = os.popen("growlnotify -a MacZephyr -n zephyr -d '%s' -t '%s'" % (id, header), 'w')
35             g.write(message)
36             g.close()
37     def close(self):
38         return
39
40 def main(argv):
41     if len(argv) < 2:
42         print """barn-growl v.0.0.1
43
44 Usage:
45 barn-growl USERNAME"""
46         return 0
47
48     username = argv[1]
49     principal = username
50     if principal.find("@") == -1:
51         principal += '@ATHENA.MIT.EDU'
52     bash = "/bin/bash -lc \"kdo %s ssh %s@linerva.mit.edu 'tzc -si'\" 2>/dev/null </dev/null" % (principal, username)
53     p = os.popen(bash)
54     r = sexpr.SExprReader(Growler())
55
56     flags = fcntl.fcntl(p, fcntl.F_GETFL)
57     fcntl.fcntl(p, fcntl.F_SETFL, flags | os.O_NONBLOCK)
58
59     while 1:
60         [i,o,e] = select.select([p], [], [], 5)
61         if i: s = p.read(1024)
62         else: s = ''
63
64         if s != '':
65             r.feed(s)
66     return 0
67
68 if __name__ == "__main__":
69     sys.exit(main(sys.argv))