22from copy import deepcopy
33from ipaddress import ip_address , ip_interface
44
5+ from ..schema import schema
56from .base import OpenWrtConverter
67
78
@@ -109,6 +110,16 @@ def __intermediate_interface(self, interface, uci_name):
109110 del interface ['wireless' ]
110111 if 'addresses' in interface :
111112 del interface ['addresses' ]
113+ # specific transformation
114+ type_ = self ._get_uci_name (interface ["type" ])
115+ method = getattr (self , f'_intermediate_{ type_ } ' , None )
116+ if method :
117+ interface = method (interface )
118+ return interface
119+
120+ def _intermediate_modem_manager (self , interface ):
121+ interface ['proto' ] = 'modemmanager'
122+ interface ['pincode' ] = interface .pop ('pin' , None )
112123 return interface
113124
114125 _address_keys = ['address' , 'mask' , 'family' , 'gateway' ]
@@ -225,6 +236,10 @@ def __netjson_interface(self, interface):
225236 interface ['mac' ] = interface .pop ('macaddr' )
226237 if interface ['network' ] == self ._get_uci_name (interface ['name' ]):
227238 del interface ['network' ]
239+ # specific transformation
240+ method = getattr (self , f'_netjson_{ interface .get ("proto" )} ' , None )
241+ if method :
242+ interface = method (interface )
228243 return interface
229244
230245 def __netjson_type (self , interface ):
@@ -243,13 +258,17 @@ def __netjson_type(self, interface):
243258 return 'ethernet'
244259
245260 def __netjson_addresses (self , interface ):
246- proto = interface .pop ('proto' , 'none' )
261+ proto = interface .get ('proto' , 'none' )
262+ address_protos = ['static' , 'dhcp' , 'dhcpv6' , 'none' ]
263+ if 'proto' in interface and proto in address_protos :
264+ del interface ['proto' ]
247265 if 'ipaddr' not in interface and 'ip6addr' not in interface and proto == 'none' :
248266 return interface
249- if proto not in [ 'static' , 'dhcp' , 'dhcpv6' , 'none' ] :
250- interface ['proto ' ] = proto
251- interface [ 'type' ] = self .__get_special_interface_type (interface )
267+ if proto not in address_protos :
268+ interface ['type ' ] = 'other'
269+ return self ._add_netjson_addresses (interface , proto )
252270
271+ def _add_netjson_addresses (self , interface , proto ):
253272 addresses = []
254273 ipv4 = interface .pop ('ipaddr' , [])
255274 ipv6 = interface .pop ('ip6addr' , [])
@@ -273,14 +292,19 @@ def __netjson_addresses(self, interface):
273292 interface ['addresses' ] = addresses
274293 return interface
275294
276- def __get_special_interface_type (self , interface ):
277- username = interface .get ('username' , False )
278- password = interface .get ('password' , False )
295+ def _netjson_dialup (self , interface ):
296+ interface ['type' ] = 'dialup'
297+ return interface
298+
299+ _modem_manager_schema = schema ['definitions' ]['modemmanager_interface' ]
279300
280- if username and password :
281- return 'dialup'
301+ def _netjson_modem_manager (self , interface ):
302+ del interface ['proto' ]
303+ interface ['type' ] = 'modem-manager'
304+ interface ['pin' ] = interface .pop ('pincode' , None )
305+ return self .type_cast (interface , schema = self ._modem_manager_schema )
282306
283- return 'other'
307+ _netjson_modemmanager = _netjson_modem_manager
284308
285309 def __netjson_address (self , address , interface ):
286310 ip = ip_interface (address )
@@ -308,7 +332,7 @@ def __netjson_parse_ip(self, ip, netmask=32):
308332 if ip and netmask :
309333 return '{0}/{1}' .format (ip , netmask )
310334 else :
311- None
335+ return None
312336
313337 def __netjson_dns (self , interface , result ):
314338 key_mapping = {'dns' : 'dns_servers' , 'dns_search' : 'dns_search' }
@@ -320,3 +344,19 @@ def __netjson_dns(self, interface, result):
320344 items = items .split ()
321345 result .setdefault (netjson_key , [])
322346 result [netjson_key ] += items
347+
348+
349+ for proto in [
350+ '3g' ,
351+ '6in4' ,
352+ 'aiccu' ,
353+ 'l2tp' ,
354+ 'ncm' ,
355+ 'ppp' ,
356+ 'pppoa' ,
357+ 'pppoe' ,
358+ 'pptp' ,
359+ 'qmi' ,
360+ 'wwan' ,
361+ ]:
362+ setattr (Interfaces , f'_netjson_{ proto } ' , Interfaces ._netjson_dialup )
0 commit comments