From 0f30a23f3e157b590a4bb4d09bab923b0d25bdb0 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 21 Jul 2017 01:34:46 +0200 Subject: [PATCH] Add support for webui (#105) * Add support for webui * support lists * fix regex --- API.md | 3 ++- hassio/addons/addon.py | 22 +++++++++++++++++++++- hassio/addons/validate.py | 4 +++- hassio/api/addons.py | 5 +++-- hassio/const.py | 1 + 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/API.md b/API.md index 17c6c660b..47446a8b1 100644 --- a/API.md +++ b/API.md @@ -334,7 +334,8 @@ Get all available addons "options": "{}", "network": "{}|null", "host_network": "bool", - "logo": "bool" + "logo": "bool", + "webui": "null|http(s)://[HOST]:port/xy/zx" } ``` diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 364c4a348..c5b048fe7 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -19,7 +19,7 @@ from ..const import ( ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES, ATTR_ENVIRONMENT, ATTR_HOST_NETWORK, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_STARTUP, STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM, - ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK) + ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_WEBUI) from .util import check_installed from ..dock.addon import DockerAddon from ..tools import write_json_file, read_json_file @@ -27,6 +27,7 @@ from ..tools import write_json_file, read_json_file _LOGGER = logging.getLogger(__name__) RE_VOLUME = re.compile(MAP_VOLUME) +RE_WEBUI = re.compile(r"^(.*\[HOST\]:)\[PORT:(\d+)\](.*)$") class Addon(object): @@ -197,6 +198,25 @@ class Addon(object): self.data.save() + @property + def webui(self): + """Return URL to webui or None.""" + if ATTR_WEBUI not in self._mesh: + return + + webui = self._mesh[ATTR_WEBUI] + dock_port = RE_WEBUI.sub(r"\2", webui) + if self.ports is None: + real_port = dock_port + else: + real_port = self.ports.get("{}/tcp".format(dock_port), dock_port) + + # for interface config or port lists + if isinstance(real_port, (tuple, list)): + real_port = real_port[-1] + + return RE_WEBUI.sub(r"\g<1>{}\g<3>".format(real_port), webui) + @property def network_mode(self): """Return network mode of addon.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 7dd4f4c88..258f55d30 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -10,7 +10,7 @@ from ..const import ( ARCH_AARCH64, ARCH_AMD64, ARCH_I386, ATTR_TMPFS, ATTR_PRIVILEGED, ATTR_USER, ATTR_STATE, ATTR_SYSTEM, STATE_STARTED, STATE_STOPPED, ATTR_LOCATON, ATTR_REPOSITORY, ATTR_TIMEOUT, ATTR_NETWORK, - ATTR_AUTO_UPDATE) + ATTR_AUTO_UPDATE, ATTR_WEBUI) from ..validate import NETWORK_PORT, DOCKER_PORTS @@ -65,6 +65,8 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Required(ATTR_BOOT): vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.Optional(ATTR_PORTS): DOCKER_PORTS, + vol.Optional(ATTR_WEBUI): + vol.Match(r"^(?:https?):\/\/\[HOST\]:\[PORT:\d+\].*$"), vol.Optional(ATTR_HOST_NETWORK, default=False): vol.Boolean(), vol.Optional(ATTR_DEVICES): [vol.Match(r"^(.*):(.*):([rwm]{1,3})$")], vol.Optional(ATTR_TMPFS): diff --git a/hassio/api/addons.py b/hassio/api/addons.py index 23cc405a3..7298f4718 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -11,8 +11,8 @@ from ..const import ( ATTR_URL, ATTR_DESCRIPTON, ATTR_DETACHED, ATTR_NAME, ATTR_REPOSITORY, ATTR_BUILD, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_HOST_NETWORK, ATTR_SLUG, ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER, - ATTR_INSTALLED, ATTR_LOGO, BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG, - CONTENT_TYPE_BINARY) + ATTR_INSTALLED, ATTR_LOGO, ATTR_WEBUI, BOOT_AUTO, BOOT_MANUAL, + CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) from ..validate import DOCKER_PORTS _LOGGER = logging.getLogger(__name__) @@ -109,6 +109,7 @@ class APIAddons(object): ATTR_NETWORK: addon.ports, ATTR_HOST_NETWORK: addon.network_mode == 'host', ATTR_LOGO: addon.with_logo, + ATTR_WEBUI: addon.webui, } @api_process diff --git a/hassio/const.py b/hassio/const.py index 20b4e4953..5cf063dbe 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -66,6 +66,7 @@ ATTR_STARTUP = 'startup' ATTR_BOOT = 'boot' ATTR_PORTS = 'ports' ATTR_MAP = 'map' +ATTR_WEBUI = 'webui' ATTR_OPTIONS = 'options' ATTR_INSTALLED = 'installed' ATTR_DETACHED = 'detached'