mirror of https://github.com/fail2ban/fail2ban
amend to 747d4683221b5584f9663695fb48145689b42ceb:
fail2ban-regex: loosen up date patterns %ExY, %Exy - let accept every year from 19xx up to current century (+3 years)pull/1833/merge
parent
164105fab1
commit
0f44a3408a
|
@ -39,7 +39,6 @@ import os
|
||||||
import shlex
|
import shlex
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import time
|
|
||||||
import urllib
|
import urllib
|
||||||
from optparse import OptionParser, Option
|
from optparse import OptionParser, Option
|
||||||
|
|
||||||
|
@ -52,7 +51,7 @@ except ImportError:
|
||||||
|
|
||||||
from ..version import version, normVersion
|
from ..version import version, normVersion
|
||||||
from .filterreader import FilterReader
|
from .filterreader import FilterReader
|
||||||
from ..server.filter import Filter, FileContainer
|
from ..server.filter import Filter, FileContainer, MyTime
|
||||||
from ..server.failregex import Regex, RegexException
|
from ..server.failregex import Regex, RegexException
|
||||||
|
|
||||||
from ..helpers import str2LogLevel, getVerbosityFormat, FormatterWithTraceBack, getLogger, \
|
from ..helpers import str2LogLevel, getVerbosityFormat, FormatterWithTraceBack, getLogger, \
|
||||||
|
@ -269,15 +268,19 @@ class Fail2banRegex(object):
|
||||||
self.setJournalMatch(shlex.split(opts.journalmatch))
|
self.setJournalMatch(shlex.split(opts.journalmatch))
|
||||||
if opts.timezone:
|
if opts.timezone:
|
||||||
self._filter.setLogTimeZone(opts.timezone)
|
self._filter.setLogTimeZone(opts.timezone)
|
||||||
|
self._filter.checkFindTime = False
|
||||||
|
if True: # not opts.out:
|
||||||
|
MyTime.setAlternateNow(0); # accept every date (years from 19xx up to end of current century, '%ExY' and 'Exy' patterns)
|
||||||
|
from ..server.strptime import _updateTimeRE
|
||||||
|
_updateTimeRE()
|
||||||
if opts.datepattern:
|
if opts.datepattern:
|
||||||
self.setDatePattern(opts.datepattern)
|
self.setDatePattern(opts.datepattern)
|
||||||
if opts.usedns:
|
if opts.usedns:
|
||||||
self._filter.setUseDns(opts.usedns)
|
self._filter.setUseDns(opts.usedns)
|
||||||
self._filter.returnRawHost = opts.raw
|
self._filter.returnRawHost = opts.raw
|
||||||
self._filter.checkFindTime = False
|
|
||||||
self._filter.checkAllRegex = opts.checkAllRegex and not opts.out
|
self._filter.checkAllRegex = opts.checkAllRegex and not opts.out
|
||||||
# ignore pending (without ID/IP), added to matches if it hits later (if ID/IP can be retreved)
|
# ignore pending (without ID/IP), added to matches if it hits later (if ID/IP can be retreved)
|
||||||
self._filter.ignorePending = opts.out
|
self._filter.ignorePending = bool(opts.out)
|
||||||
# callback to increment ignored RE's by index (during process):
|
# callback to increment ignored RE's by index (during process):
|
||||||
self._filter.onIgnoreRegex = self._onIgnoreRegex
|
self._filter.onIgnoreRegex = self._onIgnoreRegex
|
||||||
self._backend = 'auto'
|
self._backend = 'auto'
|
||||||
|
|
|
@ -35,7 +35,7 @@ from ..helpers import getLogger
|
||||||
# Gets the instance of the logger.
|
# Gets the instance of the logger.
|
||||||
logSys = getLogger(__name__)
|
logSys = getLogger(__name__)
|
||||||
|
|
||||||
logLevel = 6
|
logLevel = 5
|
||||||
|
|
||||||
RE_DATE_PREMATCH = re.compile(r"(?<!\\)\{DATE\}", re.IGNORECASE)
|
RE_DATE_PREMATCH = re.compile(r"(?<!\\)\{DATE\}", re.IGNORECASE)
|
||||||
DD_patternCache = Utils.Cache(maxCount=1000, maxTime=60*60)
|
DD_patternCache = Utils.Cache(maxCount=1000, maxTime=60*60)
|
||||||
|
|
|
@ -136,7 +136,7 @@ class DateTemplate(object):
|
||||||
# remove possible special pattern "**" in front and end of regex:
|
# remove possible special pattern "**" in front and end of regex:
|
||||||
regex = RE_DEL_WRD_BOUNDS[0].sub(RE_DEL_WRD_BOUNDS[1], regex)
|
regex = RE_DEL_WRD_BOUNDS[0].sub(RE_DEL_WRD_BOUNDS[1], regex)
|
||||||
self._regex = regex
|
self._regex = regex
|
||||||
logSys.log(7, ' constructed regex %s', regex)
|
logSys.log(4, ' constructed regex %s', regex)
|
||||||
self._cRegex = None
|
self._cRegex = None
|
||||||
|
|
||||||
regex = property(getRegex, setRegex, doc=
|
regex = property(getRegex, setRegex, doc=
|
||||||
|
@ -159,6 +159,7 @@ class DateTemplate(object):
|
||||||
"""
|
"""
|
||||||
if not self._cRegex:
|
if not self._cRegex:
|
||||||
self._compileRegex()
|
self._compileRegex()
|
||||||
|
logSys.log(4, " search %s", self.regex)
|
||||||
dateMatch = self._cRegex.search(line, *args); # pos, endpos
|
dateMatch = self._cRegex.search(line, *args); # pos, endpos
|
||||||
if dateMatch:
|
if dateMatch:
|
||||||
self.hits += 1
|
self.hits += 1
|
||||||
|
|
|
@ -30,37 +30,6 @@ locale_time = LocaleTime()
|
||||||
TZ_ABBR_RE = r"[A-Z](?:[A-Z]{2,4})?"
|
TZ_ABBR_RE = r"[A-Z](?:[A-Z]{2,4})?"
|
||||||
FIXED_OFFSET_TZ_RE = re.compile(r"(%s)?([+-][01]\d(?::?\d{2})?)?$" % (TZ_ABBR_RE,))
|
FIXED_OFFSET_TZ_RE = re.compile(r"(%s)?([+-][01]\d(?::?\d{2})?)?$" % (TZ_ABBR_RE,))
|
||||||
|
|
||||||
def _getYearCentRE(cent=(0,3), distance=3, now=(MyTime.now(), MyTime.alternateNow)):
|
|
||||||
""" Build century regex for last year and the next years (distance).
|
|
||||||
|
|
||||||
Thereby respect possible run in the test-cases (alternate date used there)
|
|
||||||
"""
|
|
||||||
cent = lambda year, f=cent[0], t=cent[1]: str(year)[f:t]
|
|
||||||
def grp(exprset):
|
|
||||||
c = None
|
|
||||||
if len(exprset) > 1:
|
|
||||||
for i in exprset:
|
|
||||||
if c is None or i[0:-1] == c:
|
|
||||||
c = i[0:-1]
|
|
||||||
else:
|
|
||||||
c = None
|
|
||||||
break
|
|
||||||
if not c:
|
|
||||||
for i in exprset:
|
|
||||||
if c is None or i[0] == c:
|
|
||||||
c = i[0]
|
|
||||||
else:
|
|
||||||
c = None
|
|
||||||
break
|
|
||||||
if c:
|
|
||||||
return "%s%s" % (c, grp([i[len(c):] for i in exprset]))
|
|
||||||
return ("(?:%s)" % "|".join(exprset) if len(exprset[0]) > 1 else "[%s]" % "".join(exprset)) \
|
|
||||||
if len(exprset) > 1 else "".join(exprset)
|
|
||||||
exprset = set( cent(now[0].year + i) for i in (-1, distance) )
|
|
||||||
if len(now) and now[1]:
|
|
||||||
exprset |= set( cent(now[1].year + i) for i in xrange(-1, now[0].year-now[1].year+1, distance) )
|
|
||||||
return grp(sorted(list(exprset)))
|
|
||||||
|
|
||||||
timeRE = TimeRE()
|
timeRE = TimeRE()
|
||||||
|
|
||||||
# %k - one- or two-digit number giving the hour of the day (0-23) on a 24-hour clock,
|
# %k - one- or two-digit number giving the hour of the day (0-23) on a 24-hour clock,
|
||||||
|
@ -92,11 +61,51 @@ timeRE['Exk'] = r" ?(?P<H>2[0-3]|[0-1]\d|\d)"
|
||||||
timeRE['Exl'] = r" ?(?P<I>1[0-2]|\d)"
|
timeRE['Exl'] = r" ?(?P<I>1[0-2]|\d)"
|
||||||
timeRE['ExM'] = r"(?P<M>[0-5]\d)"
|
timeRE['ExM'] = r"(?P<M>[0-5]\d)"
|
||||||
timeRE['ExS'] = r"(?P<S>6[0-1]|[0-5]\d)"
|
timeRE['ExS'] = r"(?P<S>6[0-1]|[0-5]\d)"
|
||||||
|
|
||||||
|
def _updateTimeRE():
|
||||||
|
def _getYearCentRE(cent=(0,3), distance=3, now=(MyTime.now(), MyTime.alternateNow)):
|
||||||
|
""" Build century regex for last year and the next years (distance).
|
||||||
|
|
||||||
|
Thereby respect possible run in the test-cases (alternate date used there)
|
||||||
|
"""
|
||||||
|
cent = lambda year, f=cent[0], t=cent[1]: str(year)[f:t]
|
||||||
|
def grp(exprset):
|
||||||
|
c = None
|
||||||
|
if len(exprset) > 1:
|
||||||
|
for i in exprset:
|
||||||
|
if c is None or i[0:-1] == c:
|
||||||
|
c = i[0:-1]
|
||||||
|
else:
|
||||||
|
c = None
|
||||||
|
break
|
||||||
|
if not c:
|
||||||
|
for i in exprset:
|
||||||
|
if c is None or i[0] == c:
|
||||||
|
c = i[0]
|
||||||
|
else:
|
||||||
|
c = None
|
||||||
|
break
|
||||||
|
if c:
|
||||||
|
return "%s%s" % (c, grp([i[len(c):] for i in exprset]))
|
||||||
|
return ("(?:%s)" % "|".join(exprset) if len(exprset[0]) > 1 else "[%s]" % "".join(exprset)) \
|
||||||
|
if len(exprset) > 1 else "".join(exprset)
|
||||||
|
exprset = set( cent(now[0].year + i) for i in (-1, distance) )
|
||||||
|
if len(now) > 1 and now[1]:
|
||||||
|
exprset |= set( cent(now[1].year + i) for i in xrange(-1, now[0].year-now[1].year+1, distance) )
|
||||||
|
return grp(sorted(list(exprset)))
|
||||||
|
|
||||||
# more precise year patterns, within same century of last year and
|
# more precise year patterns, within same century of last year and
|
||||||
# the next 3 years (for possible long uptime of fail2ban); thereby
|
# the next 3 years (for possible long uptime of fail2ban); thereby
|
||||||
# respect possible run in the test-cases (alternate date used there):
|
# respect possible run in the test-cases (alternate date used there):
|
||||||
|
if MyTime.alternateNowTime != 0:
|
||||||
timeRE['ExY'] = r"(?P<Y>%s\d)" % _getYearCentRE(cent=(0,3), distance=3)
|
timeRE['ExY'] = r"(?P<Y>%s\d)" % _getYearCentRE(cent=(0,3), distance=3)
|
||||||
timeRE['Exy'] = r"(?P<y>%s\d)" % _getYearCentRE(cent=(2,3), distance=3)
|
timeRE['Exy'] = r"(?P<y>%s\d)" % _getYearCentRE(cent=(2,3), distance=3)
|
||||||
|
else: # accept years: 19xx|2xxx up to current century
|
||||||
|
timeRE['ExY'] = r"(?P<Y>(?:19\d{2}|%s\d))" % _getYearCentRE(cent=(0,3), distance=3,
|
||||||
|
now=(MyTime.now(), datetime.datetime.fromtimestamp(978393600)))
|
||||||
|
timeRE['Exy'] = r"(?P<y>\d{2})"
|
||||||
|
|
||||||
|
_updateTimeRE()
|
||||||
|
|
||||||
def getTimePatternRE():
|
def getTimePatternRE():
|
||||||
keys = timeRE.keys()
|
keys = timeRE.keys()
|
||||||
|
|
Loading…
Reference in New Issue