1010
1111from ..const import (
1212 ATTR_ACCESSPOINTS ,
13+ ATTR_ADDR_GEN_MODE ,
1314 ATTR_ADDRESS ,
1415 ATTR_AUTH ,
1516 ATTR_CONNECTED ,
2223 ATTR_ID ,
2324 ATTR_INTERFACE ,
2425 ATTR_INTERFACES ,
26+ ATTR_IP6_PRIVACY ,
2527 ATTR_IPV4 ,
2628 ATTR_IPV6 ,
2729 ATTR_MAC ,
4648from ..host .configuration import (
4749 AccessPoint ,
4850 Interface ,
51+ InterfaceAddrGenMode ,
52+ InterfaceIp6Privacy ,
4953 InterfaceMethod ,
54+ Ip6Setting ,
5055 IpConfig ,
5156 IpSetting ,
5257 VlanConfig ,
6873 {
6974 vol .Optional (ATTR_ADDRESS ): [vol .Coerce (IPv6Interface )],
7075 vol .Optional (ATTR_METHOD ): vol .Coerce (InterfaceMethod ),
76+ vol .Optional (ATTR_ADDR_GEN_MODE ): vol .Coerce (InterfaceAddrGenMode ),
77+ vol .Optional (ATTR_IP6_PRIVACY ): vol .Coerce (InterfaceIp6Privacy ),
7178 vol .Optional (ATTR_GATEWAY ): vol .Coerce (IPv6Address ),
7279 vol .Optional (ATTR_NAMESERVERS ): [vol .Coerce (IPv6Address )],
7380 }
94101)
95102
96103
97- def ipconfig_struct (config : IpConfig , setting : IpSetting ) -> dict [str , Any ]:
98- """Return a dict with information about ip configuration."""
104+ def ip4config_struct (config : IpConfig , setting : IpSetting ) -> dict [str , Any ]:
105+ """Return a dict with information about IPv4 configuration."""
99106 return {
100107 ATTR_METHOD : setting .method ,
101108 ATTR_ADDRESS : [address .with_prefixlen for address in config .address ],
@@ -105,6 +112,19 @@ def ipconfig_struct(config: IpConfig, setting: IpSetting) -> dict[str, Any]:
105112 }
106113
107114
115+ def ip6config_struct (config : IpConfig , setting : Ip6Setting ) -> dict [str , Any ]:
116+ """Return a dict with information about IPv6 configuration."""
117+ return {
118+ ATTR_METHOD : setting .method ,
119+ ATTR_ADDR_GEN_MODE : setting .addr_gen_mode ,
120+ ATTR_IP6_PRIVACY : setting .ip6_privacy ,
121+ ATTR_ADDRESS : [address .with_prefixlen for address in config .address ],
122+ ATTR_NAMESERVERS : [str (address ) for address in config .nameservers ],
123+ ATTR_GATEWAY : str (config .gateway ) if config .gateway else None ,
124+ ATTR_READY : config .ready ,
125+ }
126+
127+
108128def wifi_struct (config : WifiConfig ) -> dict [str , Any ]:
109129 """Return a dict with information about wifi configuration."""
110130 return {
@@ -132,10 +152,10 @@ def interface_struct(interface: Interface) -> dict[str, Any]:
132152 ATTR_CONNECTED : interface .connected ,
133153 ATTR_PRIMARY : interface .primary ,
134154 ATTR_MAC : interface .mac ,
135- ATTR_IPV4 : ipconfig_struct (interface .ipv4 , interface .ipv4setting )
155+ ATTR_IPV4 : ip4config_struct (interface .ipv4 , interface .ipv4setting )
136156 if interface .ipv4 and interface .ipv4setting
137157 else None ,
138- ATTR_IPV6 : ipconfig_struct (interface .ipv6 , interface .ipv6setting )
158+ ATTR_IPV6 : ip6config_struct (interface .ipv6 , interface .ipv6setting )
139159 if interface .ipv6 and interface .ipv6setting
140160 else None ,
141161 ATTR_WIFI : wifi_struct (interface .wifi ) if interface .wifi else None ,
@@ -212,25 +232,31 @@ async def interface_update(self, request: web.Request) -> None:
212232 for key , config in body .items ():
213233 if key == ATTR_IPV4 :
214234 interface .ipv4setting = IpSetting (
215- config .get (ATTR_METHOD , InterfaceMethod .STATIC ),
216- config .get (ATTR_ADDRESS , []),
217- config .get (ATTR_GATEWAY ),
218- config .get (ATTR_NAMESERVERS , []),
235+ method = config .get (ATTR_METHOD , InterfaceMethod .STATIC ),
236+ address = config .get (ATTR_ADDRESS , []),
237+ gateway = config .get (ATTR_GATEWAY ),
238+ nameservers = config .get (ATTR_NAMESERVERS , []),
219239 )
220240 elif key == ATTR_IPV6 :
221- interface .ipv6setting = IpSetting (
222- config .get (ATTR_METHOD , InterfaceMethod .STATIC ),
223- config .get (ATTR_ADDRESS , []),
224- config .get (ATTR_GATEWAY ),
225- config .get (ATTR_NAMESERVERS , []),
241+ interface .ipv6setting = Ip6Setting (
242+ method = config .get (ATTR_METHOD , InterfaceMethod .STATIC ),
243+ addr_gen_mode = config .get (
244+ ATTR_ADDR_GEN_MODE , InterfaceAddrGenMode .DEFAULT
245+ ),
246+ ip6_privacy = config .get (
247+ ATTR_IP6_PRIVACY , InterfaceIp6Privacy .DEFAULT
248+ ),
249+ address = config .get (ATTR_ADDRESS , []),
250+ gateway = config .get (ATTR_GATEWAY ),
251+ nameservers = config .get (ATTR_NAMESERVERS , []),
226252 )
227253 elif key == ATTR_WIFI :
228254 interface .wifi = WifiConfig (
229- config .get (ATTR_MODE , WifiMode .INFRASTRUCTURE ),
230- config .get (ATTR_SSID , "" ),
231- config .get (ATTR_AUTH , AuthMethod .OPEN ),
232- config .get (ATTR_PSK , None ),
233- None ,
255+ mode = config .get (ATTR_MODE , WifiMode .INFRASTRUCTURE ),
256+ ssid = config .get (ATTR_SSID , "" ),
257+ auth = config .get (ATTR_AUTH , AuthMethod .OPEN ),
258+ psk = config .get (ATTR_PSK , None ),
259+ signal = None ,
234260 )
235261 elif key == ATTR_ENABLED :
236262 interface .enabled = config
@@ -277,19 +303,25 @@ async def create_vlan(self, request: web.Request) -> None:
277303 ipv4_setting = None
278304 if ATTR_IPV4 in body :
279305 ipv4_setting = IpSetting (
280- body [ATTR_IPV4 ].get (ATTR_METHOD , InterfaceMethod .AUTO ),
281- body [ATTR_IPV4 ].get (ATTR_ADDRESS , []),
282- body [ATTR_IPV4 ].get (ATTR_GATEWAY , None ),
283- body [ATTR_IPV4 ].get (ATTR_NAMESERVERS , []),
306+ method = body [ATTR_IPV4 ].get (ATTR_METHOD , InterfaceMethod .AUTO ),
307+ address = body [ATTR_IPV4 ].get (ATTR_ADDRESS , []),
308+ gateway = body [ATTR_IPV4 ].get (ATTR_GATEWAY , None ),
309+ nameservers = body [ATTR_IPV4 ].get (ATTR_NAMESERVERS , []),
284310 )
285311
286312 ipv6_setting = None
287313 if ATTR_IPV6 in body :
288- ipv6_setting = IpSetting (
289- body [ATTR_IPV6 ].get (ATTR_METHOD , InterfaceMethod .AUTO ),
290- body [ATTR_IPV6 ].get (ATTR_ADDRESS , []),
291- body [ATTR_IPV6 ].get (ATTR_GATEWAY , None ),
292- body [ATTR_IPV6 ].get (ATTR_NAMESERVERS , []),
314+ ipv6_setting = Ip6Setting (
315+ method = body [ATTR_IPV6 ].get (ATTR_METHOD , InterfaceMethod .AUTO ),
316+ addr_gen_mode = body [ATTR_IPV6 ].get (
317+ ATTR_ADDR_GEN_MODE , InterfaceAddrGenMode .DEFAULT
318+ ),
319+ ip6_privacy = body [ATTR_IPV6 ].get (
320+ ATTR_IP6_PRIVACY , InterfaceIp6Privacy .DEFAULT
321+ ),
322+ address = body [ATTR_IPV6 ].get (ATTR_ADDRESS , []),
323+ gateway = body [ATTR_IPV6 ].get (ATTR_GATEWAY , None ),
324+ nameservers = body [ATTR_IPV6 ].get (ATTR_NAMESERVERS , []),
293325 )
294326
295327 vlan_interface = Interface (
0 commit comments