mirror of https://github.com/fail2ban/fail2ban
commit
1752c19b6f
|
@ -32,6 +32,8 @@ else: # pragma: 3.x no cover
|
||||||
from urllib import urlencode
|
from urllib import urlencode
|
||||||
|
|
||||||
from fail2ban.server.actions import ActionBase
|
from fail2ban.server.actions import ActionBase
|
||||||
|
from fail2ban.helpers import str2LogLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
|
@ -70,6 +72,9 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
updateperiod : int, optional
|
updateperiod : int, optional
|
||||||
Time in seconds between updating bad IPs blacklist.
|
Time in seconds between updating bad IPs blacklist.
|
||||||
Default 900 (15 minutes)
|
Default 900 (15 minutes)
|
||||||
|
loglevel : int/str, optional
|
||||||
|
Log level of the message when an IP is (un)banned.
|
||||||
|
Default `DEBUG`.
|
||||||
agent : str, optional
|
agent : str, optional
|
||||||
User agent transmitted to server.
|
User agent transmitted to server.
|
||||||
Default `Fail2Ban/ver.`
|
Default `Fail2Ban/ver.`
|
||||||
|
@ -86,7 +91,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
return Request(url, headers={'User-Agent': self.agent}, **argv)
|
return Request(url, headers={'User-Agent': self.agent}, **argv)
|
||||||
|
|
||||||
def __init__(self, jail, name, category, score=3, age="24h", key=None,
|
def __init__(self, jail, name, category, score=3, age="24h", key=None,
|
||||||
banaction=None, bancategory=None, bankey=None, updateperiod=900, agent="Fail2Ban",
|
banaction=None, bancategory=None, bankey=None, updateperiod=900, loglevel='DEBUG', agent="Fail2Ban",
|
||||||
timeout=TIMEOUT):
|
timeout=TIMEOUT):
|
||||||
super(BadIPsAction, self).__init__(jail, name)
|
super(BadIPsAction, self).__init__(jail, name)
|
||||||
|
|
||||||
|
@ -99,6 +104,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
self.banaction = banaction
|
self.banaction = banaction
|
||||||
self.bancategory = bancategory or category
|
self.bancategory = bancategory or category
|
||||||
self.bankey = bankey
|
self.bankey = bankey
|
||||||
|
self.loglevel = str2LogLevel(loglevel)
|
||||||
self.updateperiod = updateperiod
|
self.updateperiod = updateperiod
|
||||||
|
|
||||||
self._bannedips = set()
|
self._bannedips = set()
|
||||||
|
@ -289,7 +295,7 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
exc_info=self._logSys.getEffectiveLevel()<=logging.DEBUG)
|
exc_info=self._logSys.getEffectiveLevel()<=logging.DEBUG)
|
||||||
else:
|
else:
|
||||||
self._bannedips.add(ip)
|
self._bannedips.add(ip)
|
||||||
self._logSys.debug(
|
self._logSys.log(self.loglevel,
|
||||||
"Banned IP %s for jail '%s' with action '%s'",
|
"Banned IP %s for jail '%s' with action '%s'",
|
||||||
ip, self._jail.name, self.banaction)
|
ip, self._jail.name, self.banaction)
|
||||||
|
|
||||||
|
@ -304,12 +310,12 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
'ipjailmatches': "",
|
'ipjailmatches': "",
|
||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logSys.info(
|
self._logSys.error(
|
||||||
"Error unbanning IP %s for jail '%s' with action '%s': %s",
|
"Error unbanning IP %s for jail '%s' with action '%s': %s",
|
||||||
ip, self._jail.name, self.banaction, e,
|
ip, self._jail.name, self.banaction, e,
|
||||||
exc_info=self._logSys.getEffectiveLevel()<=logging.DEBUG)
|
exc_info=self._logSys.getEffectiveLevel()<=logging.DEBUG)
|
||||||
else:
|
else:
|
||||||
self._logSys.debug(
|
self._logSys.log(self.loglevel,
|
||||||
"Unbanned IP %s for jail '%s' with action '%s'",
|
"Unbanned IP %s for jail '%s' with action '%s'",
|
||||||
ip, self._jail.name, self.banaction)
|
ip, self._jail.name, self.banaction)
|
||||||
finally:
|
finally:
|
||||||
|
@ -337,13 +343,16 @@ class BadIPsAction(ActionBase): # pragma: no cover - may be unavailable
|
||||||
ips = self.getList(
|
ips = self.getList(
|
||||||
self.bancategory, self.score, self.age, self.bankey)
|
self.bancategory, self.score, self.age, self.bankey)
|
||||||
# Remove old IPs no longer listed
|
# Remove old IPs no longer listed
|
||||||
self._unbanIPs(self._bannedips - ips)
|
s = self._bannedips - ips
|
||||||
|
m = len(s)
|
||||||
|
self._unbanIPs(s)
|
||||||
# Add new IPs which are now listed
|
# Add new IPs which are now listed
|
||||||
self._banIPs(ips - self._bannedips)
|
s = ips - self._bannedips
|
||||||
|
p = len(s)
|
||||||
self._logSys.debug(
|
self._banIPs(s)
|
||||||
"Updated IPs for jail '%s'. Update again in %i seconds",
|
self._logSys.log(self.loglevel,
|
||||||
self._jail.name, self.updateperiod)
|
"Updated IPs for jail '%s' (-%d/+%d). Update again in %i seconds",
|
||||||
|
self._jail.name, m, p, self.updateperiod)
|
||||||
finally:
|
finally:
|
||||||
self._timer = threading.Timer(self.updateperiod, self.update)
|
self._timer = threading.Timer(self.updateperiod, self.update)
|
||||||
self._timer.start()
|
self._timer.start()
|
||||||
|
|
Loading…
Reference in New Issue