mirror of https://github.com/fail2ban/fail2ban
Merge branch '0.10' into 0.11
commit
3eaefe8da0
|
@ -84,8 +84,15 @@ srv_cfg_path = /etc/nginx/
|
||||||
#srv_cmd = nginx -c %(srv_cfg_path)s/nginx.conf
|
#srv_cmd = nginx -c %(srv_cfg_path)s/nginx.conf
|
||||||
srv_cmd = nginx
|
srv_cmd = nginx
|
||||||
|
|
||||||
# first test configuration is correct, hereafter send reload signal:
|
# pid file (used to check nginx is running):
|
||||||
blck_lst_reload = %(srv_cmd)s -qt; if [ $? -eq 0 ]; then
|
srv_pid = /run/nginx.pid
|
||||||
|
|
||||||
|
# command used to check whether nginx is running and configuration is valid:
|
||||||
|
srv_is_running = [ -f "%(srv_pid)s" ]
|
||||||
|
srv_check_cmd = %(srv_is_running)s && %(srv_cmd)s -qt
|
||||||
|
|
||||||
|
# first test nginx is running and configuration is correct, hereafter send reload signal:
|
||||||
|
blck_lst_reload = %(srv_check_cmd)s; if [ $? -eq 0 ]; then
|
||||||
%(srv_cmd)s -s reload; if [ $? -ne 0 ]; then echo 'reload failed.'; fi;
|
%(srv_cmd)s -s reload; if [ $? -ne 0 ]; then echo 'reload failed.'; fi;
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
|
|
@ -6,24 +6,35 @@
|
||||||
#
|
#
|
||||||
import sys
|
import sys
|
||||||
from fail2ban.server.ipdns import DNSUtils, IPAddr
|
from fail2ban.server.ipdns import DNSUtils, IPAddr
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
def process_args(argv):
|
def process_args(argv):
|
||||||
if len(argv) != 2:
|
if len(argv) - 1 not in (1, 2):
|
||||||
raise ValueError("Please provide a single IP as an argument. Got: %s\n"
|
raise ValueError("Usage %s ip ?timeout?. Got: %s\n"
|
||||||
% (argv[1:]))
|
% (argv[0], argv[1:]))
|
||||||
ip = argv[1]
|
ip = argv[1]
|
||||||
|
|
||||||
if not IPAddr(ip).isValid:
|
if not IPAddr(ip).isValid:
|
||||||
raise ValueError("Argument must be a single valid IP. Got: %s\n"
|
raise ValueError("Argument must be a single valid IP. Got: %s\n"
|
||||||
% ip)
|
% ip)
|
||||||
return ip
|
return argv[1:]
|
||||||
|
|
||||||
google_ips = None
|
google_ips = None
|
||||||
|
|
||||||
def is_googlebot(ip):
|
def is_googlebot(ip, timeout=55):
|
||||||
import re
|
import re
|
||||||
|
|
||||||
host = DNSUtils.ipToName(ip)
|
timeout = float(timeout or 0)
|
||||||
|
if timeout:
|
||||||
|
def ipToNameTO(host, ip, timeout):
|
||||||
|
host[0] = DNSUtils.ipToName(ip)
|
||||||
|
host = [None]
|
||||||
|
th = Thread(target=ipToNameTO, args=(host, ip, timeout)); th.daemon=True; th.start()
|
||||||
|
th.join(timeout)
|
||||||
|
host = host[0]
|
||||||
|
else:
|
||||||
|
host = DNSUtils.ipToName(ip)
|
||||||
|
|
||||||
if not host or not re.match(r'.*\.google(bot)?\.com$', host):
|
if not host or not re.match(r'.*\.google(bot)?\.com$', host):
|
||||||
return False
|
return False
|
||||||
host_ips = DNSUtils.dnsToIp(host)
|
host_ips = DNSUtils.dnsToIp(host)
|
||||||
|
@ -31,7 +42,7 @@ def is_googlebot(ip):
|
||||||
|
|
||||||
if __name__ == '__main__': # pragma: no cover
|
if __name__ == '__main__': # pragma: no cover
|
||||||
try:
|
try:
|
||||||
ret = is_googlebot(process_args(sys.argv))
|
ret = is_googlebot(*process_args(sys.argv))
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
sys.stderr.write(str(e))
|
sys.stderr.write(str(e))
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
|
@ -192,7 +192,7 @@ class Fail2banCmdLine():
|
||||||
cmdOpts = 'hc:s:p:xfbdtviqV'
|
cmdOpts = 'hc:s:p:xfbdtviqV'
|
||||||
cmdLongOpts = ['loglevel=', 'logtarget=', 'syslogsocket=', 'test', 'async',
|
cmdLongOpts = ['loglevel=', 'logtarget=', 'syslogsocket=', 'test', 'async',
|
||||||
'conf=', 'pidfile=', 'pname=', 'socket=',
|
'conf=', 'pidfile=', 'pname=', 'socket=',
|
||||||
'timeout=', 'str2sec=', 'help', 'version', 'dp', '--dump-pretty']
|
'timeout=', 'str2sec=', 'help', 'version', 'dp', 'dump-pretty']
|
||||||
optList, self._args = getopt.getopt(self._argv[1:], cmdOpts, cmdLongOpts)
|
optList, self._args = getopt.getopt(self._argv[1:], cmdOpts, cmdLongOpts)
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
self.dispUsage()
|
self.dispUsage()
|
||||||
|
|
|
@ -1326,7 +1326,7 @@ class Fail2banServerTest(Fail2banClientServerBase):
|
||||||
'backend = polling',
|
'backend = polling',
|
||||||
'usedns = no',
|
'usedns = no',
|
||||||
'logpath = %(tmp)s/blck-failures.log',
|
'logpath = %(tmp)s/blck-failures.log',
|
||||||
'action = nginx-block-map[blck_lst_reload="", blck_lst_file="%(tmp)s/blck-lst.map"]',
|
'action = nginx-block-map[srv_cmd="echo nginx", srv_pid="%(tmp)s/f2b.pid", blck_lst_file="%(tmp)s/blck-lst.map"]',
|
||||||
' blocklist_de[actionban=\'curl() { echo "*** curl" "$*";}; <Definition/actionban>\', email="Fail2Ban <fail2ban@localhost>", '
|
' blocklist_de[actionban=\'curl() { echo "*** curl" "$*";}; <Definition/actionban>\', email="Fail2Ban <fail2ban@localhost>", '
|
||||||
'apikey="TEST-API-KEY", agent="fail2ban-test-agent", service=<name>]',
|
'apikey="TEST-API-KEY", agent="fail2ban-test-agent", service=<name>]',
|
||||||
'filter =',
|
'filter =',
|
||||||
|
@ -1366,6 +1366,8 @@ class Fail2banServerTest(Fail2banClientServerBase):
|
||||||
self.assertIn('\\125-000-004 1;\n', mp)
|
self.assertIn('\\125-000-004 1;\n', mp)
|
||||||
self.assertIn('\\125-000-005 1;\n', mp)
|
self.assertIn('\\125-000-005 1;\n', mp)
|
||||||
|
|
||||||
|
# check nginx reload is logged (pid of fail2ban is used to simulate success check nginx is running):
|
||||||
|
self.assertLogged("stdout: 'nginx -qt'", "stdout: 'nginx -s reload'", all=True)
|
||||||
# check blocklist_de substitution (e. g. new-line after <matches>):
|
# check blocklist_de substitution (e. g. new-line after <matches>):
|
||||||
self.assertLogged(
|
self.assertLogged(
|
||||||
"stdout: '*** curl --fail --data-urlencode server=Fail2Ban <fail2ban@localhost>"
|
"stdout: '*** curl --fail --data-urlencode server=Fail2Ban <fail2ban@localhost>"
|
||||||
|
|
|
@ -606,13 +606,14 @@ class IgnoreIPDNS(LogCaptureTestCase):
|
||||||
cmd = os.path.join(STOCK_CONF_DIR, "filter.d/ignorecommands/apache-fakegooglebot")
|
cmd = os.path.join(STOCK_CONF_DIR, "filter.d/ignorecommands/apache-fakegooglebot")
|
||||||
## below test direct as python module:
|
## below test direct as python module:
|
||||||
mod = Utils.load_python_module(cmd)
|
mod = Utils.load_python_module(cmd)
|
||||||
self.assertFalse(mod.is_googlebot(mod.process_args([cmd, "128.178.222.69"])))
|
self.assertFalse(mod.is_googlebot(*mod.process_args([cmd, "128.178.222.69"])))
|
||||||
self.assertFalse(mod.is_googlebot(mod.process_args([cmd, "192.0.2.1"])))
|
self.assertFalse(mod.is_googlebot(*mod.process_args([cmd, "192.0.2.1"])))
|
||||||
|
self.assertFalse(mod.is_googlebot(*mod.process_args([cmd, "192.0.2.1", 0.1])))
|
||||||
bot_ips = ['66.249.66.1']
|
bot_ips = ['66.249.66.1']
|
||||||
for ip in bot_ips:
|
for ip in bot_ips:
|
||||||
self.assertTrue(mod.is_googlebot(mod.process_args([cmd, str(ip)])), "test of googlebot ip %s failed" % ip)
|
self.assertTrue(mod.is_googlebot(*mod.process_args([cmd, str(ip)])), "test of googlebot ip %s failed" % ip)
|
||||||
self.assertRaises(ValueError, lambda: mod.is_googlebot(mod.process_args([cmd])))
|
self.assertRaises(ValueError, lambda: mod.is_googlebot(*mod.process_args([cmd])))
|
||||||
self.assertRaises(ValueError, lambda: mod.is_googlebot(mod.process_args([cmd, "192.0"])))
|
self.assertRaises(ValueError, lambda: mod.is_googlebot(*mod.process_args([cmd, "192.0"])))
|
||||||
## via command:
|
## via command:
|
||||||
self.filter.ignoreCommand = cmd + " <ip>"
|
self.filter.ignoreCommand = cmd + " <ip>"
|
||||||
for ip in bot_ips:
|
for ip in bot_ips:
|
||||||
|
@ -624,7 +625,7 @@ class IgnoreIPDNS(LogCaptureTestCase):
|
||||||
self.pruneLog()
|
self.pruneLog()
|
||||||
self.filter.ignoreCommand = cmd + " bad arguments <ip>"
|
self.filter.ignoreCommand = cmd + " bad arguments <ip>"
|
||||||
self.assertFalse(self.filter.inIgnoreIPList("192.0"))
|
self.assertFalse(self.filter.inIgnoreIPList("192.0"))
|
||||||
self.assertLogged('Please provide a single IP as an argument.')
|
self.assertLogged('Usage')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue