#!/usr/bin/env python """ socket_notify.py - Phenny Socket Notification Copyright 2013, Alexander Sulfrian Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ """ import asyncore, socket, stat, os SOCKET_PATH = '/var/run/phenny/socket' def setup(phenny): dir = os.path.dirname(SOCKET_PATH) if not os.path.exists(dir): os.makedirs(dir) Monitor(SOCKET_PATH, phenny) class Sender(asyncore.dispatcher): def __init__(self, sock, phenny): asyncore.dispatcher.__init__(self, sock) self.phenny = phenny def handle_read(self): data = self.recv(8192) if data: for line in data.split('\n'): for chan in self.phenny.config.channels: self.phenny.msg(chan, line) else: self.close() class Monitor(asyncore.dispatcher): def __init__(self, path, phenny): asyncore.dispatcher.__init__(self) self.phenny = phenny self.phenny._orig_close = self.phenny.close self.phenny.close = (lambda: self._phenny_close()) self.create_socket(socket.AF_UNIX, socket.SOCK_STREAM) try: mode = os.stat(path).st_mode if stat.S_ISSOCK(mode): os.unlink(path) else: print("Path '%s' exists and is not a socket!" % path) sys.exit(1) except OSError: pass old_mask = os.umask(0o000) self.bind(path) os.umask(old_mask) self.listen(5) def _phenny_close(self): self.close() self.phenny._orig_close() def handle_accept(self): pair = self.accept() if pair is not None: sock, addr = pair handler = Sender(sock, self.phenny)