Skip to content

Commit cc8f9f2

Browse files
committed
[feature] Added wireguard interfaces and peers to OpenWRT
1 parent 8b1d978 commit cc8f9f2

11 files changed

Lines changed: 591 additions & 41 deletions

File tree

netjsonconfig/backends/openwrt/converters/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .routes import Routes
99
from .rules import Rules
1010
from .switch import Switch
11+
from .wireguard_peers import WireguardPeers
1112
from .wireless import Wireless
1213

1314
__all__ = [
@@ -21,5 +22,6 @@
2122
'Routes',
2223
'Rules',
2324
'Switch',
25+
'WireguardPeers',
2426
'Wireless',
2527
]

netjsonconfig/backends/openwrt/converters/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class OpenWrtConverter(BaseConverter):
66

77
def should_skip_block(self, block):
88
_type = block.get('.type')
9-
return not block or _type not in self._uci_types
9+
return not block or (self._uci_types and _type not in self._uci_types)
1010

1111
def _get_uci_name(self, name):
1212
return name.replace('.', '_').replace('-', '_')

netjsonconfig/backends/openwrt/converters/interfaces.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from ..schema import schema
66
from .base import OpenWrtConverter
7-
from ..schema import schema
87

98

109
class Interfaces(OpenWrtConverter):
@@ -46,8 +45,9 @@ def __intermediate_addresses(self, interface):
4645
converts NetJSON address to
4746
UCI intermediate data structure
4847
"""
49-
if interface.get('proto') == 'wireguard':
50-
return self.__intermediate_wg_addresses(interface)
48+
# wireguard interfaces need a different format
49+
if interface.get('type') == 'wireguard':
50+
return self.__intermediate_wireguard_addresses(interface)
5151
address_list = self.get_copy(interface, 'addresses')
5252
# do not ignore interfaces if they do not contain any address
5353
if not address_list:
@@ -86,9 +86,15 @@ def __intermediate_addresses(self, interface):
8686
result += dhcp
8787
return result
8888

89-
def __intermediate_wg_addresses(self, interface):
90-
address_list = interface.pop('wg_addresses')
91-
static = {'addresses': address_list, 'proto': interface['proto']}
89+
def __intermediate_wireguard_addresses(self, interface):
90+
addresses = interface.pop('addresses')
91+
address_list = []
92+
for address_dict in addresses:
93+
address = address_dict['address']
94+
if 'mask' in address_dict:
95+
address = f'{address}/{address_dict["mask"]}'
96+
address_list.append(address)
97+
static = {'addresses': address_list, 'proto': 'wireguard'}
9298
return [static]
9399

94100
def __intermediate_interface(self, interface, uci_name):
@@ -97,9 +103,7 @@ def __intermediate_interface(self, interface, uci_name):
97103
UCI intermediate data structure
98104
"""
99105
interface.update({'.type': 'interface', '.name': uci_name})
100-
name = interface.pop('name')
101-
if interface.get('proto') != 'wireguard':
102-
interface['ifname'] = name
106+
interface['ifname'] = interface.pop('name')
103107
if 'network' in interface:
104108
del interface['network']
105109
if 'mac' in interface:
@@ -130,6 +134,12 @@ def _intermediate_modem_manager(self, interface):
130134
interface['proto'] = 'modemmanager'
131135
interface['pincode'] = interface.pop('pin', None)
132136

137+
def _intermediate_wireguard(self, interface):
138+
interface['proto'] = 'wireguard'
139+
interface['listen_port'] = interface.pop('port', None)
140+
del interface['ifname']
141+
return interface
142+
133143
def _intermediate_vxlan(self, interface):
134144
interface['proto'] = 'vxlan'
135145
interface['peeraddr'] = interface.pop('vtep')
@@ -320,6 +330,25 @@ def _netjson_modem_manager(self, interface):
320330

321331
_netjson_modemmanager = _netjson_modem_manager
322332

333+
_wireguard_schema = schema['definitions']['wireguard_interface']['allOf'][0]
334+
335+
def _netjson_wireguard(self, interface):
336+
interface['type'] = interface.pop('proto', None)
337+
interface['port'] = interface.pop('listen_port', None)
338+
addresses = []
339+
for address in interface['addresses']:
340+
cidr = ip_interface(address)
341+
addresses.append(
342+
{
343+
'address': str(cidr.ip),
344+
'mask': cidr.network.prefixlen,
345+
'proto': 'static',
346+
'family': f'ipv{cidr.ip.version}',
347+
}
348+
)
349+
interface['addresses'] = addresses
350+
return self.type_cast(interface, schema=self._wireguard_schema)
351+
323352
_vxlan_schema = schema['definitions']['vxlan_interface']['allOf'][0]
324353

325354
def _netjson_vxlan(self, interface):
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from ..schema import schema
2+
from .base import OpenWrtConverter
3+
4+
5+
class WireguardPeers(OpenWrtConverter):
6+
netjson_key = 'wireguard_peers'
7+
intermediate_key = 'network'
8+
_schema = schema['properties']['wireguard_peers']['items']
9+
# unfortunately due to the design of the
10+
# wireguard OpenWRT package, this is unpredictable
11+
_uci_types = None
12+
13+
def to_intermediate_loop(self, block, result, index=None):
14+
result.setdefault('network', [])
15+
result['network'].append(self.__intermediate_peer(block))
16+
return result
17+
18+
def __intermediate_peer(self, peer):
19+
interface = peer.pop("interface")
20+
peer.update({'.type': f'wireguard_{interface}', '.name': f'wgpeer_{interface}'})
21+
if not peer.get('endpoint_host') and 'endpoint_port' in peer:
22+
del peer['endpoint_port']
23+
return self.sorted_dict(peer)
24+
25+
def to_netjson_loop(self, block, result, index):
26+
result.setdefault('wireguard_peers', [])
27+
result['wireguard_peers'].append(self.__netjson_peer(block))
28+
return result
29+
30+
def __netjson_peer(self, peer):
31+
del peer['.name']
32+
interface = peer.pop('.type').replace('wireguard_', '')
33+
peer['interface'] = interface
34+
return self.type_cast(peer)

netjsonconfig/backends/openwrt/openwrt.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class OpenWrt(BaseBackend):
2222
converters.Radios,
2323
converters.Wireless,
2424
converters.OpenVpn,
25+
converters.WireguardPeers,
2526
converters.Default,
2627
]
2728
parser = OpenWrtParser

0 commit comments

Comments
 (0)