mirror of https://github.com/fail2ban/fail2ban
fail2ban-regex: speedup formatted output (bypass unneeded stats creation);
fail2ban-regex: extended with prefregex statisticpull/2842/head^2
parent
db1f3477cc
commit
17a6ba44b3
|
@ -62,6 +62,9 @@ ver. 0.10.6-dev (20??/??/??) - development edition
|
||||||
* `filter.d/sshd.conf`: normalizing of user pattern in all RE's, allowing empty user (gh-2749)
|
* `filter.d/sshd.conf`: normalizing of user pattern in all RE's, allowing empty user (gh-2749)
|
||||||
|
|
||||||
### New Features and Enhancements
|
### New Features and Enhancements
|
||||||
|
* fail2ban-regex:
|
||||||
|
- speedup formatted output (bypass unneeded stats creation)
|
||||||
|
- extended with prefregex statistic
|
||||||
* new filter and jail for GitLab recognizing failed application logins (gh-2689)
|
* new filter and jail for GitLab recognizing failed application logins (gh-2689)
|
||||||
* `filter.d/guacamole.conf` extended with `logging` parameter to follow webapp-logging if it's configured (gh-2631)
|
* `filter.d/guacamole.conf` extended with `logging` parameter to follow webapp-logging if it's configured (gh-2631)
|
||||||
* introduced new prefix `{UNB}` for `datepattern` to disable word boundaries in regex;
|
* introduced new prefix `{UNB}` for `datepattern` to disable word boundaries in regex;
|
||||||
|
|
|
@ -252,6 +252,8 @@ class Fail2banRegex(object):
|
||||||
|
|
||||||
self.share_config=dict()
|
self.share_config=dict()
|
||||||
self._filter = Filter(None)
|
self._filter = Filter(None)
|
||||||
|
self._prefREMatched = 0
|
||||||
|
self._prefREGroups = list()
|
||||||
self._ignoreregex = list()
|
self._ignoreregex = list()
|
||||||
self._failregex = list()
|
self._failregex = list()
|
||||||
self._time_elapsed = None
|
self._time_elapsed = None
|
||||||
|
@ -453,19 +455,33 @@ class Fail2banRegex(object):
|
||||||
lines = []
|
lines = []
|
||||||
ret = []
|
ret = []
|
||||||
for match in found:
|
for match in found:
|
||||||
# Append True/False flag depending if line was matched by
|
if not self._opts.out:
|
||||||
# more than one regex
|
# Append True/False flag depending if line was matched by
|
||||||
match.append(len(ret)>1)
|
# more than one regex
|
||||||
regex = self._failregex[match[0]]
|
match.append(len(ret)>1)
|
||||||
regex.inc()
|
regex = self._failregex[match[0]]
|
||||||
regex.appendIP(match)
|
regex.inc()
|
||||||
|
regex.appendIP(match)
|
||||||
if not match[3].get('nofail'):
|
if not match[3].get('nofail'):
|
||||||
ret.append(match)
|
ret.append(match)
|
||||||
else:
|
else:
|
||||||
is_ignored = True
|
is_ignored = True
|
||||||
|
if self._opts.out: # (formated) output - don't need stats:
|
||||||
|
return None, ret, None
|
||||||
|
# prefregex stats:
|
||||||
|
if self._filter.prefRegex:
|
||||||
|
pre = self._filter.prefRegex
|
||||||
|
if pre.hasMatched():
|
||||||
|
self._prefREMatched += 1
|
||||||
|
if self._verbose:
|
||||||
|
if len(self._prefREGroups) < self._maxlines:
|
||||||
|
self._prefREGroups.append(pre.getGroups())
|
||||||
|
else:
|
||||||
|
if len(self._prefREGroups) == self._maxlines:
|
||||||
|
self._prefREGroups.append('...')
|
||||||
except RegexException as e: # pragma: no cover
|
except RegexException as e: # pragma: no cover
|
||||||
output( 'ERROR: %s' % e )
|
output( 'ERROR: %s' % e )
|
||||||
return False
|
return None, 0, None
|
||||||
if self._filter.getMaxLines() > 1:
|
if self._filter.getMaxLines() > 1:
|
||||||
for bufLine in orgLineBuffer[int(fullBuffer):]:
|
for bufLine in orgLineBuffer[int(fullBuffer):]:
|
||||||
if bufLine not in self._filter._Filter__lineBuffer:
|
if bufLine not in self._filter._Filter__lineBuffer:
|
||||||
|
@ -651,7 +667,18 @@ class Fail2banRegex(object):
|
||||||
pprint_list(out, " #) [# of hits] regular expression")
|
pprint_list(out, " #) [# of hits] regular expression")
|
||||||
return total
|
return total
|
||||||
|
|
||||||
# Print title
|
# Print prefregex:
|
||||||
|
if self._filter.prefRegex:
|
||||||
|
#self._filter.prefRegex.hasMatched()
|
||||||
|
pre = self._filter.prefRegex
|
||||||
|
out = [pre.getRegex()]
|
||||||
|
if self._verbose:
|
||||||
|
for grp in self._prefREGroups:
|
||||||
|
out.append(" %s" % (grp,))
|
||||||
|
output( "\n%s: %d total" % ("Prefregex", self._prefREMatched) )
|
||||||
|
pprint_list(out)
|
||||||
|
|
||||||
|
# Print regex's:
|
||||||
total = print_failregexes("Failregex", self._failregex)
|
total = print_failregexes("Failregex", self._failregex)
|
||||||
_ = print_failregexes("Ignoreregex", self._ignoreregex)
|
_ = print_failregexes("Ignoreregex", self._ignoreregex)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue