diff --git a/server/datetemplate.py b/server/datetemplate.py index 8e2cb7e1..51b8bb1e 100644 --- a/server/datetemplate.py +++ b/server/datetemplate.py @@ -50,7 +50,7 @@ class DateTemplate: def getName(self): return self.__name - def setRegex(self, regex, wordBegin = True): + def setRegex(self, regex, wordBegin=True): regex = regex.strip() if (wordBegin and not re.search(r'^\^', regex)): regex = r'\b' + regex @@ -186,7 +186,8 @@ class DateTai64n(DateTemplate): def __init__(self): DateTemplate.__init__(self) # We already know the format for TAI64N - self.setRegex("@[0-9a-f]{24}") + # yoh: we should not add an additional front anchor + self.setRegex("@[0-9a-f]{24}", wordBegin=False) def getDate(self, line): date = None diff --git a/testcases/datedetectortestcase.py b/testcases/datedetectortestcase.py index a2946587..64af1fab 100644 --- a/testcases/datedetectortestcase.py +++ b/testcases/datedetectortestcase.py @@ -103,6 +103,27 @@ class DateDetectorTest(unittest.TestCase): self.assertRaises(ValueError, self.__datedetector._appendTemplate, self.__datedetector.getTemplates()[0]) + def testFullYearMatch_gh130(self): + # see https://github.com/fail2ban/fail2ban/pull/130 + # yoh: unfortunately this test is not really effective to reproduce the + # situation but left in place to assure consistent behavior + m1 = [2012, 10, 11, 2, 37, 17] + self.assertEqual( + self.__datedetector.getTime('2012/10/11 02:37:17 [error] 18434#0')[:6], + m1) + self.__datedetector.sortTemplate() + # confuse it with year being at the end + for i in xrange(10): + self.assertEqual( + self.__datedetector.getTime('11/10/2012 02:37:17 [error] 18434#0')[:6], + m1) + self.__datedetector.sortTemplate() + # and now back to the original + self.assertEqual( + self.__datedetector.getTime('2012/10/11 02:37:17 [error] 18434#0')[:6], + m1) + + # def testDefaultTempate(self): # self.__datedetector.setDefaultRegex("^\S{3}\s{1,2}\d{1,2} \d{2}:\d{2}:\d{2}") # self.__datedetector.setDefaultPattern("%b %d %H:%M:%S")