From 3d79891249e5d061017f682e8d0b50c8c0934f44 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 2 Dec 2020 17:22:28 +0100 Subject: [PATCH] Make dbus connection more robust (#2325) * Make dbus connection more robust * move rauc down --- supervisor/dbus/__init__.py | 25 +++++++++++++++++-------- supervisor/dbus/hostname.py | 2 ++ supervisor/dbus/interface.py | 1 + supervisor/dbus/network/__init__.py | 2 ++ supervisor/dbus/rauc.py | 2 ++ supervisor/dbus/systemd.py | 2 ++ 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/supervisor/dbus/__init__.py b/supervisor/dbus/__init__.py index da89bffc8..4ad5bb44d 100644 --- a/supervisor/dbus/__init__.py +++ b/supervisor/dbus/__init__.py @@ -1,9 +1,11 @@ """D-Bus interface objects.""" import logging +from typing import List +from ..const import SOCKET_DBUS from ..coresys import CoreSys, CoreSysAttributes -from ..exceptions import DBusNotConnectedError from .hostname import Hostname +from .interface import DBusInterface from .network import NetworkManager from .rauc import Rauc from .systemd import Systemd @@ -45,15 +47,22 @@ class DBusManager(CoreSysAttributes): async def load(self) -> None: """Connect interfaces to D-Bus.""" - - try: - await self.systemd.connect() - await self.hostname.connect() - await self.rauc.connect() - await self.network.connect() - except DBusNotConnectedError: + if not SOCKET_DBUS.exists(): _LOGGER.error( "No D-Bus support on Host. Disabled any kind of host control!" ) + return + + dbus_loads: List[DBusInterface] = [ + self.systemd, + self.hostname, + self.network, + self.rauc, + ] + for dbus in dbus_loads: + try: + await dbus.connect() + except Exception as err: # pylint: disable=broad-except + _LOGGER.warning("Can't load dbus interface %s: %s", dbus.name, err) self.sys_host.supported_features.cache_clear() diff --git a/supervisor/dbus/hostname.py b/supervisor/dbus/hostname.py index 65d64cf5a..93ddbf656 100644 --- a/supervisor/dbus/hostname.py +++ b/supervisor/dbus/hostname.py @@ -23,6 +23,8 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) class Hostname(DBusInterface): """Handle D-Bus interface for hostname/system.""" + name = DBUS_NAME_HOSTNAME + def __init__(self): """Initialize Properties.""" self._hostname: Optional[str] = None diff --git a/supervisor/dbus/interface.py b/supervisor/dbus/interface.py index 8a3562e90..c0c085f33 100644 --- a/supervisor/dbus/interface.py +++ b/supervisor/dbus/interface.py @@ -9,6 +9,7 @@ class DBusInterface(ABC): """Handle D-Bus interface for hostname/system.""" dbus: Optional[DBus] = None + name: Optional[str] = None @property def is_connected(self): diff --git a/supervisor/dbus/network/__init__.py b/supervisor/dbus/network/__init__.py index 4b998e0d4..1e137eea1 100644 --- a/supervisor/dbus/network/__init__.py +++ b/supervisor/dbus/network/__init__.py @@ -27,6 +27,8 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) class NetworkManager(DBusInterface): """Handle D-Bus interface for Network Manager.""" + name = DBUS_NAME_NM + def __init__(self) -> None: """Initialize Properties.""" self._dns: NetworkManagerDNS = NetworkManagerDNS() diff --git a/supervisor/dbus/rauc.py b/supervisor/dbus/rauc.py index 0a29112ed..7eb1d18c6 100644 --- a/supervisor/dbus/rauc.py +++ b/supervisor/dbus/rauc.py @@ -25,6 +25,8 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) class Rauc(DBusInterface): """Handle D-Bus interface for rauc.""" + name = DBUS_NAME_RAUC + def __init__(self): """Initialize Properties.""" self._operation: Optional[str] = None diff --git a/supervisor/dbus/systemd.py b/supervisor/dbus/systemd.py index 659304c5c..6e5c4d2de 100644 --- a/supervisor/dbus/systemd.py +++ b/supervisor/dbus/systemd.py @@ -13,6 +13,8 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) class Systemd(DBusInterface): """Systemd function handler.""" + name = DBUS_NAME_SYSTEMD + async def connect(self): """Connect to D-Bus.""" try: