Skip to content

Commit a89c7e9

Browse files
committed
[openwrt] Add firewall settings
1 parent c23ce97 commit a89c7e9

5 files changed

Lines changed: 473 additions & 47 deletions

File tree

netjsonconfig/backends/openwrt/converters/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
from .rules import Rules
1010
from .switch import Switch
1111
from .wireless import Wireless
12+
from .firewall import Firewall
1213

1314
__all__ = ['Default', 'Interfaces', 'General',
1415
'Led', 'Ntp', 'OpenVpn', 'Radios',
1516
'Routes', 'Rules', 'Switch',
16-
'Wireless']
17+
'Wireless', 'Firewall']
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from collections import OrderedDict
2+
3+
from ..schema import schema
4+
from .base import OpenWrtConverter
5+
6+
7+
class Firewall(OpenWrtConverter):
8+
netjson_key = 'firewall'
9+
intermediate_key = 'firewall'
10+
_uci_types = ['defaults', 'forwarding', 'zone', 'rule']
11+
_schema = schema['properties']['firewall']
12+
13+
def to_intermediate_loop(self, block, result, index=None):
14+
forwardings = self.__intermediate_forwardings(block.pop('forwardings', {}))
15+
zones = self.__intermediate_zones(block.pop('zones', {}))
16+
rules = self.__intermediate_rules(block.pop('rules', {}))
17+
block.update({
18+
'.type': 'defaults',
19+
'.name': block.pop('id', 'defaults'),
20+
})
21+
result.setdefault('firewall', [])
22+
result['firewall'] = [self.sorted_dict(block)] + forwardings + zones + rules
23+
return result
24+
25+
def __intermediate_forwardings(self, forwardings):
26+
"""
27+
converts NetJSON forwarding to
28+
UCI intermediate data structure
29+
"""
30+
result = []
31+
for forwarding in forwardings:
32+
resultdict = OrderedDict((('.name', self.__get_auto_name_forwarding(forwarding)),
33+
('.type', 'forwarding')))
34+
resultdict.update(forwarding)
35+
result.append(resultdict)
36+
return result
37+
38+
def __get_auto_name_forwarding(self, forwarding):
39+
if 'family' in forwarding.keys():
40+
uci_name = self._get_uci_name('_'.join([forwarding['src'], forwarding['dest'],
41+
forwarding['family']]))
42+
else:
43+
uci_name = self._get_uci_name('_'.join([forwarding['src'], forwarding['dest']]))
44+
return 'forwarding_{0}'.format(uci_name)
45+
46+
def __intermediate_zones(self, zones):
47+
"""
48+
converts NetJSON zone to
49+
UCI intermediate data structure
50+
"""
51+
result = []
52+
for zone in zones:
53+
resultdict = OrderedDict((('.name', self.__get_auto_name_zone(zone)),
54+
('.type', 'zone')))
55+
resultdict.update(zone)
56+
result.append(resultdict)
57+
return result
58+
59+
def __get_auto_name_zone(self, zone):
60+
return 'zone_{0}'.format(self._get_uci_name(zone['name']))
61+
62+
def __intermediate_rules(self, rules):
63+
"""
64+
converts NetJSON rule to
65+
UCI intermediate data structure
66+
"""
67+
result = []
68+
for rule in rules:
69+
if 'config_name' in rule:
70+
del rule['config_name']
71+
resultdict = OrderedDict((('.name', self.__get_auto_name_rule(rule)),
72+
('.type', 'rule')))
73+
resultdict.update(rule)
74+
result.append(resultdict)
75+
return result
76+
77+
def __get_auto_name_rule(self, rule):
78+
return 'rule_{0}'.format(self._get_uci_name(rule['name']))
79+
80+
def to_netjson_loop(self, block, result, index):
81+
result['firewall'] = self.__netjson_firewall(block)
82+
return result
83+
84+
def __netjson_firewall(self, firewall):
85+
del firewall['.type']
86+
_name = firewall.pop('.name')
87+
if _name != 'firewall':
88+
firewall['id'] = _name
89+
return self.type_cast(firewall)

netjsonconfig/backends/openwrt/openwrt.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class OpenWrt(BaseBackend):
2121
converters.Radios,
2222
converters.Wireless,
2323
converters.OpenVpn,
24+
converters.Firewall,
2425
converters.Default,
2526
]
2627
parser = OpenWrtParser

0 commit comments

Comments
 (0)