import sys import re #from grok.debuglib import debug, DEBUG, INFO, WARN, FATAL from debuglib import debug, DEBUG, INFO, WARN, FATAL GLOBALPM = { 'HOST': '[\w+\._-]+', 'PORT': '\d+', 'PROG': '\w+', 'USER': '\w+', } class LineGrokker(object): def __init__(self, patterns, rules=None): self.patterns = patterns self.regexes = [] for p in self.patterns: r = RegexGenerator(GLOBALPM) r.generateRegex(p) self.regexes.append(r.regex) debug(INFO, "Processed pattern: %s" % p) def grok(self, data): for r in self.regexes: m = r.search(data) if m: print m.groupdict() class RegexGenerator(object): patternRegex = re.compile("(?P%\((?P(?P[A-Za-z0-9]+)(?:_(?P[A-Za-z0-9]+))?)\))") #patternRegex = re.compile("%\((?P\w+)\)") def __init__(self, patternMap): self.patternMap = patternMap def generateRegex(self, pattern): regexString = pattern self.matches = self.patternRegex.finditer(pattern) self.matchlist = [i for i in self.matches] for m in self.matchlist: md = m.groupdict() if self.patternMap.has_key(md['patname']): repl = self.generatePatternRegex(md['patname'], md['fullname']) print "Replacing %s with %s" %(md['substr'], repl) regexString = regexString.replace(md['substr'],repl) self.saveRegex(regexString) def generatePatternRegex(self, patname, fullname): return "(?P<%s>%s)" % (fullname, self.patternMap[patname]) def saveRegex(self, regexString): debug(INFO, "Saving regex; %s" % regexString) self.regexString = regexString self.regex = re.compile(regexString) if __name__ == "__main__": line = '%(HOST) %(PROG)\[\d+\]: error: PAM: authentication error for %(USER) from %(HOST_SRC)' pm = { 'HOST': '[\w+\._-]+', 'PORT': '\d+', 'PROG': '\w+', 'USER': '\w+', } g = LineGrokker([ '%(HOST) %(PROG)\[\d+\]: error: PAM: authentication error for %(USER) from %(HOST_SRC)', ]) while 1: l = sys.stdin.readline() g.grok(l)