From 16c8bfee75d0d6f41671bb621ee631311c02cc1b Mon Sep 17 00:00:00 2001 From: EUcancER Date: Mon, 21 Nov 2011 18:12:07 +0100 Subject: //punani: add irc-capabilities for punani --- punani/bot/__init__.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ punani/db/punani | 4 ++ punani/index.py | 58 +++++++++++++++++------------ 3 files changed, 138 insertions(+), 23 deletions(-) create mode 100755 punani/bot/__init__.py diff --git a/punani/bot/__init__.py b/punani/bot/__init__.py new file mode 100755 index 00000000..13d4c20b --- /dev/null +++ b/punani/bot/__init__.py @@ -0,0 +1,99 @@ +#!/usr/bin/python +from Queue import Queue +from SocketServer import BaseRequestHandler, ThreadingTCPServer +from threading import Thread +from time import sleep, strftime, strptime + +from ircbot import SingleServerIRCBot +from irclib import nm_to_n + +class PunaniRequestHandler(BaseRequestHandler): + """Handler for Punani messages.""" + + def handle(self): + try: + msg = self.request.recv(1024).strip() + except ValueError: + msg = 'Invalid message.' + else: + self.server.queue.put((self.client_address, msg)) + print ('%s:%d' % self.client_address), str(msg) + + +class PunaniReceiveServer(ThreadingTCPServer): + """UDP server that waits for Punani messages.""" + + def __init__(self): + ThreadingTCPServer.__init__(self, ('127.0.0.1', 5555), PunaniRequestHandler) + self.queue = Queue() + +class PunaniBot(SingleServerIRCBot): + + def __init__(self, server_list, channel_list, nickname='punani-ircbot', + realname='Bob Ross'): + SingleServerIRCBot.__init__(self, server_list, nickname, realname) + self.channel_list = channel_list + + def on_welcome(self, conn, event): + """Join channels after connect.""" + print 'Connected to %s:%d.' % conn.socket.getsockname() + for channel, key in self.channel_list: + conn.join(channel, key) + + def on_nicknameinuse(self, conn, event): + """Choose another nickname if conflicting.""" + self._nickname += '_' + conn.nick(self._nickname) + + def on_ctcp(self, conn, event): + """Answer CTCP PING and VERSION queries.""" + whonick = nm_to_n(event.source()) + message = event.arguments()[0].lower() + if message == 'version': + conn.notice(whonick, 'Punani2irc') + elif message == 'ping': + conn.pong(whonick) + + def on_privmsg(self, conn, event): + """React on private messages. + + Die, for example. + """ + whonick = nm_to_n(event.source()) + message = event.arguments()[0] + if message == 'die!': + print 'Shutting down as requested by %s...' % whonick + self.die('Shutting down.') + + def say(self, msg): + """Say message to channels.""" + for channel, key in self.channel_list: + self.connection.privmsg(channel, msg) + +def process_queue(announce_callback, queue, delay=2): + """Process received messages in queue.""" + while True: + sleep(delay) + try: + addr, msg = queue.get() + except Empty: + continue + #do something with the addr? + announce_callback(str(msg)) +if __name__ == '__main__': + # Set IRC connection parameters. + irc_servers = [('supernode', 6667)] + irc_channels = [('#retiolum','')] + + # Prepare and start IRC bot. + bot = PunaniBot(irc_servers, irc_channels) + t = Thread(target=bot.start) + t.daemon = True + t.start() + announce = bot.say + + receiver = PunaniReceiveServer() + t = Thread(target=process_queue,args=(announce,receiver.queue)) + t.daemon = True + t.start() + receiver.serve_forever() diff --git a/punani/db/punani b/punani/db/punani index 318f0e27..df471f3a 100644 --- a/punani/db/punani +++ b/punani/db/punani @@ -13,6 +13,10 @@ "brew" : "vim", "yum" : "vim" }, + "unison" : { + "apt-get" : "unison", + "pacman" : "unison" + }, "python" : { "apt-get" : "python", "pacman" : "python2" diff --git a/punani/index.py b/punani/index.py index a34c444a..ac19b2fb 100755 --- a/punani/index.py +++ b/punani/index.py @@ -2,7 +2,8 @@ import web import json - +import os +from bot import * urls = ( '/', 'Index', '/dump','Dump', @@ -17,27 +18,14 @@ CHANNEL="#retiolum" f = open(PDB_FILE) pdb = json.load(f) f.close() -bot = False - -try: - from threading import Thread - from ircbot import SingleServerIRCBot - class QuickBot(SingleServerIRCBot): - def on_welcome(self,conn,event): conn.join(CHANNEL) - def announce(self,msg): self.connection.privmsg(CHANNEL,"superballs") - #def on_pubmsg(self,conn,e): conn.privmsg(CHANNEL,"superaidsballs") - - bot = QuickBot([("supernode",6667)],"punani","punani") - try: - t = Thread(target=bot.start) - t.setDaemon(1) - t.start() - except (KeyboardInterrupt, SystemExit): - print("Got Interrupt!") - sys.exit() -except Exception,e: - print("Cannot connect to IRC %s" %str(e)) +polite = os.environ.get("polite",False) +from socket import * +def local_announce(msg): + s = socket(AF_INET,SOCK_STREAM) + s.connect(('localhost',5555)) + s.send(msg) + s.close() class Index: def GET(self): ret = """Welcome to the Tightnani API
@@ -66,8 +54,11 @@ class ArchFinder: ret = ret if ret else pdb.get(package,{}).get(super_packer,False) if not ret: - try: - bot.announce("%s asked for %s for the packer %s but i failed to find it. Please help me!" %(web.ctx.ip, packer, package)) + try: + if polite: + local_announce("Client `%s` asked for the tool `%s` in packer `%s` but i do not have it in my Database. Please update me!" %(web.ctx.ip, package,packer)) + else: + local_announce("404: no %s/%s for %s" % (request_packer,package,gethostbyaddr(web.ctx.ip)[0])) except Exception,e: print ("Got Exception %s: %s" % (str(Exception),(e))) web.NotFound() @@ -78,6 +69,27 @@ class ArchFinder: if __name__ == "__main__": import sys + # Set IRC connection parameters. + irc_servers = [('supernode', 6667)] + irc_channels = [('#retiolum','')] + + # Prepare and start IRC bot. + bot = PunaniBot(irc_servers, irc_channels) + t = Thread(target=bot.start) + t.daemon = True + t.start() + announce = bot.say + + receiver = PunaniReceiveServer() + t = Thread(target=receiver.serve_forever) + t.daemon = True + t.start() + + t = Thread(target=process_queue,args=(announce,receiver.queue)) + t.daemon = True + t.start() + + sys.argv.append(PORT) app = web.application(urls,globals()) app.internalerror = web.debugerror -- cgit v1.2.3