44
55from ..schema import schema
66from .base import OpenWrtConverter
7- from ..schema import schema
87
98
109class 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 ):
0 commit comments