|
| 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) |
0 commit comments