diff options
author | Brian Sherson <caretaker82@euclid.shersonb.net> | 2013-08-27 23:47:24 -0700 |
---|---|---|
committer | Brian Sherson <caretaker82@euclid.shersonb.net> | 2013-08-27 23:47:24 -0700 |
commit | 2011bf9bbd042bba4a649f9e52a52c1149ff09c8 (patch) | |
tree | 5e2a4b26105a13a7c4ee383870516bd03d489651 /logger.py | |
parent | 7a015d666c81f5dd44507b69728e774c15c72f6d (diff) |
Diffstat (limited to 'logger.py')
-rw-r--r-- | logger.py | 672 |
1 files changed, 372 insertions, 300 deletions
@@ -1,310 +1,382 @@ #!/usr/bin/python from threading import Thread, Lock -import re, time, sys, string, socket, os, platform, traceback, Queue, ssl, urllib2 +import re +import time +import sys +import string +import socket +import os +import platform +import traceback +import Queue +import ssl +import urllib2 + class LogRotate(Thread): - def __init__(self, logger): - self.logger=logger - Thread.__init__(self) - self.daemon=True - self.start() - def run(self): - Y, M, D, h, m, s, w, d, dst=time.localtime() - nextrotate=int(time.mktime((Y, M, D+1, 0, 0, 0, 0, 0, -1))) - #print time.time()-nextrotate - #print time.localtime(), time.localtime(nextrotate) - while True: - while nextrotate>time.time(): ### May need to do this in a loop in case the following time.sleep command wakes up a second too early. - time.sleep(max(0.1, min((nextrotate-time.time(), 3600)))) - with self.logger.rotatelock: - if all([not log or log.closed for log in self.logger.consolelogs.values()+self.logger.channellogs.values()]): - ### If there are no logs to rotate, we are going to terminate this thread. Logger will spawn another LogRotate thread when needed. - self.logger.logrotate=None - break - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - for IRC in self.logger.labels.keys(): - if IRC.connected: - with IRC.lock: - try: - self.logger.rotateConsoleLog(IRC) - except: - with IRC.loglock: - exc,excmsg,tb=sys.exc_info() - print >>IRC.log, "%(timestamp)s !!! [LogRotate] Exception in module %(module)s" % vars() - for tbline in traceback.format_exc().split("\n"): - print >>IRC.log, "%(timestamp)s !!! [LogRotate] %(tbline)s" % vars() - IRC.log.flush() - if IRC.identity: - for channel in IRC.identity.channels: - try: - self.logger.rotateChannelLog(channel) - except: - with IRC.loglock: - exc,excmsg,tb=sys.exc_info() - print >>IRC.log, "%(timestamp)s !!! [LogRotate] Exception in module %(module)s" % vars() - for tbline in traceback.format_exc().split("\n"): - print >>IRC.log, "%(timestamp)s !!! [LogRotate] %(tbline)s" % vars() - IRC.log.flush() - nextrotate+=3600*24 + def __init__(self, logger): + self.logger = logger + Thread.__init__(self) + self.daemon = True + self.start() + + def run(self): + Y, M, D, h, m, s, w, d, dst = time.localtime() + nextrotate = int(time.mktime((Y, M, D+1, 0, 0, 0, 0, 0, -1))) + #print time.time()-nextrotate + #print time.localtime(), time.localtime(nextrotate) + while True: + while nextrotate > time.time(): # May need to do this in a loop in case the following time.sleep command wakes up a second too early. + time.sleep(max(0.1, min((nextrotate-time.time(), 3600)))) + with self.logger.rotatelock: + if all([not log or log.closed for log in self.logger.consolelogs.values()+self.logger.channellogs.values()]): + ### If there are no logs to rotate, we are going to terminate this thread. Logger will spawn another LogRotate thread when needed. + self.logger.logrotate = None + break + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t) + .rjust(2, "0") for t in now[0:6]]) + for IRC in self.logger.labels.keys(): + if IRC.connected: + with IRC.lock: + try: + self.logger.rotateConsoleLog(IRC) + except: + with IRC.loglock: + exc, excmsg, tb = sys.exc_info() + print >>IRC.log, "%(timestamp)s !!! [LogRotate] Exception in module %(module)s" % vars() + for tbline in traceback.format_exc().split("\n"): + print >>IRC.log, "%(timestamp)s !!! [LogRotate] %(tbline)s" % vars() + IRC.log.flush() + if IRC.identity: + for channel in IRC.identity.channels: + try: + self.logger.rotateChannelLog(channel) + except: + with IRC.loglock: + exc, excmsg, tb = sys.exc_info() + print >>IRC.log, "%(timestamp)s !!! [LogRotate] Exception in module %(module)s" % vars() + for tbline in traceback.format_exc().split("\n"): + print >>IRC.log, "%(timestamp)s !!! [LogRotate] %(tbline)s" % vars() + IRC.log.flush() + nextrotate += 3600*24 + class Logger(object): - def __init__(self, logroot): - self.logroot=logroot - path=[logroot] - #print path - while not os.path.isdir(path[0]): - split=os.path.split(path[0]) - path.insert(1,split[1]) - path[0]=split[0] - #print path - while len(path)>1: - path[0]=os.path.join(*path[:2]) - del path[1] - #print path - os.mkdir(path[0]) - #return - self.consolelogs={} - self.channellogs={} - self.labels={} - self.rotatelock=Lock() - self.logrotate=None - def onModuleAdd(self, IRC, label): - if label in self.labels.values(): - raise BaseException, "Label already exists" - if IRC in self.labels.keys(): - raise BaseException, "Network already exists" - if not os.path.isdir(os.path.join(self.logroot, label)): - os.mkdir(os.path.join(self.logroot, label)) - self.labels[IRC]=label - if IRC.connected: - self.openConsoleLog(IRC) - if IRC.identity: - for channel in IRC.identity.channels: - self.openChannelLog(channel) + def __init__(self, logroot): + self.logroot = logroot + path = [logroot] + #print path + while not os.path.isdir(path[0]): + split = os.path.split(path[0]) + path.insert(1, split[1]) + path[0] = split[0] + #print path + while len(path) > 1: + path[0] = os.path.join(*path[:2]) + del path[1] + #print path + os.mkdir(path[0]) + #return + self.consolelogs = {} + self.channellogs = {} + self.labels = {} + self.rotatelock = Lock() + self.logrotate = None + + def onModuleAdd(self, IRC, label): + if label in self.labels.values(): + raise BaseException("Label already exists") + if IRC in self.labels.keys(): + raise BaseException("Network already exists") + if not os.path.isdir(os.path.join(self.logroot, label)): + os.mkdir(os.path.join(self.logroot, label)) + self.labels[IRC] = label + if IRC.connected: + self.openConsoleLog(IRC) + if IRC.identity: + for channel in IRC.identity.channels: + self.openChannelLog(channel) + + def onModuleRem(self, IRC): + if IRC.connected: + for channel in self.channellogs.keys(): + if channel in IRC.channels: + if not self.channellogs[channel].closed: + self.closeChannelLog(channel) + del self.channellogs[channel] + if not self.consolelogs[IRC].closed: + self.closeConsoleLog(IRC) + del self.labels[IRC] + del self.consolelogs[IRC] + + def openConsoleLog(self, IRC): + with self.rotatelock: + if not self.logrotate or not self.logrotate.isAlive(): + self.logrotate = LogRotate(self) + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + self.consolelogs[IRC] = open(os.path.join(self.logroot, self.labels[ + IRC], "console-%04d.%02d.%02d.log"%now[:3]), "a") + print >>self.consolelogs[IRC], "%s %s ### Log session started" % ( + timestamp, time.tzname[now[-1]]) + self.consolelogs[IRC].flush() + + def closeConsoleLog(self, IRC): + if IRC in self.consolelogs.keys() and type(self.consolelogs[IRC]) == file and not self.consolelogs[IRC].closed: + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t) + .rjust(2, "0") for t in now[0:6]]) + print >>self.consolelogs[IRC], "%s %s ### Log session ended" % ( + timestamp, time.tzname[now[-1]]) + self.consolelogs[IRC].close() + + def rotateConsoleLog(self, IRC): + self.closeConsoleLog(IRC) + self.openConsoleLog(IRC) + + def openChannelLog(self, channel): + with self.rotatelock: + if not self.logrotate or not self.logrotate.isAlive(): + self.logrotate = LogRotate(self) + self.logrotate.daemon = True + self.logrotate.start() + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + label = self.labels[channel.context] + self.channellogs[channel] = open(os.path.join(self.logroot, label, "channel-%s-%04d.%02d.%02d.log"%((urllib2.quote(channel.name.lower()).replace("/", "%2f"),)+now[:3])), "a") + print >>self.channellogs[channel], "%s %s ### Log session started" % ( + timestamp, time.tzname[now[-1]]) + self.channellogs[channel].flush() + if channel.context.identity in channel.users: + if channel.topic: + print >>self.channellogs[channel], "%s %s <<< :%s 332 %s %s :%s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.topic) + if channel.topicsetby and channel.topictime: + print >>self.channellogs[channel], "%s %s <<< :%s 333 %s %s %s %s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.topicsetby, channel.topictime) + if channel.users: + secret = "s" in channel.modes.keys() and channel.modes["s"] + private = "p" in channel.modes.keys() and channel.modes["p"] + namesusers = [] + modes, symbols = channel.context.supports["PREFIX"] + print >>self.channellogs[channel], "%s %s <<< :%s 353 %s %s %s :%s" % (timestamp, time.tzname[now[-1]], + channel.context.serv, + channel.context.identity.nick, + "@" if secret else ("*" if private else "="), + channel.name, + " ".join(["".join([symbols[k] if modes[k] in channel.modes.keys() and user in channel.modes[modes[k]] else "" for k in xrange(len(modes))])+user.nick for user in channel.users])) + if channel.modes: + modes = channel.modes.keys() + modestr = "".join([mode for mode in modes if mode not in channel.context.supports["CHANMODES"][0]+channel.context.supports["PREFIX"][0] and channel.modes[mode]]) + params = " ".join([channel.modes[mode] for mode in modes if mode in channel.context.supports["CHANMODES"][1]+channel.context.supports["CHANMODES"][2] and channel.modes[mode]]) + print >>self.channellogs[channel], "%s %s <<< :%s 324 %s %s +%s %s" % (timestamp, time.tzname[now[-1]], channel.context.server, channel.context.identity.nick, channel.name, modestr, params) + if channel.created: + print >>self.channellogs[channel], "%s %s <<< :%s 329 %s %s %s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.created) + self.channellogs[channel].flush() + + def closeChannelLog(self, channel): + if channel in self.channellogs.keys() and type(self.channellogs[channel]) == file and not self.channellogs[channel].closed: + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t) + .rjust(2, "0") for t in now[0:6]]) + print >>self.channellogs[channel], "%s %s ### Log session ended" % (timestamp, time.tzname[now[-1]]) + self.channellogs[channel].close() + + def rotateChannelLog(self, channel): + self.closeChannelLog(channel) + self.openChannelLog(channel) + + def onRecv(self, IRC, line, data): + modemapping = dict(Y="ircop", q="owner", a="admin", o="op", + h="halfop", v="voice") + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + if data is None: + print >>self.consolelogs[IRC], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.consolelogs[IRC].flush() + return + (origin, ident, host, cmd, target, params, extinfo) = data + if re.match("^\\d+$", cmd): + cmd = int(cmd) + if cmd in (324, 329): + modeparams = params.split() + channame = modeparams[0] + channel = IRC.channel(channame) + if channel in self.channellogs.keys() and not self.channellogs[channel].closed: + log = self.channellogs[channel] + else: + log = self.consolelogs[IRC] + print >>log, "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + log.flush() + elif cmd == 332: + channel = IRC.channel(params) + if channel in self.channellogs.keys() and not self.channellogs[channel].closed: + log = self.channellogs[channel] + else: + log = self.consolelogs[IRC] + print >>log, "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + log.flush() + elif cmd == 333: + (channame, nick, dt) = params.split() + channel = IRC.channel(channame) + if not self.channellogs[channel].closed: + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif cmd == 353: + (flag, channame) = params.split() + channel = IRC.channel(channame) + if not self.channellogs[channel].closed: + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif cmd == "JOIN": + user = IRC.user(origin) + channel = IRC.channel(target if len(target) else extinfo) + if user == IRC.identity: + self.openChannelLog(channel) + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif cmd == "PRIVMSG": + if target and target[0] in IRC.supports["CHANTYPES"]: + channel = IRC.channel(target) + if ident and host: + user = IRC.user(origin) + classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) + else: + classes = "server" + if classes: + print >>self.channellogs[channel], "%s %s %s <<< %s" % (timestamp, time.tzname[now[-1]], classes, line) + else: + print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif cmd == "NOTICE": + if target and (target[0] in IRC.supports["CHANTYPES"] or (len(target) > 1 and target[0] in IRC.supports["PREFIX"][1] and target[1] in IRC.supports["CHANTYPES"])): + if target[0] in IRC.supports["PREFIX"][1]: + channel = IRC.channel(target[1:]) + else: + channel = IRC.channel(target) + if ident and host: + user = IRC.user(origin) + classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) + else: + classes = "server" + if classes: + print >>self.channellogs[channel], "%s %s %s <<< %s" % (timestamp, time.tzname[now[-1]], classes, line) + else: + print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif target.lower() == IRC.identity.nick.lower() and not ident and not host: + print >>self.consolelogs[IRC], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.consolelogs[IRC].flush() + elif cmd == "TOPIC": + channel = IRC.channel(target) + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + elif cmd == "PART": + user = IRC.user(origin) + channel = IRC.channel(target) + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + if user == IRC.identity: + self.closeChannelLog(channel) + elif cmd == "KICK": + kicked = IRC.user(params) + channel = IRC.channel(target) + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + if kicked == IRC.identity: + self.closeChannelLog(channel) + elif cmd == "MODE": + if target and target[0] in IRC.supports["CHANTYPES"]: + channel = IRC.channel(target) + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + else: + print >>self.consolelogs[IRC], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.consolelogs[IRC].flush() + elif cmd in ("NICK", "QUIT"): + user = IRC.user(origin) + for channel in user.channels: + print >>self.channellogs[channel], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.channellogs[channel].flush() + else: + print >>self.consolelogs[IRC], "%s %s <<< %s" % ( + timestamp, time.tzname[now[-1]], line) + self.consolelogs[IRC].flush() + + def onConnectAttempt(self, IRC): + if IRC not in self.consolelogs.keys() or (not self.consolelogs[IRC]) or self.consolelogs[IRC].closed: + self.openConsoleLog(IRC) + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + print >>self.consolelogs[IRC], "%s %s *** Attempting connection to %s:%s." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - def onModuleRem(self, IRC): - if IRC.connected: - for channel in self.channellogs.keys(): - if channel in IRC.channels: - if not self.channellogs[channel].closed: self.closeChannelLog(channel) - del self.channellogs[channel] - if not self.consolelogs[IRC].closed: self.closeConsoleLog(IRC) - del self.labels[IRC] - del self.consolelogs[IRC] + def onConnect(self, IRC): + if IRC not in self.consolelogs.keys() or (not self.consolelogs[IRC]) or self.consolelogs[IRC].closed: + self.openConsoleLog(IRC) + #self.openConsoleLog(IRC) + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + print >>self.consolelogs[IRC], "%s %s *** Connection to %s:%s established." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - def openConsoleLog(self, IRC): - with self.rotatelock: - if not self.logrotate or not self.logrotate.isAlive(): - self.logrotate=LogRotate(self) - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - self.consolelogs[IRC]=open(os.path.join(self.logroot, self.labels[IRC], "console-%04d.%02d.%02d.log"%now[:3]), "a") - print >>self.consolelogs[IRC], "%s %s ### Log session started" % (timestamp, time.tzname[now[-1]]) - self.consolelogs[IRC].flush() - def closeConsoleLog(self, IRC): - if IRC in self.consolelogs.keys() and type(self.consolelogs[IRC])==file and not self.consolelogs[IRC].closed: - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - print >>self.consolelogs[IRC], "%s %s ### Log session ended" % (timestamp, time.tzname[now[-1]]) - self.consolelogs[IRC].close() - def rotateConsoleLog(self, IRC): - self.closeConsoleLog(IRC) - self.openConsoleLog(IRC) + def onDisconnect(self, IRC): + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + for channel in IRC.identity.channels: + print >>self.channellogs[channel], "%s %s *** Connection to %s:%s terminated." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) + self.channellogs[channel].flush() + self.closeChannelLog(channel) + print >>self.consolelogs[IRC], "%s %s *** Connection %s:%s terminated." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) + self.consolelogs[IRC].flush() + self.closeConsoleLog(IRC) - def openChannelLog(self, channel): - with self.rotatelock: - if not self.logrotate or not self.logrotate.isAlive(): - self.logrotate=LogRotate(self) - self.logrotate.daemon=True - self.logrotate.start() - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - label=self.labels[channel.context] - self.channellogs[channel]=open(os.path.join(self.logroot, label, "channel-%s-%04d.%02d.%02d.log"%((urllib2.quote(channel.name.lower()).replace("/","%2f"),)+now[:3])), "a") - print >>self.channellogs[channel], "%s %s ### Log session started" % (timestamp, time.tzname[now[-1]]) - self.channellogs[channel].flush() - if channel.context.identity in channel.users: - if channel.topic: print >>self.channellogs[channel], "%s %s <<< :%s 332 %s %s :%s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.topic) - if channel.topicsetby and channel.topictime: print >>self.channellogs[channel], "%s %s <<< :%s 333 %s %s %s %s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.topicsetby, channel.topictime) - if channel.users: - secret="s" in channel.modes.keys() and channel.modes["s"] - private="p" in channel.modes.keys() and channel.modes["p"] - namesusers=[] - modes, symbols=channel.context.supports["PREFIX"] - print >>self.channellogs[channel], "%s %s <<< :%s 353 %s %s %s :%s" % (timestamp, time.tzname[now[-1]], - channel.context.serv, - channel.context.identity.nick, - "@" if secret else ("*" if private else "="), - channel.name, - " ".join(["".join([symbols[k] if modes[k] in channel.modes.keys() and user in channel.modes[modes[k]] else "" for k in xrange(len(modes))])+user.nick for user in channel.users])) - if channel.modes: - modes=channel.modes.keys() - modestr="".join([mode for mode in modes if mode not in channel.context.supports["CHANMODES"][0]+channel.context.supports["PREFIX"][0] and channel.modes[mode]]) - params=" ".join([channel.modes[mode] for mode in modes if mode in channel.context.supports["CHANMODES"][1]+channel.context.supports["CHANMODES"][2] and channel.modes[mode]]) - print >>self.channellogs[channel], "%s %s <<< :%s 324 %s %s +%s %s" % (timestamp, time.tzname[now[-1]], channel.context.server, channel.context.identity.nick, channel.name, modestr, params) - if channel.created: print >>self.channellogs[channel], "%s %s <<< :%s 329 %s %s %s" % (timestamp, time.tzname[now[-1]], channel.context.serv, channel.context.identity.nick, channel.name, channel.created) - self.channellogs[channel].flush() - def closeChannelLog(self, channel): - if channel in self.channellogs.keys() and type(self.channellogs[channel])==file and not self.channellogs[channel].closed: - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - print >>self.channellogs[channel], "%s %s ### Log session ended" % (timestamp, time.tzname[now[-1]]) - self.channellogs[channel].close() - def rotateChannelLog(self, channel): - self.closeChannelLog(channel) - self.openChannelLog(channel) - def onRecv(self, IRC, line, data): - modemapping=dict(Y="ircop", q="owner", a="admin", o="op", h="halfop", v="voice") - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - if data==None: - print >>self.consolelogs[IRC], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.consolelogs[IRC].flush() - return - (origin, ident, host, cmd, target, params, extinfo)=data - if re.match("^\\d+$",cmd): cmd=int(cmd) - if cmd in (324, 329): - modeparams=params.split() - channame=modeparams[0] - channel=IRC.channel(channame) - if channel in self.channellogs.keys() and not self.channellogs[channel].closed: log=self.channellogs[channel] - else: log=self.consolelogs[IRC] - print >>log, "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - log.flush() - elif cmd == 332: - channel=IRC.channel(params) - if channel in self.channellogs.keys() and not self.channellogs[channel].closed: log=self.channellogs[channel] - else: log=self.consolelogs[IRC] - print >>log, "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - log.flush() - elif cmd == 333: - (channame,nick,dt)=params.split() - channel=IRC.channel(channame) - if not self.channellogs[channel].closed: - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif cmd == 353: - (flag, channame)=params.split() - channel=IRC.channel(channame) - if not self.channellogs[channel].closed: - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif cmd=="JOIN": - user=IRC.user(origin) - channel=IRC.channel(target if len(target) else extinfo) - if user==IRC.identity: - self.openChannelLog(channel) - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif cmd == "PRIVMSG": - if target and target[0] in IRC.supports["CHANTYPES"]: - channel=IRC.channel(target) - if ident and host: - user=IRC.user(origin) - classes=" ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) - else: - classes="server" - if classes: print >>self.channellogs[channel], "%s %s %s <<< %s" % (timestamp, time.tzname[now[-1]], classes, line) - else: print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif cmd == "NOTICE": - if target and (target[0] in IRC.supports["CHANTYPES"] or (len(target)>1 and target[0] in IRC.supports["PREFIX"][1] and target[1] in IRC.supports["CHANTYPES"])): - if target[0] in IRC.supports["PREFIX"][1]: - channel=IRC.channel(target[1:]) - else: - channel=IRC.channel(target) - if ident and host: - user=IRC.user(origin) - classes=" ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and user in channel.modes[mode]]) - else: - classes="server" - if classes: print >>self.channellogs[channel], "%s %s %s <<< %s" % (timestamp, time.tzname[now[-1]], classes, line) - else: print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif target.lower()==IRC.identity.nick.lower() and not ident and not host: - print >>self.consolelogs[IRC], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.consolelogs[IRC].flush() - elif cmd == "TOPIC": - channel=IRC.channel(target) - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - elif cmd == "PART": - user=IRC.user(origin) - channel=IRC.channel(target) - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - if user==IRC.identity: - self.closeChannelLog(channel) - elif cmd == "KICK": - kicked=IRC.user(params) - channel=IRC.channel(target) - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - if kicked==IRC.identity: - self.closeChannelLog(channel) - elif cmd == "MODE": - if target and target[0] in IRC.supports["CHANTYPES"]: - channel=IRC.channel(target) - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - else: - print >>self.consolelogs[IRC], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.consolelogs[IRC].flush() - elif cmd in ("NICK", "QUIT"): - user=IRC.user(origin) - for channel in user.channels: - print >>self.channellogs[channel], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.channellogs[channel].flush() - else: - print >>self.consolelogs[IRC], "%s %s <<< %s" % (timestamp, time.tzname[now[-1]], line) - self.consolelogs[IRC].flush() - def onConnectAttempt(self, IRC): - if IRC not in self.consolelogs.keys() or (not self.consolelogs[IRC]) or self.consolelogs[IRC].closed: - self.openConsoleLog(IRC) - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - print >>self.consolelogs[IRC], "%s %s *** Attempting connection to %s:%s." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - def onConnect(self, IRC): - if IRC not in self.consolelogs.keys() or (not self.consolelogs[IRC]) or self.consolelogs[IRC].closed: - self.openConsoleLog(IRC) - #self.openConsoleLog(IRC) - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - print >>self.consolelogs[IRC], "%s %s *** Connection to %s:%s established." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - def onDisconnect(self, IRC): - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - for channel in IRC.identity.channels: - print >>self.channellogs[channel], "%s %s *** Connection to %s:%s terminated." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - self.channellogs[channel].flush() - self.closeChannelLog(channel) - print >>self.consolelogs[IRC], "%s %s *** Connection %s:%s terminated." % (timestamp, time.tzname[now[-1]], IRC.server, IRC.port) - self.consolelogs[IRC].flush() - self.closeConsoleLog(IRC) - def onSend(self, IRC, line, data, origin): - modemapping=dict(Y="ircop", q="owner", a="admin", o="op", h="halfop", v="voice") - now=time.localtime() - timestamp=reduce(lambda x,y: x+":"+y,[str(t).rjust(2,"0") for t in now[0:6]]) - (cmd, target, params, extinfo)=data - if IRC.registered and cmd=="PRIVMSG" and "CHANTYPES" in IRC.supports.keys() and len(target) and target[0] in IRC.supports["CHANTYPES"]: - channel=IRC.channel(target) - if channel in IRC.identity.channels: - classes=" ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and IRC.identity in channel.modes[mode]]) - if classes: print >>self.channellogs[channel], "%s %s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], classes, IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - else: print >>self.channellogs[channel], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - self.channellogs[channel].flush() - else: - print >>self.consolelogs[IRC], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - self.consolelogs[IRC].flush() - if IRC.registered and len(target) and (target[0] in IRC.supports["CHANTYPES"] or (len(target)>1 and target[0] in IRC.supports["PREFIX"][1] and target[1] in IRC.supports["CHANTYPES"])) and cmd=="NOTICE": - channel=IRC.channel(target[1:] if target[0] in IRC.supports["PREFIX"][1] else target) - if channel in IRC.identity.channels: - classes=" ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and IRC.identity in channel.modes[mode]]) - if classes: print >>self.channellogs[channel], "%s %s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], classes, IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - else: print >>self.channellogs[channel], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - self.channellogs[channel].flush() - else: - print >>self.consolelogs[IRC], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) - self.consolelogs[IRC].flush() + def onSend(self, IRC, line, data, origin): + modemapping = dict(Y="ircop", q="owner", a="admin", o="op", + h="halfop", v="voice") + now = time.localtime() + timestamp = reduce(lambda x, y: x+":"+y, [str(t).rjust(2, + "0") for t in now[0:6]]) + (cmd, target, params, extinfo) = data + if IRC.registered and cmd == "PRIVMSG" and "CHANTYPES" in IRC.supports.keys() and len(target) and target[0] in IRC.supports["CHANTYPES"]: + channel = IRC.channel(target) + if channel in IRC.identity.channels: + classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and IRC.identity in channel.modes[mode]]) + if classes: + print >>self.channellogs[channel], "%s %s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], classes, IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + else: + print >>self.channellogs[channel], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + self.channellogs[channel].flush() + else: + print >>self.consolelogs[IRC], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + self.consolelogs[IRC].flush() + if IRC.registered and len(target) and (target[0] in IRC.supports["CHANTYPES"] or (len(target) > 1 and target[0] in IRC.supports["PREFIX"][1] and target[1] in IRC.supports["CHANTYPES"])) and cmd == "NOTICE": + channel = IRC.channel(target[1:] if target[0] + in IRC.supports["PREFIX"][1] else target) + if channel in IRC.identity.channels: + classes = " ".join([modemapping[mode] for mode in IRC.supports["PREFIX"][0] if mode in channel.modes.keys() and IRC.identity in channel.modes[mode]]) + if classes: + print >>self.channellogs[channel], "%s %s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], classes, IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + else: + print >>self.channellogs[channel], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + self.channellogs[channel].flush() + else: + print >>self.consolelogs[IRC], "%s %s >>> :%s!%s@%s %s" % (timestamp, time.tzname[now[-1]], IRC.identity.nick, IRC.identity.idnt, IRC.identity.host, line) + self.consolelogs[IRC].flush() |