ha-supervisor/supervisor/dbus/network/setting/__init__.py

154 lines
5.1 KiB
Python

"""Connection object for Network Manager."""
import logging
from typing import Any, Awaitable, Optional
from ....const import ATTR_METHOD, ATTR_MODE, ATTR_PSK, ATTR_SSID
from ....utils.dbus import DBus
from ...const import DBUS_NAME_NM
from ...interface import DBusInterfaceProxy
from ...utils import dbus_connected
from ..configuration import (
ConnectionProperties,
EthernetProperties,
IpProperties,
VlanProperties,
WirelessProperties,
WirelessSecurityProperties,
)
CONF_ATTR_CONNECTION = "connection"
CONF_ATTR_802_ETHERNET = "802-3-ethernet"
CONF_ATTR_802_WIRELESS = "802-11-wireless"
CONF_ATTR_802_WIRELESS_SECURITY = "802-11-wireless-security"
CONF_ATTR_VLAN = "vlan"
CONF_ATTR_IPV4 = "ipv4"
CONF_ATTR_IPV6 = "ipv6"
ATTR_ID = "id"
ATTR_UUID = "uuid"
ATTR_TYPE = "type"
ATTR_PARENT = "parent"
ATTR_ASSIGNED_MAC = "assigned-mac-address"
ATTR_POWERSAVE = "powersave"
ATTR_AUTH_ALG = "auth-alg"
ATTR_KEY_MGMT = "key-mgmt"
ATTR_INTERFACE_NAME = "interface-name"
_LOGGER: logging.Logger = logging.getLogger(__name__)
class NetworkSetting(DBusInterfaceProxy):
"""NetworkConnection object for Network Manager."""
def __init__(self, object_path: str) -> None:
"""Initialize NetworkConnection object."""
self.object_path = object_path
self.properties = {}
self._connection: Optional[ConnectionProperties] = None
self._wireless: Optional[WirelessProperties] = None
self._wireless_security: Optional[WirelessSecurityProperties] = None
self._ethernet: Optional[EthernetProperties] = None
self._vlan: Optional[VlanProperties] = None
self._ipv4: Optional[IpProperties] = None
self._ipv6: Optional[IpProperties] = None
@property
def connection(self) -> Optional[ConnectionProperties]:
"""Return connection properties if any."""
return self._connection
@property
def wireless(self) -> Optional[WirelessProperties]:
"""Return wireless properties if any."""
return self._wireless
@property
def wireless_security(self) -> Optional[WirelessSecurityProperties]:
"""Return wireless security properties if any."""
return self._wireless_security
@property
def ethernet(self) -> Optional[EthernetProperties]:
"""Return Ethernet properties if any."""
return self._ethernet
@property
def vlan(self) -> Optional[VlanProperties]:
"""Return Vlan properties if any."""
return self._vlan
@property
def ipv4(self) -> Optional[IpProperties]:
"""Return ipv4 properties if any."""
return self._ipv4
@property
def ipv6(self) -> Optional[IpProperties]:
"""Return ipv6 properties if any."""
return self._ipv6
@dbus_connected
def get_settings(self) -> Awaitable[Any]:
"""Return connection settings."""
return self.dbus.Settings.Connection.GetSettings()
@dbus_connected
def update(self, settings: Any) -> Awaitable[None]:
"""Update connection settings."""
return self.dbus.Settings.Connection.Update(("a{sa{sv}}", settings))
@dbus_connected
def delete(self) -> Awaitable[None]:
"""Delete connection settings."""
return self.dbus.Settings.Connection.Delete()
async def connect(self) -> None:
"""Get connection information."""
self.dbus = await DBus.connect(DBUS_NAME_NM, self.object_path)
data = (await self.get_settings())[0]
if CONF_ATTR_CONNECTION in data:
self._connection = ConnectionProperties(
data[CONF_ATTR_CONNECTION].get(ATTR_ID),
data[CONF_ATTR_CONNECTION].get(ATTR_UUID),
data[CONF_ATTR_CONNECTION].get(ATTR_TYPE),
data[CONF_ATTR_CONNECTION].get(ATTR_INTERFACE_NAME),
)
if CONF_ATTR_802_ETHERNET in data:
self._ethernet = EthernetProperties(
data[CONF_ATTR_802_ETHERNET].get(ATTR_ASSIGNED_MAC),
)
if CONF_ATTR_802_WIRELESS in data:
self._wireless = WirelessProperties(
bytes(data[CONF_ATTR_802_WIRELESS].get(ATTR_SSID, [])).decode(),
data[CONF_ATTR_802_WIRELESS].get(ATTR_ASSIGNED_MAC),
data[CONF_ATTR_802_WIRELESS].get(ATTR_MODE),
data[CONF_ATTR_802_WIRELESS].get(ATTR_POWERSAVE),
)
if CONF_ATTR_802_WIRELESS_SECURITY in data:
self._wireless_security = WirelessSecurityProperties(
data[CONF_ATTR_802_WIRELESS_SECURITY].get(ATTR_AUTH_ALG),
data[CONF_ATTR_802_WIRELESS_SECURITY].get(ATTR_KEY_MGMT),
data[CONF_ATTR_802_WIRELESS_SECURITY].get(ATTR_PSK),
)
if CONF_ATTR_VLAN in data:
self._vlan = VlanProperties(
data[CONF_ATTR_VLAN].get(ATTR_ID),
data[CONF_ATTR_VLAN].get(ATTR_PARENT),
)
if CONF_ATTR_IPV4 in data:
self._ipv4 = IpProperties(
data[CONF_ATTR_IPV4].get(ATTR_METHOD),
)
if CONF_ATTR_IPV6 in data:
self._ipv6 = IpProperties(
data[CONF_ATTR_IPV6].get(ATTR_METHOD),
)