From 6fef85ff2d0be4e33b8e99d4012c42d25258ef27 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 8 May 2013 12:07:26 -0400 Subject: [PATCH] ENH: strip CR and LF while analyzing the lines (processLine) (Close #202) This should allow to resolve issues with logs written in MS-DOS fashion, e.g. with daemontools See https://github.com/fail2ban/fail2ban/issues/202\#issuecomment-17393613 --- server/filter.py | 1 + testcases/filtertestcase.py | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/server/filter.py b/server/filter.py index 754a2a08..90530f92 100644 --- a/server/filter.py +++ b/server/filter.py @@ -290,6 +290,7 @@ class Filter(JailThread): l = line.decode('utf-8') except UnicodeDecodeError: l = line + l = l.rstrip('\r\n') timeMatch = self.dateDetector.matchTime(l) if timeMatch: # Lets split into time part and log part of the line diff --git a/testcases/filtertestcase.py b/testcases/filtertestcase.py index 00946f90..ce142bfd 100644 --- a/testcases/filtertestcase.py +++ b/testcases/filtertestcase.py @@ -579,11 +579,29 @@ class GetFailures(unittest.TestCase): - def testGetFailures01(self): - self.filter.addLogPath(GetFailures.FILENAME_01) - self.filter.addFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) ") - self.filter.getFailures(GetFailures.FILENAME_01) - _assert_correct_last_attempt(self, self.filter, GetFailures.FAILURES_01) + def testGetFailures01(self, filename=None, failures=None): + filename = filename or GetFailures.FILENAME_01 + failures = failures or GetFailures.FAILURES_01 + + self.filter.addLogPath(filename) + self.filter.addFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) $") + self.filter.getFailures(filename) + _assert_correct_last_attempt(self, self.filter, failures) + + def testCRLFFailures01(self): + # We first adjust logfile/failures to end with CR+LF + fname = tempfile.mktemp(prefix='tmp_fail2ban', suffix='crlf') + f = open(fname, 'w') + for l in open(GetFailures.FILENAME_01).readlines(): + f.write('%s\r\n' % l.rstrip('\n')) + f.close() + + # now see if we should be getting the "same" failures + self.testGetFailures01(filename=fname, + failures=GetFailures.FAILURES_01[:3] + + ([x.rstrip('\n') + '\r\n' for x in + GetFailures.FAILURES_01[-1]],)) + _killfile(f, fname) def testGetFailures02(self):