diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index b966296bf..3c4e5a2f2 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -29,7 +29,9 @@ from ..tools import write_json_file, read_json_file _LOGGER = logging.getLogger(__name__) -RE_WEBUI = re.compile(r"^(.*\[HOST\]:)\[PORT:(\d+)\](.*)$") +RE_WEBUI = re.compile( + r"^(?:(?Phttps?)|\[PROTO:(?P\w+)\])" + r":\/\/\[HOST\]:\[PORT:(?P\d+)\](?P.*)$") MERGE_OPT = Merger([(dict, ['merge'])], ['override'], ['override']) @@ -207,19 +209,31 @@ class Addon(object): """Return URL to webui or None.""" if ATTR_WEBUI not in self._mesh: return None + webui = RE_WEBUI.match(self._mesh[ATTR_WEBUI]) - webui = self._mesh[ATTR_WEBUI] - dock_port = RE_WEBUI.sub(r"\2", webui) + # extract arguments + t_port = webui.group('t_port') + t_proto = webui.group('t_proto') + s_prefix = webui.group('s_prefix') or "" + s_suffix = webui.group('s_suffix') or "" + + # search host port for this docker port if self.ports is None: - real_port = dock_port + port = self.ports.get("{}/tcp".format(t_port), t_port) else: - real_port = self.ports.get("{}/tcp".format(dock_port), dock_port) + port = t_port # for interface config or port lists - if isinstance(real_port, (tuple, list)): - real_port = real_port[-1] + if isinstance(port, (tuple, list)): + port = port[-1] - return RE_WEBUI.sub(r"\g<1>{}\g<3>".format(real_port), webui) + # lookup the correct protocol from config + if t_proto: + proto = 'https' if self.options[t_proto] else 'http' + else: + proto = s_prefix + + return "{}://[HOST]:{}{}".format(proto, port, s_suffix) @property def host_network(self): diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index aa4ff0879..2ac759e84 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -86,7 +86,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.Optional(ATTR_PORTS): DOCKER_PORTS, vol.Optional(ATTR_WEBUI): - vol.Match(r"^(?:https?):\/\/\[HOST\]:\[PORT:\d+\].*$"), + vol.Match(r"^(?:https?|\[PROTO:\w+\]):\/\/\[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):