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 ..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__)

View File

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

View File

@ -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 = [

View File

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

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 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(
{