From 689938ee9926320b6d24df7b352fe15c785c511e Mon Sep 17 00:00:00 2001 From: benrubson Date: Tue, 9 Oct 2018 19:27:39 +0200 Subject: [PATCH 1/5] Add a shortloglevel badips.py option --- config/action.d/badips.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/config/action.d/badips.py b/config/action.d/badips.py index 1ad711f4..c982bf33 100644 --- a/config/action.d/badips.py +++ b/config/action.d/badips.py @@ -75,6 +75,9 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable loglevel : int/str, optional Log level of the message when an IP is (un)banned. Default `DEBUG`. + shortloglevel : int/str, optional + Log level of the summary message when a group of IPs is (un)banned. + Default `DEBUG`. agent : str, optional User agent transmitted to server. Default `Fail2Ban/ver.` @@ -91,8 +94,8 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable return Request(url, headers={'User-Agent': self.agent}, **argv) def __init__(self, jail, name, category, score=3, age="24h", key=None, - banaction=None, bancategory=None, bankey=None, updateperiod=900, loglevel='DEBUG', agent="Fail2Ban", - timeout=TIMEOUT): + banaction=None, bancategory=None, bankey=None, updateperiod=900, + loglevel='DEBUG', shortloglevel='DEBUG', agent="Fail2Ban", timeout=TIMEOUT): super(BadIPsAction, self).__init__(jail, name) self.timeout = timeout @@ -105,6 +108,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable self.bancategory = bancategory or category self.bankey = bankey self.loglevel = str2LogLevel(loglevel) + self.shortloglevel = str2LogLevel(shortloglevel) self.updateperiod = updateperiod self._bannedips = set() @@ -350,9 +354,13 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable s = ips - self._bannedips p = len(s) self._banIPs(s) - self._logSys.log(self.loglevel, - "Updated IPs for jail '%s' (-%d/+%d). Update again in %i seconds", - self._jail.name, m, p, self.updateperiod) + if m != 0 or p != 0: + self._logSys.log(self.shortloglevel, + "Updated IPs for jail '%s' (-%d/+%d)", + self._jail.name, m, p) + self._logSys.debug( + "Next update for jail '%' in %i seconds", + self._jail.name, self.updateperiod) finally: self._timer = threading.Timer(self.updateperiod, self.update) self._timer.start() From 34edec297bb2b10c01e1182e1d0d809623e0093d Mon Sep 17 00:00:00 2001 From: Ben RUBSON Date: Tue, 4 Dec 2018 21:26:24 +0100 Subject: [PATCH 2/5] Add changelog entry --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index d389ea0c..089fae08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -105,6 +105,7 @@ ver. 0.10.4 (2018/10/04) - ten-four-on-due-date-ten-four * `filter.d/dovecot.conf`: extended with tags F-USER (and alternatives) to collect user-logins (gh-2168) * since v.0.10.4, fail2ban-client, fail2ban-server and fail2ban-regex will return version without logo info, additionally option `-V` can be used to get version in normalized machine-readable short format. +* `action.d/badips.py`: add a `shortloglevel` option for the summary message, in addition to the existing `loglevel` one ver. 0.10.3 (2018/04/04) - the-time-is-always-right-to-do-what-is-right From 51260680997b8aa645835ca29e42094996ef1335 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 22 Feb 2019 14:03:21 +0100 Subject: [PATCH 3/5] loglevel and shortloglevel combined to single parameter loglevel, below an example logging summary with NOTICE and rest with DEBUG log-levels: action = badips.py[... , loglevel="debug, notice"] --- config/action.d/badips.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/config/action.d/badips.py b/config/action.d/badips.py index c982bf33..e5de7555 100644 --- a/config/action.d/badips.py +++ b/config/action.d/badips.py @@ -32,7 +32,7 @@ else: # pragma: 3.x no cover from urllib import urlencode from fail2ban.server.actions import ActionBase -from fail2ban.helpers import str2LogLevel +from fail2ban.helpers import splitwords, str2LogLevel @@ -75,9 +75,9 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable loglevel : int/str, optional Log level of the message when an IP is (un)banned. Default `DEBUG`. - shortloglevel : int/str, optional - Log level of the summary message when a group of IPs is (un)banned. - Default `DEBUG`. + Can be also supplied as two-value list (comma- or space separated) to + provide level of the summary message when a group of IPs is (un)banned. + Example `DEBUG,INFO`. agent : str, optional User agent transmitted to server. Default `Fail2Ban/ver.` @@ -95,7 +95,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable def __init__(self, jail, name, category, score=3, age="24h", key=None, banaction=None, bancategory=None, bankey=None, updateperiod=900, - loglevel='DEBUG', shortloglevel='DEBUG', agent="Fail2Ban", timeout=TIMEOUT): + loglevel='DEBUG', agent="Fail2Ban", timeout=TIMEOUT): super(BadIPsAction, self).__init__(jail, name) self.timeout = timeout @@ -107,8 +107,9 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable self.banaction = banaction self.bancategory = bancategory or category self.bankey = bankey - self.loglevel = str2LogLevel(loglevel) - self.shortloglevel = str2LogLevel(shortloglevel) + loglevel = splitwords(loglevel) + self.sumloglevel = str2LogLevel(loglevel[-1]) + self.loglevel = str2LogLevel(loglevel[0]) self.updateperiod = updateperiod self._bannedips = set() @@ -355,7 +356,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable p = len(s) self._banIPs(s) if m != 0 or p != 0: - self._logSys.log(self.shortloglevel, + self._logSys.log(self.sumloglevel, "Updated IPs for jail '%s' (-%d/+%d)", self._jail.name, m, p) self._logSys.debug( From 3fcb0a868d1a53ca42cd78fd477ce9f8c75427cc Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 22 Feb 2019 14:07:11 +0100 Subject: [PATCH 4/5] test-cases: availability of badips-service - avoid sporadic errors (like "The handshake operation timed out") during setup of tests --- fail2ban/tests/action_d/test_badips.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fail2ban/tests/action_d/test_badips.py b/fail2ban/tests/action_d/test_badips.py index 3ea1fc76..7f2222e1 100644 --- a/fail2ban/tests/action_d/test_badips.py +++ b/fail2ban/tests/action_d/test_badips.py @@ -55,6 +55,7 @@ if sys.version_info >= (2,7): # pragma: no cover - may be unavailable pythonModule = None modAction = None + @skip_if_not_available def setUp(self): """Call before every test case.""" super(BadIPsActionTest, self).setUp() From 410a9804b1b7a96a9be382fe9172af365b4c9497 Mon Sep 17 00:00:00 2001 From: "Sergey G. Brester" Date: Fri, 22 Feb 2019 14:23:05 +0100 Subject: [PATCH 5/5] Update ChangeLog --- ChangeLog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 089fae08..425979f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -62,6 +62,9 @@ ver. 0.10.5-dev-1 (20??/??/??) - development edition attempts (failure) for IP (resp. failure-ID), see gh-2351; Syntax: - `fail2ban-client set attempt [ ... ]` +* `action.d/badips.py`: option `loglevel` extended with level of summary message, + following example configuration logging summary with NOTICE and rest with DEBUG log-levels: + `action = badips.py[loglevel="debug, notice"]` ver. 0.10.4 (2018/10/04) - ten-four-on-due-date-ten-four @@ -105,7 +108,6 @@ ver. 0.10.4 (2018/10/04) - ten-four-on-due-date-ten-four * `filter.d/dovecot.conf`: extended with tags F-USER (and alternatives) to collect user-logins (gh-2168) * since v.0.10.4, fail2ban-client, fail2ban-server and fail2ban-regex will return version without logo info, additionally option `-V` can be used to get version in normalized machine-readable short format. -* `action.d/badips.py`: add a `shortloglevel` option for the summary message, in addition to the existing `loglevel` one ver. 0.10.3 (2018/04/04) - the-time-is-always-right-to-do-what-is-right