Fix landingpage on first boot (#2713)

This commit is contained in:
Pascal Vizeli 2021-03-12 10:47:04 +01:00 committed by GitHub
parent 85a66c663c
commit a52713611c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 61 additions and 37 deletions

View File

@ -26,10 +26,10 @@ from ..const import (
) )
from ..coresys import CoreSys, CoreSysAttributes from ..coresys import CoreSys, CoreSysAttributes
from ..utils.common import FileConfiguration from ..utils.common import FileConfiguration
from ..validate import SCHEMA_HASS_CONFIG
from .api import HomeAssistantAPI from .api import HomeAssistantAPI
from .core import HomeAssistantCore from .core import HomeAssistantCore
from .secrets import HomeAssistantSecrets from .secrets import HomeAssistantSecrets
from .validate import SCHEMA_HASS_CONFIG
from .websocket import HomeAssistantWebSocket from .websocket import HomeAssistantWebSocket
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)

View File

@ -11,7 +11,7 @@ from aiohttp import hdrs
from ..coresys import CoreSys, CoreSysAttributes from ..coresys import CoreSys, CoreSysAttributes
from ..exceptions import HomeAssistantAPIError, HomeAssistantAuthError from ..exceptions import HomeAssistantAPIError, HomeAssistantAuthError
from ..utils import check_port from ..utils import check_port
from .core import LANDINGPAGE from .const import LANDINGPAGE
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)

View File

@ -1,8 +1,12 @@
"""Constants for homeassistant.""" """Constants for homeassistant."""
from enum import Enum from enum import Enum
from awesomeversion import AwesomeVersion
from ..const import CoreState from ..const import CoreState
LANDINGPAGE: AwesomeVersion = AwesomeVersion("landingpage")
MIN_VERSION = {"supervisor/event": "2021.2.4"} MIN_VERSION = {"supervisor/event": "2021.2.4"}
CLOSING_STATES = [ CLOSING_STATES = [

View File

@ -25,13 +25,12 @@ from ..exceptions import (
from ..jobs.decorator import Job, JobCondition from ..jobs.decorator import Job, JobCondition
from ..resolution.const import ContextType, IssueType from ..resolution.const import ContextType, IssueType
from ..utils import convert_to_ascii, process_lock from ..utils import convert_to_ascii, process_lock
from .const import LANDINGPAGE
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
RE_YAML_ERROR = re.compile(r"homeassistant\.util\.yaml") RE_YAML_ERROR = re.compile(r"homeassistant\.util\.yaml")
LANDINGPAGE: AwesomeVersion = AwesomeVersion("landingpage")
@attr.s(frozen=True) @attr.s(frozen=True)
class ConfigResult: class ConfigResult:
@ -88,6 +87,18 @@ class HomeAssistantCore(CoreSysAttributes):
@process_lock @process_lock
async def install_landingpage(self) -> None: async def install_landingpage(self) -> None:
"""Install a landing page.""" """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") _LOGGER.info("Setting up Home Assistant landingpage")
while True: while True:
if not self.sys_updater.image_homeassistant: if not self.sys_updater.image_homeassistant:
@ -108,7 +119,7 @@ class HomeAssistantCore(CoreSysAttributes):
except Exception as err: # pylint: disable=broad-except except Exception as err: # pylint: disable=broad-except
self.sys_capture_exception(err) self.sys_capture_exception(err)
else: 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.image = self.sys_updater.image_homeassistant
self.sys_homeassistant.save_data() self.sys_homeassistant.save_data()
break break

View File

@ -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,
)

View File

@ -2,18 +2,13 @@
import ipaddress import ipaddress
import re import re
from typing import Optional, Union from typing import Optional, Union
import uuid
from awesomeversion import AwesomeVersion from awesomeversion import AwesomeVersion
import voluptuous as vol import voluptuous as vol
from .const import ( from .const import (
ATTR_ACCESS_TOKEN,
ATTR_ADDONS_CUSTOM_LIST, ATTR_ADDONS_CUSTOM_LIST,
ATTR_AUDIO, ATTR_AUDIO,
ATTR_AUDIO_INPUT,
ATTR_AUDIO_OUTPUT,
ATTR_BOOT,
ATTR_CHANNEL, ATTR_CHANNEL,
ATTR_CLI, ATTR_CLI,
ATTR_DEBUG, ATTR_DEBUG,
@ -29,19 +24,14 @@ from .const import (
ATTR_OBSERVER, ATTR_OBSERVER,
ATTR_OTA, ATTR_OTA,
ATTR_PASSWORD, ATTR_PASSWORD,
ATTR_PORT,
ATTR_PORTS, ATTR_PORTS,
ATTR_REFRESH_TOKEN,
ATTR_REGISTRIES, ATTR_REGISTRIES,
ATTR_SESSION, ATTR_SESSION,
ATTR_SSL,
ATTR_SUPERVISOR, ATTR_SUPERVISOR,
ATTR_TIMEZONE, ATTR_TIMEZONE,
ATTR_USERNAME, ATTR_USERNAME,
ATTR_UUID,
ATTR_VERSION, ATTR_VERSION,
ATTR_WAIT_BOOT, ATTR_WAIT_BOOT,
ATTR_WATCHDOG,
SUPERVISOR_VERSION, SUPERVISOR_VERSION,
LogLevel, LogLevel,
UpdateChannel, 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)}) 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 # pylint: disable=no-value-for-parameter
SCHEMA_UPDATER_CONFIG = vol.Schema( SCHEMA_UPDATER_CONFIG = vol.Schema(
{ {