From a374d4e81786c5a90b987ca1af434b10eab5d6c6 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Thu, 13 Aug 2020 10:43:36 +0200 Subject: [PATCH] Make sure we only run ingress with installed add-ons (#1903) * Make sure we only run ingress with installed add-ons * Make sure we reload tokens after uninstall * Optimize token handling * Fix error --- supervisor/addons/__init__.py | 18 ++++++++++++++---- supervisor/ingress.py | 5 +++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/supervisor/addons/__init__.py b/supervisor/addons/__init__.py index 7c64dd48c..7518f4dcf 100644 --- a/supervisor/addons/__init__.py +++ b/supervisor/addons/__init__.py @@ -45,7 +45,7 @@ class AddonManager(CoreSysAttributes): """Return a list of all installed add-ons.""" return list(self.local.values()) - def get(self, addon_slug: str) -> Optional[AnyAddon]: + def get(self, addon_slug: str, local_only: bool = False) -> Optional[AnyAddon]: """Return an add-on from slug. Prio: @@ -54,7 +54,9 @@ class AddonManager(CoreSysAttributes): """ if addon_slug in self.local: return self.local[addon_slug] - return self.store.get(addon_slug) + if not local_only: + return self.store.get(addon_slug) + return None def from_token(self, token: str) -> Optional[Addon]: """Return an add-on from Supervisor token.""" @@ -156,7 +158,12 @@ class AddonManager(CoreSysAttributes): raise AddonsError() from None else: self.local[slug] = addon - _LOGGER.info("Add-on '%s' successfully installed", slug) + + # Reload ingress tokens + if addon.with_ingress: + await self.sys_ingress.reload() + + _LOGGER.info("Add-on '%s' successfully installed", slug) async def uninstall(self, slug: str) -> None: """Remove an add-on.""" @@ -188,7 +195,9 @@ class AddonManager(CoreSysAttributes): await self.sys_ingress.update_hass_panel(addon) # Cleanup Ingress dynamic port assignment - self.sys_ingress.del_dynamic_port(slug) + if addon.with_ingress: + self.sys_create_task(self.sys_ingress.reload()) + self.sys_ingress.del_dynamic_port(slug) # Cleanup discovery data for message in self.sys_discovery.list_messages: @@ -302,6 +311,7 @@ class AddonManager(CoreSysAttributes): # Update ingress if addon.with_ingress: + await self.sys_ingress.reload() with suppress(HomeAssistantAPIError): await self.sys_ingress.update_hass_panel(addon) diff --git a/supervisor/ingress.py b/supervisor/ingress.py index 3f1220f29..6a64fdac5 100644 --- a/supervisor/ingress.py +++ b/supervisor/ingress.py @@ -28,8 +28,8 @@ class Ingress(JsonConfig, CoreSysAttributes): def get(self, token: str) -> Optional[Addon]: """Return addon they have this ingress token.""" if token not in self.tokens: - self._update_token_list() - return self.sys_addons.get(self.tokens.get(token)) + return None + return self.sys_addons.get(self.tokens[token], local_only=True) @property def sessions(self) -> Dict[str, float]: @@ -61,6 +61,7 @@ class Ingress(JsonConfig, CoreSysAttributes): async def reload(self) -> None: """Reload/Validate sessions.""" self._cleanup_sessions() + self._update_token_list() async def unload(self) -> None: """Shutdown sessions."""