mirror of https://github.com/fail2ban/fail2ban
Merge pull request #522 from yarikoptic/master
TST/BF: basic changes to beef up coverage a tiny bit + restore compatibility with python2.4 (since we still claim to support it)pull/532/head
commit
33df269d82
|
@ -24,6 +24,7 @@ __author__ = "Cyril Jaquier"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
from configreader import ConfigReader
|
from configreader import ConfigReader
|
||||||
|
|
||||||
|
@ -34,11 +35,14 @@ class FilterReader(ConfigReader):
|
||||||
|
|
||||||
def __init__(self, fileName, name, **kwargs):
|
def __init__(self, fileName, name, **kwargs):
|
||||||
ConfigReader.__init__(self, **kwargs)
|
ConfigReader.__init__(self, **kwargs)
|
||||||
self.__file = fileName
|
# Defer initialization to the set Methods
|
||||||
self.__name = name
|
self.__file = self.__name = self.__opts = None
|
||||||
|
self.setFile(fileName)
|
||||||
|
self.setName(name)
|
||||||
|
|
||||||
def setFile(self, fileName):
|
def setFile(self, fileName):
|
||||||
self.__file = fileName
|
self.__file = fileName
|
||||||
|
self.__opts = None
|
||||||
|
|
||||||
def getFile(self):
|
def getFile(self):
|
||||||
return self.__file
|
return self.__file
|
||||||
|
@ -50,7 +54,7 @@ class FilterReader(ConfigReader):
|
||||||
return self.__name
|
return self.__name
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
return ConfigReader.read(self, "filter.d/" + self.__file)
|
return ConfigReader.read(self, os.path.join("filter.d", self.__file))
|
||||||
|
|
||||||
def getOptions(self, pOpts):
|
def getOptions(self, pOpts):
|
||||||
opts = [["string", "ignoreregex", ""],
|
opts = [["string", "ignoreregex", ""],
|
||||||
|
|
|
@ -153,6 +153,7 @@ else: # pragma: no cover
|
||||||
#tests.addTest(unittest.makeSuite(servertestcase.StartStop))
|
#tests.addTest(unittest.makeSuite(servertestcase.StartStop))
|
||||||
tests.addTest(unittest.makeSuite(servertestcase.Transmitter))
|
tests.addTest(unittest.makeSuite(servertestcase.Transmitter))
|
||||||
tests.addTest(unittest.makeSuite(servertestcase.JailTests))
|
tests.addTest(unittest.makeSuite(servertestcase.JailTests))
|
||||||
|
tests.addTest(unittest.makeSuite(servertestcase.RegexTests))
|
||||||
tests.addTest(unittest.makeSuite(actiontestcase.ExecuteAction))
|
tests.addTest(unittest.makeSuite(actiontestcase.ExecuteAction))
|
||||||
tests.addTest(unittest.makeSuite(actionstestcase.ExecuteActions))
|
tests.addTest(unittest.makeSuite(actionstestcase.ExecuteActions))
|
||||||
# FailManager
|
# FailManager
|
||||||
|
|
|
@ -21,7 +21,7 @@ __author__ = "Cyril Jaquier and Fail2Ban Contributors"
|
||||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
import time, logging
|
import sys, time, logging
|
||||||
|
|
||||||
from datetemplate import DateStrptime, DateTai64n, DateEpoch, DateISO8601
|
from datetemplate import DateStrptime, DateTai64n, DateEpoch, DateISO8601
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
@ -46,6 +46,7 @@ class DateDetector:
|
||||||
def addDefaultTemplate(self):
|
def addDefaultTemplate(self):
|
||||||
self.__lock.acquire()
|
self.__lock.acquire()
|
||||||
try:
|
try:
|
||||||
|
if sys.version_info >= (2, 5): # because of '%.f'
|
||||||
# asctime with subsecond
|
# asctime with subsecond
|
||||||
template = DateStrptime()
|
template = DateStrptime()
|
||||||
template.setName("WEEKDAY MONTH Day Hour:Minute:Second[.subsecond] Year")
|
template.setName("WEEKDAY MONTH Day Hour:Minute:Second[.subsecond] Year")
|
||||||
|
@ -101,6 +102,7 @@ class DateDetector:
|
||||||
template.setRegex("\d{2}/\d{2}/\d{4}:\d{2}:\d{2}:\d{2}")
|
template.setRegex("\d{2}/\d{2}/\d{4}:\d{2}:\d{2}:\d{2}")
|
||||||
template.setPattern("%m/%d/%Y:%H:%M:%S")
|
template.setPattern("%m/%d/%Y:%H:%M:%S")
|
||||||
self._appendTemplate(template)
|
self._appendTemplate(template)
|
||||||
|
if sys.version_info >= (2, 5): # because of '%.f'
|
||||||
# proftpd 2013-11-16 21:43:03,296
|
# proftpd 2013-11-16 21:43:03,296
|
||||||
# So like Exim below but with ,subsecond
|
# So like Exim below but with ,subsecond
|
||||||
template = DateStrptime()
|
template = DateStrptime()
|
||||||
|
|
|
@ -60,6 +60,8 @@ def testSampleRegexsFactory(name):
|
||||||
|
|
||||||
# Check filter exists
|
# Check filter exists
|
||||||
filterConf = FilterReader(name, "jail", basedir=CONFIG_DIR)
|
filterConf = FilterReader(name, "jail", basedir=CONFIG_DIR)
|
||||||
|
self.assertEqual(filterConf.getFile(), name)
|
||||||
|
self.assertEqual(filterConf.getName(), "jail")
|
||||||
filterConf.read()
|
filterConf.read()
|
||||||
filterConf.getOptions({})
|
filterConf.getOptions({})
|
||||||
|
|
||||||
|
@ -69,10 +71,6 @@ def testSampleRegexsFactory(name):
|
||||||
elif opt[2] == "addignoreregex":
|
elif opt[2] == "addignoreregex":
|
||||||
self.filter.addIgnoreRegex(opt[3])
|
self.filter.addIgnoreRegex(opt[3])
|
||||||
|
|
||||||
if not self.filter.getFailRegex():
|
|
||||||
# No fail regexs set: likely just common file for includes.
|
|
||||||
return
|
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
os.path.isfile(os.path.join(TEST_FILES_DIR, "logs", name)),
|
os.path.isfile(os.path.join(TEST_FILES_DIR, "logs", name)),
|
||||||
"No sample log file available for '%s' filter" % name)
|
"No sample log file available for '%s' filter" % name)
|
||||||
|
|
|
@ -25,6 +25,7 @@ __copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||||
__license__ = "GPL"
|
__license__ = "GPL"
|
||||||
|
|
||||||
import unittest, socket, time, tempfile, os, sys
|
import unittest, socket, time, tempfile, os, sys
|
||||||
|
from server.failregex import Regex, FailRegex, RegexException
|
||||||
from server.server import Server, logSys
|
from server.server import Server, logSys
|
||||||
from server.jail import Jail
|
from server.jail import Jail
|
||||||
from common.exceptions import UnknownJailException
|
from common.exceptions import UnknownJailException
|
||||||
|
@ -539,13 +540,19 @@ class TransmitterLogging(TransmitterBase):
|
||||||
logSys.warn("After file moved")
|
logSys.warn("After file moved")
|
||||||
self.assertEqual(self.transm.proceed(["flushlogs"]), (0, "rolled over"))
|
self.assertEqual(self.transm.proceed(["flushlogs"]), (0, "rolled over"))
|
||||||
logSys.warn("After flushlogs")
|
logSys.warn("After flushlogs")
|
||||||
with open(fn2,'r') as f:
|
# >py2.4: with open(fn2, 'r') as f:
|
||||||
|
f = open(fn2, 'r');
|
||||||
|
if True:
|
||||||
self.assertTrue(f.next().endswith("Before file moved\n"))
|
self.assertTrue(f.next().endswith("Before file moved\n"))
|
||||||
self.assertTrue(f.next().endswith("After file moved\n"))
|
self.assertTrue(f.next().endswith("After file moved\n"))
|
||||||
self.assertRaises(StopIteration, f.next)
|
self.assertRaises(StopIteration, f.next)
|
||||||
with open(fn,'r') as f:
|
f.close()
|
||||||
|
# >py2.4: with open(fn, 'r') as f:
|
||||||
|
f = open(fn, 'r');
|
||||||
|
if True:
|
||||||
self.assertTrue(f.next().endswith("After flushlogs\n"))
|
self.assertTrue(f.next().endswith("After flushlogs\n"))
|
||||||
self.assertRaises(StopIteration, f.next)
|
self.assertRaises(StopIteration, f.next)
|
||||||
|
f.close()
|
||||||
finally:
|
finally:
|
||||||
os.remove(fn2)
|
os.remove(fn2)
|
||||||
finally:
|
finally:
|
||||||
|
@ -561,3 +568,30 @@ class JailTests(unittest.TestCase):
|
||||||
longname = "veryveryverylongname"
|
longname = "veryveryverylongname"
|
||||||
jail = Jail(longname)
|
jail = Jail(longname)
|
||||||
self.assertEqual(jail.getName(), longname)
|
self.assertEqual(jail.getName(), longname)
|
||||||
|
|
||||||
|
class RegexTests(unittest.TestCase):
|
||||||
|
|
||||||
|
def testInit(self):
|
||||||
|
# Should raise an Exception upon empty regex
|
||||||
|
self.assertRaises(RegexException, Regex, '')
|
||||||
|
self.assertRaises(RegexException, Regex, ' ')
|
||||||
|
self.assertRaises(RegexException, Regex, '\t')
|
||||||
|
|
||||||
|
def testStr(self):
|
||||||
|
# .replace just to guarantee uniform use of ' or " in the %r
|
||||||
|
self.assertEqual(str(Regex('a')).replace('"', "'"), "Regex('a')")
|
||||||
|
# Class name should be proper
|
||||||
|
self.assertTrue(str(FailRegex('<HOST>')).startswith("FailRegex("))
|
||||||
|
|
||||||
|
def testHost(self):
|
||||||
|
self.assertRaises(RegexException, FailRegex, '')
|
||||||
|
# Testing obscure case when host group might be missing in the matched pattern,
|
||||||
|
# e.g. if we made it optional.
|
||||||
|
fr = FailRegex('%%<HOST>?')
|
||||||
|
self.assertFalse(fr.hasMatched())
|
||||||
|
fr.search("%%")
|
||||||
|
self.assertTrue(fr.hasMatched())
|
||||||
|
self.assertRaises(RegexException, fr.getHost)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue