From 507d0468cdae84e1280faf3b0d3b6b4a800d0aa0 Mon Sep 17 00:00:00 2001 From: sebres Date: Sat, 11 Apr 2026 14:25:12 +0200 Subject: [PATCH] implements RFE #4164: new tag `` available in `ignorecommand` or actions (same as `` there) --- fail2ban/server/actions.py | 1 + fail2ban/tests/filtertestcase.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fail2ban/server/actions.py b/fail2ban/server/actions.py index 581c5724..6b603710 100644 --- a/fail2ban/server/actions.py +++ b/fail2ban/server/actions.py @@ -394,6 +394,7 @@ class Actions(JailThread, Mapping): # raw ticket info: "raw-ticket": lambda self: repr(self.__ticket), # jail info: + "jail.name": lambda self: self.__jail.name, "jail.banned": lambda self: self.__jail.actions.banManager.size(), "jail.banned_total": lambda self: self.__jail.actions.banManager.getBanTotal(), "jail.found": lambda self: self.__jail.filter.failManager.size(), diff --git a/fail2ban/tests/filtertestcase.py b/fail2ban/tests/filtertestcase.py index ef25c50a..65a609b7 100644 --- a/fail2ban/tests/filtertestcase.py +++ b/fail2ban/tests/filtertestcase.py @@ -617,14 +617,14 @@ class IgnoreIP(LogCaptureTestCase): self.pruneLog() self.assertFalse(self.filter.inIgnoreIPList(FailTicket("2001:db8::ffff"))) self.assertLogged("returned successfully 1") - # by user-name (ignore tester): - self.filter.ignoreCommand = 'if [ "" = "tester" ]; then exit 0; fi; exit 1' + # by user-name (ignore tester), also test jail.name tag: + self.filter.ignoreCommand = 'echo "jail:"; if [ "" = "tester" ]; then exit 0; fi; exit 1' self.pruneLog() self.assertTrue(self.filter.inIgnoreIPList(FailTicket("tester", data={'user': 'tester'}))) - self.assertLogged("returned successfully 0") + self.assertLogged("stdout: %r" % 'jail:DummyJail', "returned successfully 0", all=True) self.pruneLog() self.assertFalse(self.filter.inIgnoreIPList(FailTicket("root", data={'user': 'root'}))) - self.assertLogged("returned successfully 1", all=True) + self.assertLogged("stdout: %r" % 'jail:DummyJail', "returned successfully 1", all=True) def testIgnoreCache(self): # like both test-cases above, just cached (so once per key)...