Skip to content

Commit f22147e

Browse files
authored
Merge pull request #283 from ldx/issue279
Add unittest for failing match recent module
2 parents cc1af53 + 9b1300f commit f22147e

File tree

2 files changed

+37
-18
lines changed

2 files changed

+37
-18
lines changed

iptc/easy.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ def encode_iptc_rule(rule_d, ipv6=False):
300300
# Avoid issues with matches that require basic parameters to be configured first
301301
for name in rule_attr:
302302
if name in rule_d:
303-
_iptc_setrule(iptc_rule, name, rule_d[name])
303+
setattr(iptc_rule, name.replace('-', '_'), rule_d[name])
304304
for name, value in rule_d.items():
305305
try:
306306
if name in rule_attr:
@@ -388,18 +388,6 @@ def _iptc_getchain(table, chain, ipv6=False, raise_exc=True):
388388
except Exception as e:
389389
if raise_exc: raise
390390

391-
def _iptc_setattr(object, name, value):
392-
# Translate attribute name
393-
name = name.replace('-', '_')
394-
setattr(object, name, value)
395-
396-
def _iptc_setattr_d(object, value_d):
397-
for name, value in value_d.items():
398-
_iptc_setattr(object, name, value)
399-
400-
def _iptc_setrule(iptc_rule, name, value):
401-
_iptc_setattr(iptc_rule, name, value)
402-
403391
def _iptc_setmatch(iptc_rule, name, value):
404392
# Iterate list/tuple recursively
405393
if isinstance(value, list) or isinstance(value, tuple):
@@ -408,21 +396,21 @@ def _iptc_setmatch(iptc_rule, name, value):
408396
# Assign dictionary value
409397
elif isinstance(value, dict):
410398
iptc_match = iptc_rule.create_match(name)
411-
_iptc_setattr_d(iptc_match, value)
399+
[iptc_match.set_parameter(k, v) for k, v in value.items()]
412400
# Assign value directly
413401
else:
414402
iptc_match = iptc_rule.create_match(name)
415-
_iptc_setattr(iptc_match, name, value)
403+
iptc_match.set_parameter(name, value)
416404

417405
def _iptc_settarget(iptc_rule, value):
418-
# Target is dictionary - Use only 1 pair key/value
406+
# Target is dictionary - Use only 1st pair key/value
419407
if isinstance(value, dict):
420408
t_name, t_value = next(iter(value.items()))
421409
if t_name == 'goto':
422410
iptc_target = iptc_rule.create_target(t_value, goto=True)
423411
else:
424412
iptc_target = iptc_rule.create_target(t_name)
425-
_iptc_setattr_d(iptc_target, t_value)
413+
[iptc_target.set_parameter(k, v) for k, v in t_value.items()]
426414
# Simple target
427415
else:
428416
iptc_target = iptc_rule.create_target(value)

tests/test_matches.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,35 @@ def test_hashlimit(self):
471471
self.assertEqual(m.hashlimit_upto, "200/sec")
472472
self.assertEqual(m.hashlimit_burst, "5")
473473

474+
class TestRecentMatch(unittest.TestCase):
475+
def setUp(self):
476+
self.table = 'filter'
477+
self.chain = 'iptc_test_recent'
478+
iptc.easy.delete_chain(self.table, self.chain, ipv6=False, flush=True, raise_exc=False)
479+
iptc.easy.add_chain(self.table, self.chain, ipv6=False, raise_exc=True)
480+
481+
def tearDown(self):
482+
iptc.easy.delete_chain(self.table, self.chain, ipv6=False, flush=True, raise_exc=False)
483+
484+
def test_recent(self):
485+
rule_d = {
486+
'protocol': 'udp',
487+
'recent': {
488+
'mask': '255.255.255.255',
489+
'update': '',
490+
'seconds': '60',
491+
'rsource': '',
492+
'name': 'UDP-PORTSCAN',
493+
},
494+
'target': {
495+
'REJECT':{
496+
'reject-with': 'icmp-port-unreachable'
497+
}
498+
}
499+
}
500+
iptc.easy.add_rule(self.table, self.chain, rule_d)
501+
rule2_d = iptc.easy.get_rule(self.table, self.chain, -1)
502+
self.assertEqual(rule_d, rule2_d)
474503

475504
def suite():
476505
suite_match = unittest.TestLoader().loadTestsFromTestCase(TestMatch)
@@ -488,6 +517,8 @@ def suite():
488517
TestXTConntrackMatch)
489518
suite_hashlimit = unittest.TestLoader().loadTestsFromTestCase(
490519
TestHashlimitMatch)
520+
suite_recent = unittest.TestLoader().loadTestsFromTestCase(
521+
TestRecentMatch)
491522
extra_suites = []
492523
if is_table6_available(iptc.Table6.FILTER):
493524
extra_suites += unittest.TestLoader().loadTestsFromTestCase(
@@ -496,7 +527,7 @@ def suite():
496527
return unittest.TestSuite([suite_match, suite_udp, suite_mark,
497528
suite_limit, suite_mport, suite_comment,
498529
suite_iprange, suite_state, suite_conntrack,
499-
suite_hashlimit] + extra_suites)
530+
suite_hashlimit, suite_recent] + extra_suites)
500531

501532

502533
def run_tests():

0 commit comments

Comments
 (0)