Skip to content

Commit 7c2a086

Browse files
WIP: build out firewall parser and tests
1 parent 5d3ac16 commit 7c2a086

File tree

3 files changed

+199
-31
lines changed

3 files changed

+199
-31
lines changed

netjsonconfig/backends/openwrt/converters/firewall.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,21 @@ def __get_auto_name_rule(self, rule):
8484
return "rule_{0}".format(self._get_uci_name(rule["name"]))
8585

8686
def to_netjson_loop(self, block, result, index):
87-
result["firewall"] = self.__netjson_firewall(block)
88-
return result
87+
result.setdefault("firewall", {})
88+
result["firewall"].setdefault("rules", [])
89+
90+
# _name = block.pop(".name")
91+
_type = block.pop(".type")
92+
93+
if _type == "rule":
94+
rule = self.__netjson_rule(block)
95+
# result["firewall"].setdefault("rules", [])
96+
result["firewall"]["rules"].append(rule)
97+
98+
return self.type_cast(result)
99+
100+
def __netjson_rule(self, rule):
101+
if "enabled" in rule:
102+
rule["enabled"] = rule.pop("enabled") == "1"
89103

90-
def __netjson_firewall(self, firewall):
91-
del firewall[".type"]
92-
_name = firewall.pop(".name")
93-
if _name != "firewall":
94-
firewall["id"] = _name
95-
return self.type_cast(firewall)
104+
return self.type_cast(rule)

tests/openwrt/test_default.py

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ def test_render_default(self):
2424
"firewall": {
2525
"rules": [
2626
{
27-
"config_name": "rule",
2827
"name": "Allow-MLD",
2928
"src": "wan",
3029
"proto": "icmp",
@@ -34,7 +33,6 @@ def test_render_default(self):
3433
"icmp_type": ["130/0", "131/0", "132/0", "143/0"],
3534
},
3635
{
37-
"config_name": "rule",
3836
"name": "Rule2",
3937
"src": "wan",
4038
"proto": "icmp",
@@ -138,45 +136,63 @@ def test_parse_default(self):
138136
)
139137
o = OpenWrt(native=native)
140138
expected = {
141-
"luci": [
139+
"led": [
142140
{
143-
"config_name": "core",
144-
"config_value": "main",
145-
"lang": "auto",
146-
"resourcebase": "/luci-static/resources",
147-
"mediaurlbase": "/luci-static/bootstrap",
148-
"number": "4",
149-
"boolean": "1",
141+
"dev": "1-1.1",
142+
"interval": 50,
143+
"name": "USB1",
144+
"sysfs": "tp-link:green:usb1",
145+
"trigger": "usbdev"
146+
}
147+
],
148+
"interfaces": [
149+
{
150+
"name": "eth0",
151+
"type": "ethernet"
150152
}
151153
],
152154
"firewall": {
153155
"rules": [
154156
{
155-
"config_name": "rule",
157+
"family": "ipv6",
158+
"icmp_type": [
159+
"130/0",
160+
"131/0",
161+
"132/0",
162+
"143/0"
163+
],
156164
"name": "Allow-MLD",
157-
"src": "wan",
158165
"proto": "icmp",
166+
"src": "wan",
159167
"src_ip": "fe80::/10",
160-
"family": "ipv6",
161168
"target": "ACCEPT",
162-
"icmp_type": ["130/0", "131/0", "132/0", "143/0"],
163169
}
164170
]
165171
},
166-
"led": [
172+
"luci": [
167173
{
168-
"name": "USB1",
169-
"sysfs": "tp-link:green:usb1",
170-
"trigger": "usbdev",
171-
"dev": "1-1.1",
172-
"interval": 50,
174+
"boolean": "1",
175+
"lang": "auto",
176+
"mediaurlbase": "/luci-static/bootstrap",
177+
"number": "4",
178+
"resourcebase": "/luci-static/resources",
179+
"config_value": "main",
180+
"config_name": "core"
173181
}
174182
],
175-
"interfaces": [{"name": "eth0", "type": "ethernet"}],
176183
"system": [
177-
{"test": "1", "config_name": "custom", "config_value": "custom"}
178-
],
184+
{
185+
"test": "1",
186+
"config_value": "custom",
187+
"config_name": "custom"
188+
}
189+
]
179190
}
191+
192+
print("*" * 80)
193+
import json
194+
print(json.dumps(o.config, indent=4))
195+
print("*" * 80)
180196
self.assertDictEqual(o.config, expected)
181197

182198
def test_skip(self):

tests/openwrt/test_firewall.py

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import textwrap
2+
import unittest
3+
4+
from netjsonconfig import OpenWrt
5+
# from netjsonconfig.exceptions import ValidationError
6+
from netjsonconfig.utils import _TabsMixin
7+
8+
9+
class TestFirewall(unittest.TestCase, _TabsMixin):
10+
maxDiff = None
11+
12+
_rule_1_netjson = {
13+
"firewall": {
14+
"rules": [
15+
{
16+
"name": "Allow-MLD",
17+
"src": "wan",
18+
"src_ip": "fe80::/10",
19+
"proto": "icmp",
20+
"icmp_type": ["130/0", "131/0", "132/0", "143/0"],
21+
"target": "ACCEPT",
22+
"family": "ipv6",
23+
}
24+
]
25+
}
26+
}
27+
28+
_rule_1_uci = textwrap.dedent(
29+
"""\
30+
package firewall
31+
32+
config defaults 'defaults'
33+
34+
config rule 'rule_Allow_MLD'
35+
option name 'Allow-MLD'
36+
option src 'wan'
37+
option src_ip 'fe80::/10'
38+
option proto 'icmp'
39+
list icmp_type '130/0'
40+
list icmp_type '131/0'
41+
list icmp_type '132/0'
42+
list icmp_type '143/0'
43+
option target 'ACCEPT'
44+
option family 'ipv6'
45+
"""
46+
)
47+
48+
def test_render_rule_1(self):
49+
o = OpenWrt(self._rule_1_netjson)
50+
expected = self._tabs(self._rule_1_uci)
51+
self.assertEqual(o.render(), expected)
52+
53+
def test_parse_rule_1(self):
54+
o = OpenWrt(native=self._rule_1_uci)
55+
self.assertEqual(o.config, self._rule_1_netjson)
56+
57+
_rule_2_netjson = {
58+
"firewall": {
59+
"rules": [
60+
{
61+
"name": "Allow-DHCPv6",
62+
"src": "wan",
63+
"src_ip": "fc00::/6",
64+
"dest_ip": "fc00::/6",
65+
"dest_port": "546",
66+
"proto": "udp",
67+
"target": "ACCEPT",
68+
"family": "ipv6",
69+
}
70+
]
71+
}
72+
}
73+
74+
_rule_2_uci = textwrap.dedent(
75+
"""\
76+
package firewall
77+
78+
config defaults 'defaults'
79+
80+
config rule 'rule_Allow_DHCPv6'
81+
option name 'Allow-DHCPv6'
82+
option src 'wan'
83+
option src_ip 'fc00::/6'
84+
option dest_ip 'fc00::/6'
85+
option dest_port '546'
86+
option proto 'udp'
87+
option target 'ACCEPT'
88+
option family 'ipv6'
89+
"""
90+
)
91+
92+
def test_render_rule_2(self):
93+
o = OpenWrt(self._rule_2_netjson)
94+
expected = self._tabs(self._rule_2_uci)
95+
self.assertEqual(o.render(), expected)
96+
97+
def test_parse_rule_2(self):
98+
o = OpenWrt(native=self._rule_2_uci)
99+
self.assertEqual(o.config, self._rule_2_netjson)
100+
101+
_rule_3_netjson = {
102+
"firewall": {
103+
"rules": [
104+
{
105+
"name": "Allow-Ping",
106+
"src": "wan",
107+
"proto": "icmp",
108+
"family": "ipv4",
109+
"icmp_type": [
110+
"echo-request",
111+
],
112+
"target": "ACCEPT",
113+
"enabled": False,
114+
}
115+
]
116+
}
117+
}
118+
119+
_rule_3_uci = textwrap.dedent(
120+
"""\
121+
package firewall
122+
123+
config defaults 'defaults'
124+
125+
config rule 'rule_Allow_Ping'
126+
option name 'Allow-Ping'
127+
option src 'wan'
128+
option proto 'icmp'
129+
option family 'ipv4'
130+
list icmp_type 'echo-request'
131+
option target 'ACCEPT'
132+
option enabled '0'
133+
"""
134+
)
135+
136+
def test_render_rule_3(self):
137+
o = OpenWrt(self._rule_3_netjson)
138+
expected = self._tabs(self._rule_3_uci)
139+
self.assertEqual(o.render(), expected)
140+
141+
def test_parse_rule_3(self):
142+
o = OpenWrt(native=self._rule_3_uci)
143+
self.assertEqual(o.config, self._rule_3_netjson)

0 commit comments

Comments
 (0)