class ExecuteAction(LogCaptureTestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") LogCaptureTestCase.setUp(self) def tearDown(self): """Call after every test case.""" LogCaptureTestCase.tearDown(self) self.__action.execActionStop() def testNameChange(self): self.assertEqual(self.__action.getName(), "Test") self.__action.setName("Tricky Test") self.assertEqual(self.__action.getName(), "Tricky Test") def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<A>' })) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<C>', 'C': '<A>' })) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <D> <X>', 'X': 'fun' }), { 'A': '<C> <D> fun', 'X': 'fun' }) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <B>', 'B': 'cool' }), { 'A': '<C> cool', 'B': 'cool' }) # Multiple stuff on same line is ok self.assertEqual( Action.substituteRecursiveTags({ 'failregex': 'to=<honeypot> fromip=<IP> evilperson=<honeypot>', 'honeypot': 'pokie', 'ignoreregex': '' }), { 'failregex': "to=pokie fromip=<IP> evilperson=pokie", 'honeypot': 'pokie', 'ignoreregex': '', }) # rest is just cool self.assertEqual( Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', }) def testReplaceTag(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123", 'xyz': "890", } self.assertEqual(self.__action.replaceTag("Text<br>text", aInfo), "Text\ntext") self.assertEqual(self.__action.replaceTag("Text <HOST> text", aInfo), "Text 192.0.2.0 text") self.assertEqual( self.__action.replaceTag("Text <xyz> text <ABC> ABC", aInfo), "Text 890 text 123 ABC") self.assertEqual( self.__action.replaceTag( "<matches>", {'matches': "some >char< should \< be[ escap}ed&"}), r"some \>char\< should \\\< be\[ escap\}ed\&") def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStart(), "touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStop(), 'rm -f /tmp/fail2ban.test') self.__action.setActionBan("echo -n") self.assertEqual(self.__action.getActionBan(), 'echo -n') self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertEqual(self.__action.getActionCheck(), '[ -e /tmp/fail2ban.test ]') self.__action.setActionUnban("true") self.assertEqual(self.__action.getActionUnban(), 'true') self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteActionEmptyUnban(self): self.__action.setActionUnban("") self.assertTrue(self.__action.execActionUnban(None)) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteActionStartCtags(self): self.__action.setCInfo("HOST", "192.0.2.0") self.__action.setActionStart("touch /tmp/fail2ban.test.<HOST>") self.__action.setActionStop("rm -f /tmp/fail2ban.test.<HOST>") self.__action.setActionCheck("[ -e /tmp/fail2ban.test.192.0.2.0 ]") self.assertTrue(self.__action.execActionStart()) def testExecuteActionCheckRestoreEnvironment(self): self.__action.setActionStart("") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("rm /tmp/fail2ban.test") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Unable to restore environment')) def testExecuteActionChangeCtags(self): self.__action.setCInfo("ROST", "192.0.2.0") self.assertEqual(self.__action.getCInfo("ROST"), "192.0.2.0") self.__action.delCInfo("ROST") self.assertRaises(KeyError, self.__action.getCInfo, "ROST") def testExecuteActionUnbanAinfo(self): aInfo = { 'ABC': "123", } self.__action.setActionBan("touch /tmp/fail2ban.test.123") self.__action.setActionUnban("rm /tmp/fail2ban.test.<ABC>") self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self.__action.execActionUnban(aInfo)) def testExecuteActionStartEmpty(self): self.__action.setActionStart("") self.assertTrue(self.__action.execActionStart()) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
def test_reverse(self): action = Action() action.SMALL_DELAY = 0 init_str = 'abc' expected_str = 'cba' self.assertEqual(expected_str, action.reverse(init_str)) init_str = 'testStringTestString2TestString3' expected_str = '3gnirtStseT2gnirtStseTgnirtStset' self.assertEqual(expected_str, action.reverse(init_str))
def test_swap(self): action = Action() action.BIG_DELAY = 0 init_str = 'abcd' expected_str = 'badc' self.assertEqual(expected_str, action.swap(init_str)) init_str = 'abcdf' expected_str = 'badcf' self.assertEqual(expected_str, action.swap(init_str))
def test_add_task(self): action = Action() queue.Queue.put = Mock() task_data = dict(cmd='reverse', string='test123') task_id = action.add_task(task_data) self.assertEqual(1, len(action.task)) self.assertEqual('task_1', task_id) action.queue.put.assert_called_once_with(task_data) print(action.task)
def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<C>', 'C': '<A>'})) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <D> <X>','X':'fun'}), {'A': '<C> <D> fun', 'X':'fun'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <B>', 'B': 'cool'}), {'A': '<C> cool', 'B': 'cool'}) # Multiple stuff on same line is ok self.assertEqual(Action.substituteRecursiveTags({'failregex': 'to=<honeypot> fromip=<IP> evilperson=<honeypot>', 'honeypot': 'pokie', 'ignoreregex': ''}), { 'failregex': "to=pokie fromip=<IP> evilperson=pokie", 'honeypot': 'pokie', 'ignoreregex': '', }) # rest is just cool self.assertEqual(Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', })
def test_get_result(self): action = Action() task_id = 'task_1' task = dict(cmd='reverse', string='test123', status=STATUS.queued) action.task[task_id].update(task) self.assertEqual(NOT_FOUND, action.get_result(task_id)) task.update(dict(status=STATUS.progress)) action.task[task_id].update(task) self.assertEqual(NOT_FOUND, action.get_result(task_id)) task.update(dict(status=STATUS.complete, result='321tset')) action.task[task_id].update(task) self.assertEqual('321tset', action.get_result(task_id))
def test_get_status(self): action = Action() task_id = 'task_1' task = dict(cmd='reverse', string='test123', status=STATUS.queued) action.task[task_id].update(task) self.assertEqual(STATUS.queued.value, action.get_status(task_id)) task.update(dict(status=STATUS.progress)) action.task[task_id].update(task) self.assertEqual(STATUS.progress.value, action.get_status(task_id)) task.update(dict(status=STATUS.complete)) action.task[task_id].update(task) self.assertEqual(STATUS.complete.value, action.get_status(task_id))
def setUp(self): """Call before every test case.""" self.__action = Action("Test") # For extended testing of what gets output into logging # system, we will redirect it to a string logSys = logging.getLogger("fail2ban") # Keep old settings self._old_level = logSys.level self._old_handlers = logSys.handlers # Let's log everything into a string self._log = StringIO() logSys.handlers = [logging.StreamHandler(self._log)] logSys.setLevel(getattr(logging, 'DEBUG'))
def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<A>' })) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<C>', 'C': '<A>' })) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <D> <X>', 'X': 'fun' }), { 'A': '<C> <D> fun', 'X': 'fun' }) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <B>', 'B': 'cool' }), { 'A': '<C> cool', 'B': 'cool' }) # Multiple stuff on same line is ok self.assertEqual( Action.substituteRecursiveTags({ 'failregex': 'to=<honeypot> fromip=<IP> evilperson=<honeypot>', 'honeypot': 'pokie', 'ignoreregex': '' }), { 'failregex': "to=pokie fromip=<IP> evilperson=pokie", 'honeypot': 'pokie', 'ignoreregex': '', }) # rest is just cool self.assertEqual( Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', })
def test_get_task_id(self): action = Action() action.task.clear() self.assertEqual('task_1', action.get_task_id()) task_data = dict(cmd='reverse', string='test123') action.add_task(task_data) self.assertEqual('task_2', action.get_task_id()) action.task.clear()
def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<A>' })) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<C>', 'C': '<A>' })) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <D> <X>', 'X': 'fun' }), { 'A': '<C> <D> fun', 'X': 'fun' }) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <B>', 'B': 'cool' }), { 'A': '<C> cool', 'B': 'cool' }) # rest is just cool self.assertEqual( Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', })
def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<C>', 'C': '<A>'})) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <D> <X>','X':'fun'}), {'A': '<C> <D> fun', 'X':'fun'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <B>', 'B': 'cool'}), {'A': '<C> cool', 'B': 'cool'}) # rest is just cool self.assertEqual(Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', })
def test_execute_action(self): action = Action() orig_reverse = Action.reverse orig_swap = Action.swap Action.reverse = Mock() Action.swap = Mock() params = dict(task_id='task_1', cmd='reverse', string='test123') action.execute_action(params) action.reverse.assert_called_once_with(params.get('string')) params = dict(task_id='task_2', cmd='swap', string='test123') action.execute_action(params) action.swap.assert_called_once_with(params.get('string')) Action.reverse = orig_reverse Action.swap = orig_swap
def setUp(self): """Call before every test case.""" self.__action = Action("Test") LogCaptureTestCase.setUp(self)
class ExecuteAction(unittest.TestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") # For extended testing of what gets output into logging # system, we will redirect it to a string logSys = logging.getLogger("fail2ban") # Keep old settings self._old_level = logSys.level self._old_handlers = logSys.handlers # Let's log everything into a string self._log = StringIO() logSys.handlers = [logging.StreamHandler(self._log)] logSys.setLevel(getattr(logging, 'DEBUG')) def tearDown(self): """Call after every test case.""" # print "O: >>%s<<" % self._log.getvalue() logSys = logging.getLogger("fail2ban") logSys.handlers = self._old_handlers logSys.level = self._old_level self.__action.execActionStop() def _is_logged(self, s): return s in self._log.getvalue() def testReplaceTag(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123", 'xyz': "890", } self.assertEqual( self.__action.replaceTag("Text <HOST> text", aInfo), "Text 192.0.2.0 text") self.assertEqual( self.__action.replaceTag("Text <xyz> text <ABC> ABC", aInfo), "Text 890 text 123 ABC") self.assertEqual( self.__action.replaceTag("<matches>", {'matches': "some >char< should \< be[ escap}ed&"}), r"some \>char\< should \\\< be\[ escap\}ed\&") def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("echo -n") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
def setUp(self): """Call before every test case.""" self.__action = Action("Test")
class ExecuteAction(unittest.TestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") def tearDown(self): """Call after every test case.""" self.__action.execActionStop() def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("echo -n") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertTrue(self.__action.execActionBan(None))
class ExecuteAction(unittest.TestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") # For extended testing of what gets output into logging # system, we will redirect it to a string logSys = logging.getLogger("fail2ban") # Keep old settings self._old_level = logSys.level self._old_handlers = logSys.handlers # Let's log everything into a string self._log = StringIO() logSys.handlers = [logging.StreamHandler(self._log)] logSys.setLevel(getattr(logging, 'DEBUG')) def tearDown(self): """Call after every test case.""" # print "O: >>%s<<" % self._log.getvalue() logSys = logging.getLogger("fail2ban") logSys.handlers = self._old_handlers logSys.level = self._old_level self.__action.execActionStop() def _is_logged(self, s): return s in self._log.getvalue() def testNameChange(self): self.assertEqual(self.__action.getName(), "Test") self.__action.setName("Tricky Test") self.assertEqual(self.__action.getName(), "Tricky Test") def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<C>', 'C': '<A>'})) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <D> <X>','X':'fun'}), {'A': '<C> <D> fun', 'X':'fun'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <B>', 'B': 'cool'}), {'A': '<C> cool', 'B': 'cool'}) # rest is just cool self.assertEqual(Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', }) def testReplaceTag(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123", 'xyz': "890", } self.assertEqual( self.__action.replaceTag("Text<br>text", aInfo), "Text\ntext") self.assertEqual( self.__action.replaceTag("Text <HOST> text", aInfo), "Text 192.0.2.0 text") self.assertEqual( self.__action.replaceTag("Text <xyz> text <ABC> ABC", aInfo), "Text 890 text 123 ABC") self.assertEqual( self.__action.replaceTag("<matches>", {'matches': "some >char< should \< be[ escap}ed&"}), r"some \>char\< should \\\< be\[ escap\}ed\&") def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStart(), "touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStop(), 'rm -f /tmp/fail2ban.test') self.__action.setActionBan("echo -n") self.assertEqual(self.__action.getActionBan(), 'echo -n') self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertEqual(self.__action.getActionCheck(), '[ -e /tmp/fail2ban.test ]') self.__action.setActionUnban("true") self.assertEqual(self.__action.getActionUnban(), 'true') self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteActionEmptyUnban(self): self.__action.setActionUnban("") self.assertTrue(self.__action.execActionUnban(None)) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteActionStartCtags(self): self.__action.setCInfo("HOST","192.0.2.0") self.__action.setActionStart("touch /tmp/fail2ban.test.<HOST>") self.__action.setActionStop("rm -f /tmp/fail2ban.test.<HOST>") self.__action.setActionCheck("[ -e /tmp/fail2ban.test.192.0.2.0 ]") self.assertTrue(self.__action.execActionStart()) def testExecuteActionCheckRestoreEnvironment(self): self.__action.setActionStart("") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("rm /tmp/fail2ban.test") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Unable to restore environment')) def testExecuteActionChangeCtags(self): self.__action.setCInfo("ROST","192.0.2.0") self.assertEqual(self.__action.getCInfo("ROST"),"192.0.2.0") self.__action.delCInfo("ROST") self.assertRaises(KeyError, self.__action.getCInfo, "ROST") def testExecuteActionUnbanAinfo(self): aInfo = { 'ABC': "123", } self.__action.setActionBan("touch /tmp/fail2ban.test.123") self.__action.setActionUnban("rm /tmp/fail2ban.test.<ABC>") self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self.__action.execActionUnban(aInfo)) def testExecuteActionStartEmpty(self): self.__action.setActionStart("") self.assertTrue(self.__action.execActionStart()) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
class ExecuteAction(unittest.TestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") # For extended testing of what gets output into logging # system, we will redirect it to a string logSys = logging.getLogger("fail2ban") # Keep old settings self._old_level = logSys.level self._old_handlers = logSys.handlers # Let's log everything into a string self._log = StringIO() logSys.handlers = [logging.StreamHandler(self._log)] logSys.setLevel(getattr(logging, 'DEBUG')) def tearDown(self): """Call after every test case.""" # print "O: >>%s<<" % self._log.getvalue() logSys = logging.getLogger("fail2ban") logSys.handlers = self._old_handlers logSys.level = self._old_level self.__action.execActionStop() def _is_logged(self, s): return s in self._log.getvalue() def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("echo -n") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
def play(self, must_coup, players): logging.info('Player play: {}'.format(must_coup)) headers = {'Must-Coup': 'true' if must_coup else 'false'} r = requests.get(self.uri + "/play/", headers=headers) return Action.decode_action_from_dict(self.__decode_response(r), players)
class ExecuteAction(LogCaptureTestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") LogCaptureTestCase.setUp(self) def tearDown(self): """Call after every test case.""" LogCaptureTestCase.tearDown(self) self.__action.execActionStop() def testNameChange(self): self.assertEqual(self.__action.getName(), "Test") self.__action.setName("Tricky Test") self.assertEqual(self.__action.getName(), "Tricky Test") def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<A>'})) self.assertFalse(Action.substituteRecursiveTags({'A': '<B>', 'B': '<C>', 'C': '<A>'})) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <D> <X>','X':'fun'}), {'A': '<C> <D> fun', 'X':'fun'}) self.assertEqual(Action.substituteRecursiveTags({'A': '<C> <B>', 'B': 'cool'}), {'A': '<C> cool', 'B': 'cool'}) # rest is just cool self.assertEqual(Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', }) def testReplaceTag(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123", 'xyz': "890", } self.assertEqual( self.__action.replaceTag("Text<br>text", aInfo), "Text\ntext") self.assertEqual( self.__action.replaceTag("Text <HOST> text", aInfo), "Text 192.0.2.0 text") self.assertEqual( self.__action.replaceTag("Text <xyz> text <ABC> ABC", aInfo), "Text 890 text 123 ABC") self.assertEqual( self.__action.replaceTag("<matches>", {'matches': "some >char< should \< be[ escap}ed&"}), r"some \>char\< should \\\< be\[ escap\}ed\&") def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStart(), "touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.assertEqual(self.__action.getActionStop(), 'rm -f /tmp/fail2ban.test') self.__action.setActionBan("echo -n") self.assertEqual(self.__action.getActionBan(), 'echo -n') self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertEqual(self.__action.getActionCheck(), '[ -e /tmp/fail2ban.test ]') self.__action.setActionUnban("true") self.assertEqual(self.__action.getActionUnban(), 'true') self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteActionEmptyUnban(self): self.__action.setActionUnban("") self.assertTrue(self.__action.execActionUnban(None)) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteActionStartCtags(self): self.__action.setCInfo("HOST","192.0.2.0") self.__action.setActionStart("touch /tmp/fail2ban.test.<HOST>") self.__action.setActionStop("rm -f /tmp/fail2ban.test.<HOST>") self.__action.setActionCheck("[ -e /tmp/fail2ban.test.192.0.2.0 ]") self.assertTrue(self.__action.execActionStart()) def testExecuteActionCheckRestoreEnvironment(self): self.__action.setActionStart("") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("rm /tmp/fail2ban.test") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Unable to restore environment')) def testExecuteActionChangeCtags(self): self.__action.setCInfo("ROST","192.0.2.0") self.assertEqual(self.__action.getCInfo("ROST"),"192.0.2.0") self.__action.delCInfo("ROST") self.assertRaises(KeyError, self.__action.getCInfo, "ROST") def testExecuteActionUnbanAinfo(self): aInfo = { 'ABC': "123", } self.__action.setActionBan("touch /tmp/fail2ban.test.123") self.__action.setActionUnban("rm /tmp/fail2ban.test.<ABC>") self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self.__action.execActionUnban(aInfo)) def testExecuteActionStartEmpty(self): self.__action.setActionStart("") self.assertTrue(self.__action.execActionStart()) self.assertTrue(self._is_logged('Nothing to do')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))
class ExecuteAction(unittest.TestCase): def setUp(self): """Call before every test case.""" self.__action = Action("Test") # For extended testing of what gets output into logging # system, we will redirect it to a string logSys = logging.getLogger("fail2ban") # Keep old settings self._old_level = logSys.level self._old_handlers = logSys.handlers # Let's log everything into a string self._log = StringIO() logSys.handlers = [logging.StreamHandler(self._log)] logSys.setLevel(getattr(logging, 'DEBUG')) def tearDown(self): """Call after every test case.""" # print "O: >>%s<<" % self._log.getvalue() logSys = logging.getLogger("fail2ban") logSys.handlers = self._old_handlers logSys.level = self._old_level self.__action.execActionStop() def _is_logged(self, s): return s in self._log.getvalue() def testSubstituteRecursiveTags(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123 <HOST>", 'xyz': "890 <ABC>", } # Recursion is bad self.assertFalse(Action.substituteRecursiveTags({'A': '<A>'})) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<A>' })) self.assertFalse( Action.substituteRecursiveTags({ 'A': '<B>', 'B': '<C>', 'C': '<A>' })) # missing tags are ok self.assertEqual(Action.substituteRecursiveTags({'A': '<C>'}), {'A': '<C>'}) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <D> <X>', 'X': 'fun' }), { 'A': '<C> <D> fun', 'X': 'fun' }) self.assertEqual( Action.substituteRecursiveTags({ 'A': '<C> <B>', 'B': 'cool' }), { 'A': '<C> cool', 'B': 'cool' }) # rest is just cool self.assertEqual( Action.substituteRecursiveTags(aInfo), { 'HOST': "192.0.2.0", 'ABC': '123 192.0.2.0', 'xyz': '890 123 192.0.2.0', }) def testReplaceTag(self): aInfo = { 'HOST': "192.0.2.0", 'ABC': "123", 'xyz': "890", } self.assertEqual(self.__action.replaceTag("Text<br>text", aInfo), "Text\ntext") self.assertEqual(self.__action.replaceTag("Text <HOST> text", aInfo), "Text 192.0.2.0 text") self.assertEqual( self.__action.replaceTag("Text <xyz> text <ABC> ABC", aInfo), "Text 890 text 123 ABC") self.assertEqual( self.__action.replaceTag( "<matches>", {'matches': "some >char< should \< be[ escap}ed&"}), r"some \>char\< should \\\< be\[ escap\}ed\&") def testExecuteActionBan(self): self.__action.setActionStart("touch /tmp/fail2ban.test") self.__action.setActionStop("rm -f /tmp/fail2ban.test") self.__action.setActionBan("echo -n") self.__action.setActionCheck("[ -e /tmp/fail2ban.test ]") self.assertFalse(self._is_logged('returned')) # no action was actually executed yet self.assertTrue(self.__action.execActionBan(None)) self.assertTrue(self._is_logged('Invariant check failed')) self.assertTrue(self._is_logged('returned successfully')) def testExecuteIncorrectCmd(self): Action.executeCmd('/bin/ls >/dev/null\nbogusXXX now 2>/dev/null') self.assertTrue(self._is_logged('HINT on 7f00: "Command not found"'))