#!/usr/bin/env python
from xml.dom import minidom
from xml.dom.minidom import Document
import re
import sys
import time
class logparser:
"Log parser"
def __init__(self):
self.usermap = {}
self.modules = []
try:
fuserin = open('C:/CVSAutoMailerPY/userMap.txt',"r")
for line in fuserin:
usermapping = line.split(":",1)
p = re.compile('[a-zA-Z.]*\S')
userid = p.match(usermapping[0])
username = p.match(usermapping[1])
self.usermap[userid.group()]=username.group()
fuserin.close()
except IOError:
#Cannot proceed in this case. Write an error log and exit.
ferrout = open('C:/CVSAutoMailerPY/errorlog.txt',"a")
now = time.localtime(time.time())
ferrout.write("PARSER ERRORLOG ("+time.asctime(now)+"):Message - User Map file could not be found\n")
ferrout.flush()
ferrout.close()
fuserin.cloase()
sys.exit()
try:
fmodin = open('C:/CVSAutoMailerPY/modules.txt',"r")
for module in fmodin:
self.modules.append(module)
fmodin.close()
except IOError:
#Cannot proceed in this case. Write an error log and exit.
ferrout = open('C:/CVSAutoMailerPY/errorlog.txt',"a")
now = time.localtime(time.time())
ferrout.write("PARSER ERRORLOG ("+time.asctime(now)+"):Message - Module information file could not be found\n")
ferrout.flush()
ferrout.close()
fmodin.close()
sys.exit()
def parseLog(self):
#we have to populate a module map but for now....
for module in self.modules:
try:
modname = self.normalizeModuleName(module)
fin = "C:/CVSAutoMailerPY/logDataForum2.1.OLD"
fmsgout = "C:/CVSAutoMailerPY/CVSTest/test.txt"
ftest = open(fin)
fmsg = open(fmsgout,"w")
doc = minidom.parse(fin)
#msgHeader = self.getMessageHeader(modname)
#msgFooter = self.getMessageFooter(modname)
#fmsg.write(msgHeader)
# Unwanted but mandatory overhead to detect maliciou activities
loghead = doc.getElementsByTagName("CommitLog")
if loghead[0].hasChildNodes():
children = loghead[0].childNodes
for child in children:
if child.nodeType == 1:
if self.usermap.has_key(child.nodeName):
pass
else:
self.usermap[child.nodeName] = child.nodeName+" (user unknown)"
for user in self.usermap:
userEntry = doc.getElementsByTagName(user)
if userEntry:
userent = userEntry[0]
#print "Populating events performed by "+user
message = ""
username = ""
if self.usermap.has_key(user):
username = self.usermap[user]
else:
username = "Unknown User: "+user
fmsg.write("*** Changes by: "+username+" ***\n\n")
commitOp = userent.getElementsByTagName("CommitOperation")
times = "2"
old = None
oldmessage = ""
files = ""
hfg = "false"
if commitOp:
for ops in commitOp:
if old == None:
old = ops
newmessage = self.normalizeMessage(ops.getAttribute("message"))
#Populate file names(s) in msg
if oldmessage == newmessage:
file =ops.getAttribute("file")
path = ops.getAttribute("path")
normfilenames = self.normalizeFileName(file)
for file in normfilenames:
files+="\tFileName:\t"+path+"/"+file+"\n"
fmsg.write(files)
files=""
#fmsg.write("\t ** Grouped ** \n")
else:
if oldmessage == "":
pass
else:
fmsg.write("\tComments:\t" + oldmessage)
fmsg.write("\n\n")
file = ops.getAttribute("file")
path = ops.getAttribute("path")
normfilenames = self.normalizeFileName(file)
for file in normfilenames:
files+="\tFileName:\t"+path+"/"+file+"\n"
fmsg.write(files)
files=""
oldmessage = newmessage
old = ops
fmsg.write("\tComments:\t" + oldmessage)
fmsg.write("\n\n")
else:
ferrout = open('C:/CVSAutoMailerPY/errorlog.txt',"a")
now = time.localtime(time.time())
ferrout.write("PARSER ERRORLOG ("+time.asctime(now)+"):Message - No Commit operation found for this user entry. Atleast one operation expected.\n")
ferrout.flush()
ferrout.close()
fmodin.close()
#fmsg.write(msgFooter)
fmsg.close()
except IOError:
pass
def getMessageHeader(self,modname):
msgHeader = "From: CVSADMIN\n"
msgHeader+= "To: CVSNT\n"
msgHeader+= "Subject: CVS "+ modname + " Update Notification\n\n"
msgHeader+= "DO NOT Reply to this mail. This is an automatic notification of the CVS Updates.\n\n"
return msgHeader
def getMessageFooter(self,modname):
msgFooter = "Please update your local working copies.\n"
msgFooter+= "Thanks.\n"
msgFooter+= "CVS Admin\n"
msgFooter+= "Fischer International"
return msgFooter
def normalizeModuleName(self,module):
mod = module.strip("\n")
return mod
def normalizeMessage(self,message):
#reg = re.compile(r'[\s][\s]')
if message == "\"":
return "*** No Comments Added by the user ***"
else:
normmsg = message.strip("\"")
normmsg = normmsg.replace("<a rel="nofollow" href="file://\" target="_blank">\\","\</a>"")
return normmsg
def normalizeFileName(self,filename):
reg = re.compile(r'[\\]+[ ]+')
filelist = []
newfilelist = []
intmFN = reg.search(filename)
if intmFN!=None:
filename = filename.replace("<a rel="nofollow" href="http://www.daniweb.com/techtalkforums/" target="_blank">\\\\</a> ","%")
filelist = filename.split();
else:
filelist.append(filename)
if len(filelist) == 1:
spacedfiles = []
temp = filelist[0]
spacedfiles = temp.split()
if len(spacedfiles) == 1:
return filelist
else:
return spacedfiles
else:
for file in filelist:
makeorg = re.compile(r'[%]+')
found = makeorg.search(file)
if found!=None:
newfile = file.replace("%"," ");
newfilelist.append(newfile)
else:
newfilelist.append(file)
return newfilelist
lp = logparser()
lp.parseLog()