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
Daniel Black 2013-12-26 23:46:43 -08:00
commit 33df269d82
5 changed files with 63 additions and 24 deletions

View File

@ -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", ""],

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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)