4 Subscribes to zephyr via tzc and sends messages to notification drivers (growl or libnotify).
13 from abstfilter import AbstractConsumer
16 class Notifier(AbstractConsumer):
17 def __init__(self, usegrowl, usenotify, useprint):
18 self.usegrowl = usegrowl
19 self.usenotify = usenotify
20 self.useprint = useprint
23 if s is None or type(s) is type(''): return
24 d = dict([(ss[0], len(ss) > 2 and ss[2] or None) for ss in s])
25 if d['tzcspew'] == 'message':
26 zclass = d['class'].lower()
27 zinstance = d['instance'].lower()
28 zop = d['opcode'].lower()
29 zsender = d['sender'].lower()
30 zauth = d['auth'].lower() == 'yes'
31 ztime = ':'.join(d['time'].split(' ')[3].split(':')[0:2])
32 zmessage = d['message']
33 id = '%s/\n%s/\n%s\n %s' % (zclass, zinstance, zsender, ztime)
35 header = '%s (%s)' % (id, zsender)
38 header = '%s (%s)' % (id, len(zmessage) > 0 and zmessage[0] or zsender)
39 message = '%s' % (len(zmessage) > 1 and zmessage[1] or '')
46 growlnotify = ['growlnotify', '-a', 'MacZephyr', '-n', 'zephyr', '-d', id, '-t', header]
47 g = subprocess.Popen(growlnotify, stdin=subprocess.PIPE)
48 g.stdin.write(message)
51 notifysend = ['notify-send', header, message]
52 subprocess.call(notifysend)
57 parser = optparse.OptionParser(usage = '%prog [-s "username@machine"] (--growl | --notify | --print)',
58 description = __doc__.strip())
59 parser.add_option('-s', '--ssh',
63 help = 'optional remote host to run tzc')
64 parser.add_option('-g', '--growl',
65 action = 'store_true',
68 help = 'use growlnotify for output')
69 parser.add_option('-n', '--notify',
70 action = 'store_true',
73 help = 'use notify-send for output')
74 parser.add_option('-p', '--print',
75 action = 'store_true',
78 help = 'use stdout for output')
79 opts, args = parser.parse_args()
82 usenotify = opts.notify
83 useprint = opts.useprint
84 if not usegrowl and not usenotify and not useprint:
85 parser.print_help(sys.stderr)
90 retval = subprocess.call(['which', 'tzc'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
92 print 'tzc not in path. Please add -s username@machine to specify remote host.'
96 command = "ssh -K %s 'tzc -si'" % ssh
100 r = sexpr.SExprReader(Notifier(usegrowl, usenotify, useprint))
102 flags = fcntl.fcntl(p, fcntl.F_GETFL)
103 fcntl.fcntl(p, fcntl.F_SETFL, flags | os.O_NONBLOCK)
107 [i,o,e] = select.select([p], [], [], 5)
108 if i: s = p.read(1024)
113 except KeyboardInterrupt:
117 if __name__ == "__main__":
118 sys.exit(main(sys.argv))