mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-25 18:16:32 +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):
|
||||
await self.sys_ingress.update_hass_panel(addon)
|
||||
|
||||
# Cleanup Ingress dynamic port assignment
|
||||
self.sys_ingress.del_dynamic_port(slug)
|
||||
|
||||
# Cleanup discovery data
|
||||
for message in self.sys_discovery.list_messages:
|
||||
if message.addon != addon.slug:
|
||||
|
@ -8,6 +8,7 @@ from typing import Dict, List, Optional
|
||||
from .addons.addon import Addon
|
||||
from .const import ATTR_PORTS, ATTR_SESSION, FILE_HASSIO_INGRESS
|
||||
from .coresys import CoreSys, CoreSysAttributes
|
||||
from .utils import check_port
|
||||
from .utils.dt import utc_from_timestamp, utcnow
|
||||
from .utils.json import JsonConfig
|
||||
from .validate import SCHEMA_INGRESS_CONFIG
|
||||
@ -118,6 +119,13 @@ class Ingress(JsonConfig, CoreSysAttributes):
|
||||
"""Get/Create a dynamic port from range."""
|
||||
if addon_slug in self.ports:
|
||||
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)
|
||||
|
||||
# Save port for next time
|
||||
@ -125,6 +133,14 @@ class Ingress(JsonConfig, CoreSysAttributes):
|
||||
self.save_data()
|
||||
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):
|
||||
"""Return True if Home Assistant up and running."""
|
||||
if not await self.sys_homeassistant.is_running():
|
||||
|
Loading…
x
Reference in New Issue
Block a user