diff options
Diffstat (limited to 'logger.py')
l---------[-rw-r--r--] | logger.py | 337 |
1 files changed, 1 insertions, 336 deletions
diff --git a/logger.py b/logger.py index 92d5157..e1dc8ce 100644..120000 --- a/logger.py +++ b/logger.py @@ -1,336 +1 @@ -#!/usr/bin/python - -from threading import Thread, Lock -import re, time, sys, string, socket, os, platform, traceback, Queue, ssl, 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: - #print "LogRotate will sleep until %d/%d/%d %d:%02d:%02d"%(time.localtime(nextrotate)[:6]) - 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)))) - self.logger.rotatelock.acquire() - 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 - self.logger.logrotate=None - self.logger.rotatelock.release() - break - self.logger.rotatelock.release() - #print "Rotating Logs" - 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(): - #IRC.loglock.acquire() - if IRC.connected: - IRC.lock.acquire() - try: - self.logger.rotateConsoleLog(IRC) - if IRC.identity: - for channel in IRC.identity.channels: - self.logger.rotateChannelLog(channel) - finally: - IRC.lock.release() - 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 addNetworks(self, **IRCs): ### Deprecated - for (label,IRC) in IRCs.items(): - if not os.path.isdir(os.path.join(self.logroot, label)): - os.mkdir(os.path.join(self.logroot, label)) - if label in self.labels.values(): - raise BaseException, "Label already exists" - if IRC in self.IRCs.keys(): - raise BaseException, "Network already exists" - for (label,IRC) in IRCs.items(): - self.labels[IRC]=label - IRC.lock.acquire() - IRC.modules.append(self) - if IRC.connected: - self.openConsoleLog(IRC) - IRC.lock.release() - def removeNetworks(self, *IRCs): ### Deprecated - for IRC in IRCs: - if IRC not in self.IRCs.keys(): - raise BaseException, "Network not added" - for IRC in IRCs: - IRC.lock.acquire() - IRC.modules.append(self) - if IRC.connected: - self.closeConsoleLog(IRC) - IRC.lock.release() - del self.labels[IRC] - del self.consolelogs[IRC] - - 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)) - IRC.lock.acquire() - self.labels[IRC]=label - if IRC.connected: - self.openConsoleLog(IRC) - if IRC.identity: - for channel in IRC.identity.channels: - self.openChannelLog(channel) - IRC.lock.release() - - def onModuleRem(self, IRC): - IRC.lock.acquire() - 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) - IRC.lock.release() - del self.labels[IRC] - del self.consolelogs[IRC] - - def openConsoleLog(self, IRC): - self.rotatelock.acquire() - if not self.logrotate or not self.logrotate.isAlive(): - self.logrotate=LogRotate(self) - self.rotatelock.release() - 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): - self.rotatelock.acquire() - if not self.logrotate or not self.logrotate.isAlive(): - self.logrotate=LogRotate(self) - self.logrotate.daemon=True - self.logrotate.start() - self.rotatelock.release() - 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() +../logger.py
\ No newline at end of file |