From 0b0ea41f8773bf15e5a3eb9bb37778ee66255149 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 24 Oct 2014 04:59:44 +0200 Subject: [PATCH 1/4] fix: fail2ban-regex with filter file failed (after merging #824, because test case missing); test case for 'readexplicit' added; --- fail2ban/client/configreader.py | 4 +++- fail2ban/tests/clientreadertestcase.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/fail2ban/client/configreader.py b/fail2ban/client/configreader.py index 82bf0fdc..d9bfb271 100644 --- a/fail2ban/client/configreader.py +++ b/fail2ban/client/configreader.py @@ -267,7 +267,9 @@ class DefinitionInitConfigReader(ConfigReader): # needed for fail2ban-regex that doesn't need fancy directories def readexplicit(self): - return SafeConfigParserWithIncludes.read(self, self._file) + if not self._cfg: + self.touch(self._file) + return SafeConfigParserWithIncludes.read(self._cfg, self._file) def getOptions(self, pOpts): self._opts = ConfigReader.getOptions( diff --git a/fail2ban/tests/clientreadertestcase.py b/fail2ban/tests/clientreadertestcase.py index e4dc2189..fde9a915 100644 --- a/fail2ban/tests/clientreadertestcase.py +++ b/fail2ban/tests/clientreadertestcase.py @@ -334,6 +334,22 @@ class FilterReaderTest(unittest.TestCase): filterReader.getOptions(None) self.assertRaises(ValueError, FilterReader.convert, filterReader) + def testFilterReaderExplicit(self): + # read explicit uses absolute path: + path_ = os.path.abspath(os.path.join(TEST_FILES_DIR, "filter.d")) + filterReader = FilterReader(os.path.join(path_, "testcase01.conf"), "testcase01", {}) + self.assertEqual(filterReader.readexplicit(), + [os.path.join(path_, "testcase-common.conf"), os.path.join(path_, "testcase01.conf")] + ) + try: + filterReader.getOptions(None) + # from included common + filterReader.get('Definition', '__prefix_line') + # from testcase01 + filterReader.get('Definition', 'failregex') + filterReader.get('Definition', 'ignoreregex') + except Exception, e: + self.fail('unexpected options after readexplicit: %s' % (e)) class JailsReaderTestCache(LogCaptureTestCase): From bef0502e6b04b4221245b1f4a2408fd075d11eb6 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 24 Oct 2014 05:28:35 +0200 Subject: [PATCH 2/4] coverage: no cover (for failed except) --- fail2ban/tests/clientreadertestcase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fail2ban/tests/clientreadertestcase.py b/fail2ban/tests/clientreadertestcase.py index fde9a915..17a90cc8 100644 --- a/fail2ban/tests/clientreadertestcase.py +++ b/fail2ban/tests/clientreadertestcase.py @@ -348,7 +348,7 @@ class FilterReaderTest(unittest.TestCase): # from testcase01 filterReader.get('Definition', 'failregex') filterReader.get('Definition', 'ignoreregex') - except Exception, e: + except Exception, e: # pragma: no cover - failed if reachable self.fail('unexpected options after readexplicit: %s' % (e)) class JailsReaderTestCache(LogCaptureTestCase): From 07d4badfd069bb79d8d3a4562cc8de943c185c7b Mon Sep 17 00:00:00 2001 From: sebres Date: Tue, 10 Jun 2014 13:45:29 +0200 Subject: [PATCH 3/4] testExecuteTimeout fixed: give a test still 1 second, because system could be too busy --- fail2ban/tests/actiontestcase.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fail2ban/tests/actiontestcase.py b/fail2ban/tests/actiontestcase.py index f1ea77ce..5a58149f 100644 --- a/fail2ban/tests/actiontestcase.py +++ b/fail2ban/tests/actiontestcase.py @@ -186,8 +186,10 @@ class CommandActionTest(LogCaptureTestCase): # Should take a minute self.assertRaises( RuntimeError, CommandAction.executeCmd, 'sleep 60', timeout=2) - self.assertAlmostEqual(time.time() - stime, 2, places=0) - self.assertTrue(self._is_logged('sleep 60 -- timed out after 2 seconds')) + # give a test still 1 second, because system could be too busy + self.assertTrue(time.time() >= stime + 2 and time.time() <= stime + 3) + self.assertTrue(self._is_logged('sleep 60 -- timed out after 2 seconds') + or self._is_logged('sleep 60 -- timed out after 3 seconds')) self.assertTrue(self._is_logged('sleep 60 -- killed with SIGTERM')) def testCaptureStdOutErr(self): From 3dac76559853b25ce308488dd1eba6eb5d2ab6b9 Mon Sep 17 00:00:00 2001 From: sebres Date: Sat, 25 Oct 2014 17:20:01 +0200 Subject: [PATCH 4/4] ConfigReader.touch renamed into protected _create_unshared --- fail2ban/client/configreader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fail2ban/client/configreader.py b/fail2ban/client/configreader.py index d9bfb271..b6c39628 100644 --- a/fail2ban/client/configreader.py +++ b/fail2ban/client/configreader.py @@ -77,7 +77,7 @@ class ConfigReader(): """ # already shared ? if not self._cfg: - self.touch(name) + self._create_unshared(name) # performance feature - read once if using shared config reader: if once and self._cfg.read_cfg_files is not None: return self._cfg.read_cfg_files @@ -90,7 +90,7 @@ class ConfigReader(): self._cfg.read_cfg_files = ret return ret - def touch(self, name=''): + def _create_unshared(self, name=''): """ Allocates and share a config file by it name. Automatically allocates unshared or reuses shared handle by given 'name' and @@ -268,7 +268,7 @@ class DefinitionInitConfigReader(ConfigReader): # needed for fail2ban-regex that doesn't need fancy directories def readexplicit(self): if not self._cfg: - self.touch(self._file) + self._create_unshared(self._file) return SafeConfigParserWithIncludes.read(self._cfg, self._file) def getOptions(self, pOpts):