mirror of https://github.com/fail2ban/fail2ban
ENH: added new command `fail2ban-client get <JAIL> banip` to get the banned ip addresses (gh-1916)
parent
966fa1be89
commit
3d477d229d
|
@ -56,6 +56,7 @@ ver. 0.11.0-dev-0 (20??/??/??) - development nightly edition
|
||||||
end of ban) of the ticket with ban-time of jail (as maximum), for all tickets with ban-time greater
|
end of ban) of the ticket with ban-time of jail (as maximum), for all tickets with ban-time greater
|
||||||
(or persistent); not affected if ban-time of the jail is unchanged between stop/start.
|
(or persistent); not affected if ban-time of the jail is unchanged between stop/start.
|
||||||
* added new setup-option `--without-tests` to skip building and installing of tests files (gh-2287).
|
* added new setup-option `--without-tests` to skip building and installing of tests files (gh-2287).
|
||||||
|
* added new command `fail2ban-client get <JAIL> banip` to get the banned ip addresses (gh-1916).
|
||||||
|
|
||||||
|
|
||||||
ver. 0.10.4-dev-1 (20??/??/??) - development edition
|
ver. 0.10.4-dev-1 (20??/??/??) - development edition
|
||||||
|
|
|
@ -180,6 +180,8 @@ class Beautifier:
|
||||||
msg = "The jail %s action %s has the following " \
|
msg = "The jail %s action %s has the following " \
|
||||||
"methods:\n" % (inC[1], inC[3])
|
"methods:\n" % (inC[1], inC[3])
|
||||||
msg += ", ".join(response)
|
msg += ", ".join(response)
|
||||||
|
elif inC[2] == "banip" and inC[0] == "get":
|
||||||
|
msg = " ".join(response)
|
||||||
except Exception:
|
except Exception:
|
||||||
logSys.warning("Beautifier error. Please report the error")
|
logSys.warning("Beautifier error. Please report the error")
|
||||||
logSys.error("Beautify %r with %r failed", response, self.__inputCmd,
|
logSys.error("Beautify %r with %r failed", response, self.__inputCmd,
|
||||||
|
|
|
@ -204,6 +204,16 @@ class Actions(JailThread, Mapping):
|
||||||
def getBanTime(self):
|
def getBanTime(self):
|
||||||
return self.__banManager.getBanTime()
|
return self.__banManager.getBanTime()
|
||||||
|
|
||||||
|
def getBanList(self):
|
||||||
|
"""Returns the list of banned IP addresses.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
list
|
||||||
|
The list of banned IP addresses.
|
||||||
|
"""
|
||||||
|
return self.__banManager.getBanList()
|
||||||
|
|
||||||
def removeBannedIP(self, ip=None, db=True, ifexists=False):
|
def removeBannedIP(self, ip=None, db=True, ifexists=False):
|
||||||
"""Removes banned IP calling actions' unban method
|
"""Removes banned IP calling actions' unban method
|
||||||
|
|
||||||
|
|
|
@ -510,6 +510,21 @@ class Server:
|
||||||
def getBanTime(self, name):
|
def getBanTime(self, name):
|
||||||
return self.__jails[name].actions.getBanTime()
|
return self.__jails[name].actions.getBanTime()
|
||||||
|
|
||||||
|
def getBanList(self, name):
|
||||||
|
"""Returns the list of banned IP addresses for a jail.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
name : str
|
||||||
|
The name of a jail.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
list
|
||||||
|
The list of banned IP addresses.
|
||||||
|
"""
|
||||||
|
return self.__jails[name].actions.getBanList()
|
||||||
|
|
||||||
def setBanTimeExtra(self, name, opt, value):
|
def setBanTimeExtra(self, name, opt, value):
|
||||||
self.__jails[name].setBanTimeExtra(opt, value)
|
self.__jails[name].setBanTimeExtra(opt, value)
|
||||||
|
|
||||||
|
|
|
@ -390,6 +390,8 @@ class Transmitter:
|
||||||
# Action
|
# Action
|
||||||
elif command[1] == "bantime":
|
elif command[1] == "bantime":
|
||||||
return self.__server.getBanTime(name)
|
return self.__server.getBanTime(name)
|
||||||
|
elif command[1] == "banip":
|
||||||
|
return self.__server.getBanList(name)
|
||||||
elif command[1].startswith("bantime."):
|
elif command[1].startswith("bantime."):
|
||||||
opt = command[1][len("bantime."):]
|
opt = command[1][len("bantime."):]
|
||||||
return self.__server.getBanTimeExtra(name, opt)
|
return self.__server.getBanTimeExtra(name, opt)
|
||||||
|
|
|
@ -103,6 +103,34 @@ class TransmitterBase(LogCaptureTestCase):
|
||||||
# if we expected to get it set without problem, check new value
|
# if we expected to get it set without problem, check new value
|
||||||
self.assertEqual(v(self.transm.proceed(getCmd)), v((0, outValue)))
|
self.assertEqual(v(self.transm.proceed(getCmd)), v((0, outValue)))
|
||||||
|
|
||||||
|
def getBanListTest(self, jail, banip=None, unbanip=None, outList=None):
|
||||||
|
"""Process set banip/set unbanip commands and compare the list of
|
||||||
|
banned IP addresses with outList."""
|
||||||
|
def v(value):
|
||||||
|
"""Prepare value for comparison."""
|
||||||
|
if value[1] is None:
|
||||||
|
tmp = []
|
||||||
|
else:
|
||||||
|
tmp = map(str, value[1])
|
||||||
|
return (value[0], sorted(tmp))
|
||||||
|
|
||||||
|
# Ban IP address
|
||||||
|
if banip is not None:
|
||||||
|
self.assertEqual(
|
||||||
|
self.transm.proceed(["set", jail, "banip", banip]),
|
||||||
|
(0, banip))
|
||||||
|
time.sleep(Utils.DEFAULT_SLEEP_TIME) # Give chance to ban
|
||||||
|
# Unban IP address
|
||||||
|
if unbanip is not None:
|
||||||
|
self.assertEqual(
|
||||||
|
self.transm.proceed(["set", jail, "unbanip", unbanip]),
|
||||||
|
(0, unbanip))
|
||||||
|
time.sleep(Utils.DEFAULT_SLEEP_TIME) # Give chance to unban
|
||||||
|
# Compare the list of banned IP addresses with outList
|
||||||
|
self.assertEqual(
|
||||||
|
v(self.transm.proceed(["get", jail, "banip"])),
|
||||||
|
v((0, outList)))
|
||||||
|
|
||||||
def setGetTestNOK(self, cmd, inValue, jail=None):
|
def setGetTestNOK(self, cmd, inValue, jail=None):
|
||||||
setCmd = ["set", cmd, inValue]
|
setCmd = ["set", cmd, inValue]
|
||||||
getCmd = ["get", cmd]
|
getCmd = ["get", cmd]
|
||||||
|
@ -347,6 +375,28 @@ class Transmitter(TransmitterBase):
|
||||||
self.transm.proceed(
|
self.transm.proceed(
|
||||||
["set", self.jailName, "unbanip", "192.168.1.1"])[0],1)
|
["set", self.jailName, "unbanip", "192.168.1.1"])[0],1)
|
||||||
|
|
||||||
|
def testJailBanList(self):
|
||||||
|
jail = "TestJailBanList"
|
||||||
|
self.server.addJail(jail, FAST_BACKEND)
|
||||||
|
self.server.startJail(jail)
|
||||||
|
|
||||||
|
self.getBanListTest(jail)
|
||||||
|
self.getBanListTest(
|
||||||
|
jail, banip="127.0.0.1", outList=["127.0.0.1"])
|
||||||
|
self.getBanListTest(
|
||||||
|
jail, banip="192.168.0.1",
|
||||||
|
outList=["127.0.0.1", "192.168.0.1"])
|
||||||
|
self.getBanListTest(
|
||||||
|
jail, banip="192.168.1.10",
|
||||||
|
outList=["127.0.0.1", "192.168.0.1", "192.168.1.10"])
|
||||||
|
self.getBanListTest(
|
||||||
|
jail, unbanip="127.0.0.1",
|
||||||
|
outList=["192.168.0.1", "192.168.1.10"])
|
||||||
|
self.getBanListTest(
|
||||||
|
jail, unbanip="192.168.1.10", outList=["192.168.0.1"])
|
||||||
|
self.getBanListTest(jail, unbanip="192.168.0.1", outList=[])
|
||||||
|
self.getBanListTest(jail)
|
||||||
|
|
||||||
def testJailMaxRetry(self):
|
def testJailMaxRetry(self):
|
||||||
self.setGetTest("maxretry", "5", 5, jail=self.jailName)
|
self.setGetTest("maxretry", "5", 5, jail=self.jailName)
|
||||||
self.setGetTest("maxretry", "2", 2, jail=self.jailName)
|
self.setGetTest("maxretry", "2", 2, jail=self.jailName)
|
||||||
|
|
|
@ -379,6 +379,10 @@ will look back for failures for
|
||||||
gets the time a host is banned for
|
gets the time a host is banned for
|
||||||
<JAIL>
|
<JAIL>
|
||||||
.TP
|
.TP
|
||||||
|
\fBget <JAIL> banip\fR
|
||||||
|
gets the list of banned IP
|
||||||
|
addresses for <JAIL>
|
||||||
|
.TP
|
||||||
\fBget <JAIL> datepattern\fR
|
\fBget <JAIL> datepattern\fR
|
||||||
gets the patern used to match
|
gets the patern used to match
|
||||||
date/times for <JAIL>
|
date/times for <JAIL>
|
||||||
|
|
Loading…
Reference in New Issue