Skip to content

Commit a0cf3ab

Browse files
committed
Do not emit duplicate client/server pairs
1 parent 85af3b7 commit a0cf3ab

3 files changed

Lines changed: 25 additions & 9 deletions

File tree

lib/firewall.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ def service_flow_nodes_iter(self, access, service):
119119
return self.service_nodes[access].get(service, [])
120120

121121
def client_server(self):
122+
# Duplication cache. This protect us from emitting duplicates.
123+
emit_register = {}
124+
122125
# Select all servers
123126
for server_id, server_srv in self.node_service_iter('server'):
124127
logging.debug('Generating rules for server %d (%s)',
@@ -150,12 +153,16 @@ def client_server(self):
150153
from_nodes.append(int(nat_host[0]))
151154

152155
for from_node_id in from_nodes:
153-
row = [from_node_id,
156+
row = (from_node_id,
154157
to_node_id,
155158
client_srv.service_id,
156159
client_srv.flow_id,
157160
client_srv.is_ipv4 and server_srv.is_ipv4,
158-
client_srv.is_ipv6 and server_srv.is_ipv6]
161+
client_srv.is_ipv6 and server_srv.is_ipv6)
162+
if row in emit_register:
163+
logging.debug('.... already present, skipping')
164+
continue
165+
emit_register[row] = True
159166
self.c.execute(
160167
'INSERT INTO firewall_rule VALUES '
161168
'(NULL, ?, ?, ?, ?, ?, ?)', row)

tests/TestFirewall.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@ def testServerClientRuleNat(self):
5858
packages.build(self.packages, self.c)
5959
firewall.build(self.packages, self.c)
6060
rules = self._query('SELECT * FROM firewall_rule_ip_level')
61-
self.assertEquals(len(rules), 2, "Wrong number of firewall rules")
61+
self.assertEquals(len(rules), 3, "Wrong number of firewall rules")
6262

63-
non_nat_rule, nat_rule = self._query(
63+
non_nat_rule1, nat_rule, non_nat_rule2 = self._query(
6464
"""SELECT
6565
from_node_name, to_node_name, flow_name, service_dst_ports
6666
FROM firewall_rule_ip_level"""
6767
)
68-
self.assertEquals(non_nat_rule[0], 'jumpgate1.event.dreamhack.se',
68+
self.assertEquals(non_nat_rule1[0], 'jumpgate1.event.dreamhack.se',
6969
"Wrong source host")
70-
self.assertEquals(non_nat_rule[1], 'ddns1.event.dreamhack.se',
70+
self.assertEquals(non_nat_rule1[1], 'ddns1.event.dreamhack.se',
7171
"Wrong destination host")
72-
self.assertEquals(non_nat_rule[2], 'event', "Wrong flow")
73-
self.assertEquals(non_nat_rule[3], '2022/tcp',
72+
self.assertEquals(non_nat_rule1[2], 'event', "Wrong flow")
73+
self.assertEquals(non_nat_rule1[3], '2022/tcp',
7474
"Wrong destination port/protocol")
7575

7676
self.assertEquals(nat_rule[0], 'nat.event.dreamhack.se',
@@ -81,6 +81,14 @@ def testServerClientRuleNat(self):
8181
self.assertEquals(nat_rule[3], '2022/tcp',
8282
"Wrong destination port/protocol")
8383

84+
self.assertEquals(non_nat_rule2[0], 'jumpgate2.event.dreamhack.se',
85+
"Wrong source host")
86+
self.assertEquals(non_nat_rule2[1], 'ddns1.event.dreamhack.se',
87+
"Wrong destination host")
88+
self.assertEquals(non_nat_rule2[2], 'event', "Wrong flow")
89+
self.assertEquals(non_nat_rule2[3], '2022/tcp',
90+
"Wrong destination port/protocol")
91+
8492
def testPublicRule(self):
8593
processor.parse(self._load('data/testPublicRule.txt'), self.c)
8694
packages.build(self.packages, self.c)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
TECH-SRV-7-DUMMYNET D-FW-V 77.80.231.112/28 925 othernet
22
#$ nat.event.dreamhack.se 77.80.231.119 none
33
TECH-SRV-6-JUMPNET D-FW-V 77.80.231.128/28 926 othernet;nat=77.80.231.119
4-
#$ jumpgate1.event.dreamhack.se 77.80.231.135 os=debian;pkg=jumpgate
4+
#$ jumpgate1.event.dreamhack.se 77.80.231.135 os=debian;pkg=jumpgate,-dhssh
5+
#$ jumpgate2.event.dreamhack.se 77.80.231.136 os=debian;pkg=jumpgate,-dhssh
56
TECH-SRV-10-DDNSNET D-FW-V 77.80.231.192/28 930 othernet;
67
#$ ddns1.event.dreamhack.se 77.80.231.201 os=debian;pkg=

0 commit comments

Comments
 (0)