mirror of https://github.com/fail2ban/fail2ban
Merge branch '0.10' into 0.11
commit
966fa1be89
|
@ -27,9 +27,15 @@ import os
|
||||||
import signal
|
import signal
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
from threading import Lock
|
||||||
import time
|
import time
|
||||||
from ..helpers import getLogger, _merge_dicts, uni_decode
|
from ..helpers import getLogger, _merge_dicts, uni_decode
|
||||||
|
|
||||||
|
try:
|
||||||
|
from collections import OrderedDict
|
||||||
|
except ImportError: # pragma: 3.x no cover
|
||||||
|
OrderedDict = dict
|
||||||
|
|
||||||
if sys.version_info >= (3, 3):
|
if sys.version_info >= (3, 3):
|
||||||
import importlib.machinery
|
import importlib.machinery
|
||||||
else:
|
else:
|
||||||
|
@ -69,7 +75,8 @@ class Utils():
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.setOptions(*args, **kwargs)
|
self.setOptions(*args, **kwargs)
|
||||||
self._cache = {}
|
self._cache = OrderedDict()
|
||||||
|
self.__lock = Lock()
|
||||||
|
|
||||||
def setOptions(self, maxCount=1000, maxTime=60):
|
def setOptions(self, maxCount=1000, maxTime=60):
|
||||||
self.maxCount = maxCount
|
self.maxCount = maxCount
|
||||||
|
@ -83,7 +90,7 @@ class Utils():
|
||||||
if v:
|
if v:
|
||||||
if v[1] > time.time():
|
if v[1] > time.time():
|
||||||
return v[0]
|
return v[0]
|
||||||
del self._cache[k]
|
self.unset(k)
|
||||||
return defv
|
return defv
|
||||||
|
|
||||||
def set(self, k, v):
|
def set(self, k, v):
|
||||||
|
@ -91,12 +98,21 @@ class Utils():
|
||||||
cache = self._cache # for shorter local access
|
cache = self._cache # for shorter local access
|
||||||
# clean cache if max count reached:
|
# clean cache if max count reached:
|
||||||
if len(cache) >= self.maxCount:
|
if len(cache) >= self.maxCount:
|
||||||
for (ck, cv) in cache.items():
|
# avoid multiple modification of list multi-threaded:
|
||||||
if cv[1] < t:
|
with self.__lock:
|
||||||
del cache[ck]
|
if len(cache) >= self.maxCount:
|
||||||
# if still max count - remove any one:
|
for (ck, cv) in cache.items():
|
||||||
if len(cache) >= self.maxCount:
|
# if expired:
|
||||||
cache.popitem()
|
if cv[1] <= t:
|
||||||
|
self.unset(ck)
|
||||||
|
elif OrderedDict is not dict:
|
||||||
|
break
|
||||||
|
# if still max count - remove any one:
|
||||||
|
if len(cache) >= self.maxCount:
|
||||||
|
if OrderedDict is not dict: # first (older):
|
||||||
|
cache.popitem(False)
|
||||||
|
else:
|
||||||
|
cache.popitem()
|
||||||
cache[k] = (v, t + self.maxTime)
|
cache[k] = (v, t + self.maxTime)
|
||||||
|
|
||||||
def unset(self, k):
|
def unset(self, k):
|
||||||
|
|
|
@ -64,7 +64,7 @@ class TestServer(Server):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TransmitterBase(unittest.TestCase):
|
class TransmitterBase(LogCaptureTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Call before every test case."""
|
"""Call before every test case."""
|
||||||
|
@ -332,11 +332,11 @@ class Transmitter(TransmitterBase):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.transm.proceed(["set", self.jailName, "banip", "127.0.0.1"]),
|
self.transm.proceed(["set", self.jailName, "banip", "127.0.0.1"]),
|
||||||
(0, "127.0.0.1"))
|
(0, "127.0.0.1"))
|
||||||
time.sleep(Utils.DEFAULT_SLEEP_TIME) # Give chance to ban
|
self.assertLogged("Ban 127.0.0.1", wait=True) # Give chance to ban
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.transm.proceed(["set", self.jailName, "banip", "Badger"]),
|
self.transm.proceed(["set", self.jailName, "banip", "Badger"]),
|
||||||
(0, "Badger")) #NOTE: Is IP address validated? Is DNS Lookup done?
|
(0, "Badger")) #NOTE: Is IP address validated? Is DNS Lookup done?
|
||||||
time.sleep(Utils.DEFAULT_SLEEP_TIME) # Give chance to ban
|
self.assertLogged("Ban Badger", wait=True) # Give chance to ban
|
||||||
# Unban IP
|
# Unban IP
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.transm.proceed(
|
self.transm.proceed(
|
||||||
|
|
Loading…
Reference in New Issue