- The optimization in log reading should work

git-svn-id: https://fail2ban.svn.sourceforge.net/svnroot/fail2ban/trunk@92 a942ae1a-1317-0410-a47c-b1dcaea8d605
0.6
Cyril Jaquier 2005-03-29 14:37:46 +00:00
parent c442955e30
commit 7f62f9df89
1 changed files with 28 additions and 10 deletions

View File

@ -34,7 +34,8 @@ class LogReader:
attempt.
"""
def __init__(self, logSys, logPath, timeregex, timepattern, failregex, findTime = 3600):
def __init__(self, logSys, logPath, timeregex, timepattern, failregex,
findTime = 3600):
self.logPath = logPath
self.timeregex = timeregex
self.timepattern = timepattern
@ -44,7 +45,7 @@ class LogReader:
self.lastModTime = 0
self.logSys = logSys
self.lastPos = 0
self.lastSize = 0
self.lastDate = 0
self.logStats = None
def setName(self, name):
@ -57,6 +58,11 @@ class LogReader:
"""
return self.name
def getFindTime(self):
""" Gets the find time.
"""
return self.findTime
def addIgnoreIP(self, ip):
""" Adds an IP to the ignore list.
"""
@ -96,16 +102,16 @@ class LogReader:
def setFilePos(self, file):
""" Sets the file position. We must take care of log file rotation
and reset the position to 0 in that case. Use the file size in
order to detect this. Not the best solution yet.
and reset the position to 0 in that case. Use the log message
timestamp in order to detect this.
"""
if self.lastSize > self.logStats.st_size:
self.logSys.debug("Size " + `self.logStats.st_size` + " is " +
"smaller than " + `self.lastSize`)
line = file.readline()
if self.lastDate < self.getTime(line):
self.logSys.debug("Date " + `self.lastDate` + " is " +
"smaller than " + `self.getTime(line)`)
self.logSys.debug("Log rotation detected")
self.lastPos = 0
self.lastSize = self.logStats.st_size
self.logSys.debug("Setting file position to " + `self.lastPos`)
file.seek(self.lastPos)
@ -118,8 +124,10 @@ class LogReader:
"""
ipList = dict()
logFile = self.openLogFile()
#self.setFilePos(logFile)
self.setFilePos(logFile)
lastLine = ''
for line in logFile.readlines():
lastLine = line
failList = self.findFailure(line)
for element in failList:
ip = element[0]
@ -134,7 +142,8 @@ class LogReader:
ipList[ip] = (ipList[ip][0]+1, unixTime)
else:
ipList[ip] = (1, unixTime)
#self.lastPos = logFile.tell()
self.lastPos = logFile.tell()
self.lastDate = self.getTime(lastLine)
logFile.close()
return ipList
@ -157,6 +166,15 @@ class LogReader:
failList.append([ip, date])
return failList
def getTime(self, line):
""" Gets the time of a log message.
"""
date = 0
timeMatch = re.search(self.timeregex, line)
if timeMatch:
date = self.getUnixTime(timeMatch.group())
return date
def getUnixTime(self, value):
""" Returns the Unix timestamp of the given value.
Pattern should describe the date construction of