diff --git a/fail2ban/server/datedetector.py b/fail2ban/server/datedetector.py index b6dc39a5..9f119b3c 100644 --- a/fail2ban/server/datedetector.py +++ b/fail2ban/server/datedetector.py @@ -53,6 +53,8 @@ class DateDetector: def addDefaultTemplate(self): self.__lock.acquire() try: + # asctime with subsecond + self.appendTemplate("%a %b %d %H:%M:%S.%f %Y") # asctime self.appendTemplate("%a %b %d %H:%M:%S %Y") # asctime without year @@ -67,17 +69,19 @@ class DateDetector: # (See http://bugs.debian.org/537610) self.appendTemplate("%d/%m/%y %H:%M:%S") # Apache format [31/Oct/2006:09:22:55 -0000] - self.appendTemplate("%d/%b/%Y:%H:%M:%S") + self.appendTemplate("%d/%b/%Y:%H:%M:%S %z") # CPanel 05/20/2008:01:57:39 self.appendTemplate("%m/%d/%Y:%H:%M:%S") # custom for syslog-ng 2006.12.21 06:43:20 self.appendTemplate("%Y.%m.%d %H:%M:%S") # named 26-Jul-2007 15:20:52.252 - self.appendTemplate("%d-%b-%Y %H:%M:%S") + self.appendTemplate("%d-%b-%Y %H:%M:%S.%f") + # roundcube 26-Jul-2007 15:20:52 +0200 + self.appendTemplate("%d-%b-%Y %H:%M:%S %z") # 17-07-2008 17:23:25 self.appendTemplate("%d-%m-%Y %H:%M:%S") # 01-27-2012 16:22:44.252 - self.appendTemplate("%m-%d-%Y %H:%M:%S") + self.appendTemplate("%m-%d-%Y %H:%M:%S.%f") # TAI64N template = DateTai64n() template.setName("TAI64N") diff --git a/fail2ban/server/datetemplate.py b/fail2ban/server/datetemplate.py index 8dbb0482..81b307eb 100644 --- a/fail2ban/server/datetemplate.py +++ b/fail2ban/server/datetemplate.py @@ -51,6 +51,7 @@ class DateTemplate: return self.__name def setRegex(self, regex, wordBegin=True): + #logSys.debug(u"setRegex for %s is %r" % (self.__name, regex)) regex = regex.strip() if (wordBegin and not re.search(r'^\^', regex)): regex = r'\b' + regex @@ -115,16 +116,16 @@ class DateStrptime(DateTemplate): def __init__(self): DateTemplate.__init__(self) - self.__pattern = "" - self.__unsupportedStrptimeBits = False + self._pattern = "" + self._unsupportedStrptimeBits = False def setPattern(self, pattern): - self.__unsupported_f = not DateStrptime._f and re.search('%f', pattern) - self.__unsupported_z = not DateStrptime._z and re.search('%z', pattern) - self.__pattern = pattern + self._unsupported_f = not DateStrptime._f and re.search('%f', pattern) + self._unsupported_z = not DateStrptime._z and re.search('%z', pattern) + self._pattern = pattern def getPattern(self): - return self.__pattern + return self._pattern #@staticmethod def convertLocale(date): @@ -142,11 +143,11 @@ class DateStrptime(DateTemplate): if dateMatch: datePattern = self.getPattern() - if self.__unsupported_f: + if self._unsupported_f: if dateMatch.group('_f'): datePattern = re.sub(r'%f', dateMatch.group('_f'), datePattern) logSys.debug(u"Replacing %%f with %r now %r" % (dateMatch.group('_f'), datePattern)) - if self.__unsupported_z: + if self._unsupported_z: if dateMatch.group('_z'): datePattern = re.sub(r'%z', dateMatch.group('_z'), datePattern) logSys.debug(u"Replacing %%z with %r now %r" % (dateMatch.group('_z'), datePattern)) @@ -175,7 +176,7 @@ class DateStrptime(DateTemplate): "be tested due to already present year mark in the " "pattern" % (opattern, e)) - if self.__unsupported_z: + if self._unsupported_z: z = dateMatch.group('_z') if z: delta = timedelta(hours=int(z[1:3]),minutes=int(z[3:])) @@ -231,21 +232,24 @@ except ValueError: class DatePatternRegex(DateStrptime): _reEscape = r"([\\.^$*+?\(\){}\[\]|])" - _patternRE = r"%(%|[aAbBdHIjmMpSUwWyY])" + _patternRE = r"%(%|[aAbBdfHIjmMpSUwWyYz])" _patternName = { 'a': "DAY", 'A': "DAYNAME", 'b': "MON", 'B': "MONTH", 'd': "Day", 'H': "24hour", 'I': "12hour", 'j': "Yearday", 'm': "Month", 'M': "Minute", 'p': "AMPM", 'S': "Second", 'U': "Yearweek", - 'w': "Weekday", 'W': "Yearweek", 'y': 'Year2', 'Y': "Year", '%': "%"} + 'w': "Weekday", 'W': "Yearweek", 'y': 'Year2', 'Y': "Year", '%': "%", + 'z': "Zone offset", 'f': "Microseconds" } _patternRegex = { 'a': r"\w{3}", 'A': r"\w+", 'b': r"\w{3}", 'B': r"\w+", - 'd': r"(?:3[0-1]|[1-2]\d|[ 0]?\d)", 'H': r"(?:2[0-3]|1\d|[ 0]?\d)", + 'd': r"(?:3[0-1]|[1-2]\d|[ 0]?\d)", + 'f': r"\d{1,6}", 'H': r"(?:2[0-3]|1\d|[ 0]?\d)", 'I': r"(?:1[0-2]|[ 0]?\d)", 'j': r"(?:36[0-6]3[0-5]\d|[1-2]\d\d|[ 0]?\d\d|[ 0]{0,2}\d)", 'm': r"(?:1[0-2]|[ 0]?[1-9])", 'M': r"[0-5]\d", 'p': r"[AP]M", 'S': r"(?:6[01]|[0-5]\d)", 'U': r"(?:5[0-3]|[1-4]\d|[ 0]?\d)", 'w': r"[0-6]", 'W': r"(?:5[0-3]|[ 0]?\d)", 'y': r"\d{2}", - 'Y': r"\d{4}", '%': "%"} + 'Y': r"\d{4}", + 'z': r"(?P<_z>[+-]\d{4})", '%': "%"} def __init__(self, pattern=None, **kwargs): DateStrptime.__init__(self) @@ -253,7 +257,7 @@ class DatePatternRegex(DateStrptime): self.setPattern(pattern, **kwargs) def setPattern(self, pattern, anchor=False, **kwargs): - self.__pattern = pattern.strip() + DateStrptime.setPattern(self, pattern.strip()) name = re.sub(self._patternRE, r'%(\1)s', pattern) % self._patternName DateStrptime.setName(self, name) @@ -266,9 +270,6 @@ class DatePatternRegex(DateStrptime): regex = r"^" + regex DateStrptime.setRegex(self, regex, **kwargs) - def getPattern(self): - return self.__pattern - def setRegex(self, line): raise NotImplementedError("Regex derived from pattern")