mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-27 02:56:31 +00:00
Fix possible Ingress port collisions (#1682)
* Fix possible Ingress port collisions * Cleanup dynamic port assignment on uninstall * Check port against gateway address * gateway address is already of type IPv4Address * Update supervisor/ingress.py Co-Authored-By: Pascal Vizeli <pvizeli@syshack.ch> Co-authored-by: Pascal Vizeli <pvizeli@syshack.ch>
This commit is contained in:
parent
b96697b708
commit
a9157e3a9f
@ -166,6 +166,9 @@ class AddonManager(CoreSysAttributes):
|
|||||||
with suppress(HomeAssistantAPIError):
|
with suppress(HomeAssistantAPIError):
|
||||||
await self.sys_ingress.update_hass_panel(addon)
|
await self.sys_ingress.update_hass_panel(addon)
|
||||||
|
|
||||||
|
# Cleanup Ingress dynamic port assignment
|
||||||
|
self.sys_ingress.del_dynamic_port(slug)
|
||||||
|
|
||||||
# Cleanup discovery data
|
# Cleanup discovery data
|
||||||
for message in self.sys_discovery.list_messages:
|
for message in self.sys_discovery.list_messages:
|
||||||
if message.addon != addon.slug:
|
if message.addon != addon.slug:
|
||||||
|
@ -8,6 +8,7 @@ from typing import Dict, List, Optional
|
|||||||
from .addons.addon import Addon
|
from .addons.addon import Addon
|
||||||
from .const import ATTR_PORTS, ATTR_SESSION, FILE_HASSIO_INGRESS
|
from .const import ATTR_PORTS, ATTR_SESSION, FILE_HASSIO_INGRESS
|
||||||
from .coresys import CoreSys, CoreSysAttributes
|
from .coresys import CoreSys, CoreSysAttributes
|
||||||
|
from .utils import check_port
|
||||||
from .utils.dt import utc_from_timestamp, utcnow
|
from .utils.dt import utc_from_timestamp, utcnow
|
||||||
from .utils.json import JsonConfig
|
from .utils.json import JsonConfig
|
||||||
from .validate import SCHEMA_INGRESS_CONFIG
|
from .validate import SCHEMA_INGRESS_CONFIG
|
||||||
@ -118,6 +119,13 @@ class Ingress(JsonConfig, CoreSysAttributes):
|
|||||||
"""Get/Create a dynamic port from range."""
|
"""Get/Create a dynamic port from range."""
|
||||||
if addon_slug in self.ports:
|
if addon_slug in self.ports:
|
||||||
return self.ports[addon_slug]
|
return self.ports[addon_slug]
|
||||||
|
|
||||||
|
port = None
|
||||||
|
while (
|
||||||
|
port is None
|
||||||
|
or port in self.ports.values()
|
||||||
|
or check_port(self.sys_docker.network.gateway, port)
|
||||||
|
):
|
||||||
port = random.randint(62000, 65500)
|
port = random.randint(62000, 65500)
|
||||||
|
|
||||||
# Save port for next time
|
# Save port for next time
|
||||||
@ -125,6 +133,14 @@ class Ingress(JsonConfig, CoreSysAttributes):
|
|||||||
self.save_data()
|
self.save_data()
|
||||||
return port
|
return port
|
||||||
|
|
||||||
|
def del_dynamic_port(self, addon_slug: str) -> None:
|
||||||
|
"""Remove a previously assigned dynamic port."""
|
||||||
|
if addon_slug not in self.ports:
|
||||||
|
return
|
||||||
|
|
||||||
|
del self.ports[addon_slug]
|
||||||
|
self.save_data()
|
||||||
|
|
||||||
async def update_hass_panel(self, addon: Addon):
|
async def update_hass_panel(self, addon: Addon):
|
||||||
"""Return True if Home Assistant up and running."""
|
"""Return True if Home Assistant up and running."""
|
||||||
if not await self.sys_homeassistant.is_running():
|
if not await self.sys_homeassistant.is_running():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user