diff --git a/supervisor/homeassistant/__init__.py b/supervisor/homeassistant/__init__.py index e9904dd75..6471186d6 100644 --- a/supervisor/homeassistant/__init__.py +++ b/supervisor/homeassistant/__init__.py @@ -26,10 +26,10 @@ from ..const import ( ) from ..coresys import CoreSys, CoreSysAttributes from ..utils.common import FileConfiguration -from ..validate import SCHEMA_HASS_CONFIG from .api import HomeAssistantAPI from .core import HomeAssistantCore from .secrets import HomeAssistantSecrets +from .validate import SCHEMA_HASS_CONFIG from .websocket import HomeAssistantWebSocket _LOGGER: logging.Logger = logging.getLogger(__name__) diff --git a/supervisor/homeassistant/api.py b/supervisor/homeassistant/api.py index b6afe626a..1713235c3 100644 --- a/supervisor/homeassistant/api.py +++ b/supervisor/homeassistant/api.py @@ -11,7 +11,7 @@ from aiohttp import hdrs from ..coresys import CoreSys, CoreSysAttributes from ..exceptions import HomeAssistantAPIError, HomeAssistantAuthError from ..utils import check_port -from .core import LANDINGPAGE +from .const import LANDINGPAGE _LOGGER: logging.Logger = logging.getLogger(__name__) diff --git a/supervisor/homeassistant/const.py b/supervisor/homeassistant/const.py index faf690726..09318e768 100644 --- a/supervisor/homeassistant/const.py +++ b/supervisor/homeassistant/const.py @@ -1,8 +1,12 @@ """Constants for homeassistant.""" from enum import Enum +from awesomeversion import AwesomeVersion + from ..const import CoreState +LANDINGPAGE: AwesomeVersion = AwesomeVersion("landingpage") + MIN_VERSION = {"supervisor/event": "2021.2.4"} CLOSING_STATES = [ diff --git a/supervisor/homeassistant/core.py b/supervisor/homeassistant/core.py index 74d65c9a7..7994f1841 100644 --- a/supervisor/homeassistant/core.py +++ b/supervisor/homeassistant/core.py @@ -25,13 +25,12 @@ from ..exceptions import ( from ..jobs.decorator import Job, JobCondition from ..resolution.const import ContextType, IssueType from ..utils import convert_to_ascii, process_lock +from .const import LANDINGPAGE _LOGGER: logging.Logger = logging.getLogger(__name__) RE_YAML_ERROR = re.compile(r"homeassistant\.util\.yaml") -LANDINGPAGE: AwesomeVersion = AwesomeVersion("landingpage") - @attr.s(frozen=True) class ConfigResult: @@ -88,6 +87,18 @@ class HomeAssistantCore(CoreSysAttributes): @process_lock async def install_landingpage(self) -> None: """Install a landing page.""" + # Try to use a preinstalled landingpage + try: + await self.instance.attach(version=LANDINGPAGE) + except DockerError: + pass + else: + _LOGGER.info("Using preinstalled landingpage") + self.sys_homeassistant.version = LANDINGPAGE + self.sys_homeassistant.image = self.instance.image + self.sys_homeassistant.save_data() + return + _LOGGER.info("Setting up Home Assistant landingpage") while True: if not self.sys_updater.image_homeassistant: @@ -108,7 +119,7 @@ class HomeAssistantCore(CoreSysAttributes): except Exception as err: # pylint: disable=broad-except self.sys_capture_exception(err) else: - self.sys_homeassistant.version = self.instance.version + self.sys_homeassistant.version = LANDINGPAGE self.sys_homeassistant.image = self.sys_updater.image_homeassistant self.sys_homeassistant.save_data() break diff --git a/supervisor/homeassistant/validate.py b/supervisor/homeassistant/validate.py new file mode 100644 index 000000000..2fff91ced --- /dev/null +++ b/supervisor/homeassistant/validate.py @@ -0,0 +1,41 @@ +"""Validate functions.""" +import uuid + +import voluptuous as vol + +from ..const import ( + ATTR_ACCESS_TOKEN, + ATTR_AUDIO_INPUT, + ATTR_AUDIO_OUTPUT, + ATTR_BOOT, + ATTR_IMAGE, + ATTR_PORT, + ATTR_REFRESH_TOKEN, + ATTR_SSL, + ATTR_UUID, + ATTR_VERSION, + ATTR_WAIT_BOOT, + ATTR_WATCHDOG, +) +from ..validate import docker_image, network_port, token, uuid_match, version_tag + +# pylint: disable=no-value-for-parameter +SCHEMA_HASS_CONFIG = vol.Schema( + { + vol.Optional(ATTR_UUID, default=lambda: uuid.uuid4().hex): uuid_match, + vol.Optional(ATTR_VERSION): version_tag, + vol.Optional(ATTR_IMAGE): docker_image, + vol.Optional(ATTR_ACCESS_TOKEN): token, + vol.Optional(ATTR_BOOT, default=True): vol.Boolean(), + vol.Optional(ATTR_PORT, default=8123): network_port, + vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)), + vol.Optional(ATTR_SSL, default=False): vol.Boolean(), + vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(), + vol.Optional(ATTR_WAIT_BOOT, default=600): vol.All( + vol.Coerce(int), vol.Range(min=60) + ), + vol.Optional(ATTR_AUDIO_OUTPUT, default=None): vol.Maybe(vol.Coerce(str)), + vol.Optional(ATTR_AUDIO_INPUT, default=None): vol.Maybe(vol.Coerce(str)), + }, + extra=vol.REMOVE_EXTRA, +) diff --git a/supervisor/validate.py b/supervisor/validate.py index 2afba574e..f25fc4843 100644 --- a/supervisor/validate.py +++ b/supervisor/validate.py @@ -2,18 +2,13 @@ import ipaddress import re from typing import Optional, Union -import uuid from awesomeversion import AwesomeVersion import voluptuous as vol from .const import ( - ATTR_ACCESS_TOKEN, ATTR_ADDONS_CUSTOM_LIST, ATTR_AUDIO, - ATTR_AUDIO_INPUT, - ATTR_AUDIO_OUTPUT, - ATTR_BOOT, ATTR_CHANNEL, ATTR_CLI, ATTR_DEBUG, @@ -29,19 +24,14 @@ from .const import ( ATTR_OBSERVER, ATTR_OTA, ATTR_PASSWORD, - ATTR_PORT, ATTR_PORTS, - ATTR_REFRESH_TOKEN, ATTR_REGISTRIES, ATTR_SESSION, - ATTR_SSL, ATTR_SUPERVISOR, ATTR_TIMEZONE, ATTR_USERNAME, - ATTR_UUID, ATTR_VERSION, ATTR_WAIT_BOOT, - ATTR_WATCHDOG, SUPERVISOR_VERSION, LogLevel, UpdateChannel, @@ -108,28 +98,6 @@ docker_ports = vol.Schema({docker_port: vol.Maybe(network_port)}) docker_ports_description = vol.Schema({docker_port: vol.Coerce(str)}) -# pylint: disable=no-value-for-parameter -SCHEMA_HASS_CONFIG = vol.Schema( - { - vol.Optional(ATTR_UUID, default=lambda: uuid.uuid4().hex): uuid_match, - vol.Optional(ATTR_VERSION): version_tag, - vol.Optional(ATTR_IMAGE): docker_image, - vol.Optional(ATTR_ACCESS_TOKEN): token, - vol.Optional(ATTR_BOOT, default=True): vol.Boolean(), - vol.Optional(ATTR_PORT, default=8123): network_port, - vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)), - vol.Optional(ATTR_SSL, default=False): vol.Boolean(), - vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(), - vol.Optional(ATTR_WAIT_BOOT, default=600): vol.All( - vol.Coerce(int), vol.Range(min=60) - ), - vol.Optional(ATTR_AUDIO_OUTPUT, default=None): vol.Maybe(vol.Coerce(str)), - vol.Optional(ATTR_AUDIO_INPUT, default=None): vol.Maybe(vol.Coerce(str)), - }, - extra=vol.REMOVE_EXTRA, -) - - # pylint: disable=no-value-for-parameter SCHEMA_UPDATER_CONFIG = vol.Schema( {