Support OTA url over version files (#2324)

* Support OTA url over version files

* Fix new schema
This commit is contained in:
Pascal Vizeli 2020-12-02 14:59:42 +01:00 committed by GitHub
parent 59102afd45
commit 80763c4bbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 15 deletions

View File

@ -9,11 +9,6 @@ URL_HASSIO_ADDONS = "https://github.com/home-assistant/addons"
URL_HASSIO_APPARMOR = "https://version.home-assistant.io/apparmor.txt"
URL_HASSIO_VERSION = "https://version.home-assistant.io/{channel}.json"
URL_HASSOS_OTA = (
"https://github.com/home-assistant/operating-system/releases/download/"
"{version}/hassos_{board}-{version}.raucb"
)
SUPERVISOR_DATA = Path("/data")
FILE_HASSIO_ADDONS = Path(SUPERVISOR_DATA, "addons.json")
@ -290,6 +285,7 @@ ATTR_MAC = "mac"
ATTR_FREQUENCY = "frequency"
ATTR_ACCESSPOINTS = "accesspoints"
ATTR_UNHEALTHY = "unhealthy"
ATTR_OTA = "ota"
PROVIDE_SERVICE = "provide"
NEED_SERVICE = "need"

View File

@ -8,7 +8,6 @@ import aiohttp
from cpe import CPE
from packaging.version import parse as pkg_parse
from .const import URL_HASSOS_OTA
from .coresys import CoreSys, CoreSysAttributes
from .dbus.rauc import RaucState
from .exceptions import DBusError, HassOSNotSupportedError, HassOSUpdateError
@ -64,10 +63,14 @@ class HassOS(CoreSysAttributes):
async def _download_raucb(self, version: str) -> Path:
"""Download rauc bundle (OTA) from github."""
url = URL_HASSOS_OTA.format(version=version, board=self.board)
raucb = Path(self.sys_config.path_tmp, f"hassos-{version}.raucb")
raw_url = self.sys_updater.ota_url
if raw_url is None:
_LOGGER.error("Don't have an URL for OTA updates!")
raise HassOSNotSupportedError()
url = raw_url.format(version=version, board=self.board)
_LOGGER.info("Fetch OTA update from %s", url)
raucb = Path(self.sys_config.path_tmp, f"hassos-{version}.raucb")
try:
timeout = aiohttp.ClientTimeout(total=60 * 60, connect=180)
async with self.sys_websession.get(url, timeout=timeout) as request:

View File

@ -18,6 +18,7 @@ from .const import (
ATTR_IMAGE,
ATTR_MULTICAST,
ATTR_OBSERVER,
ATTR_OTA,
ATTR_SUPERVISOR,
FILE_HASSIO_UPDATER,
URL_HASSIO_VERSION,
@ -93,7 +94,7 @@ class Updater(JsonConfig, CoreSysAttributes):
@property
def image_homeassistant(self) -> Optional[str]:
"""Return latest version of Home Assistant."""
"""Return image of Home Assistant docker."""
if ATTR_HOMEASSISTANT not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_HOMEASSISTANT].format(
@ -102,7 +103,7 @@ class Updater(JsonConfig, CoreSysAttributes):
@property
def image_supervisor(self) -> Optional[str]:
"""Return latest version of Supervisor."""
"""Return image of Supervisor docker."""
if ATTR_SUPERVISOR not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_SUPERVISOR].format(
@ -111,28 +112,28 @@ class Updater(JsonConfig, CoreSysAttributes):
@property
def image_cli(self) -> Optional[str]:
"""Return latest version of CLI."""
"""Return image of CLI docker."""
if ATTR_CLI not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_CLI].format(arch=self.sys_arch.supervisor)
@property
def image_dns(self) -> Optional[str]:
"""Return latest version of DNS."""
"""Return image of DNS docker."""
if ATTR_DNS not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_DNS].format(arch=self.sys_arch.supervisor)
@property
def image_audio(self) -> Optional[str]:
"""Return latest version of Audio."""
"""Return image of Audio docker."""
if ATTR_AUDIO not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_AUDIO].format(arch=self.sys_arch.supervisor)
@property
def image_observer(self) -> Optional[str]:
"""Return latest version of Observer."""
"""Return image of Observer docker."""
if ATTR_OBSERVER not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_OBSERVER].format(
@ -141,13 +142,18 @@ class Updater(JsonConfig, CoreSysAttributes):
@property
def image_multicast(self) -> Optional[str]:
"""Return latest version of Multicast."""
"""Return image of Multicast docker."""
if ATTR_MULTICAST not in self._data[ATTR_IMAGE]:
return None
return self._data[ATTR_IMAGE][ATTR_MULTICAST].format(
arch=self.sys_arch.supervisor
)
@property
def ota_url(self) -> Optional[str]:
"""Return OTA url for OS."""
return self._data.get(ATTR_OTA)
@property
def channel(self) -> UpdateChannel:
"""Return upstream channel of Supervisor instance."""
@ -196,6 +202,7 @@ class Updater(JsonConfig, CoreSysAttributes):
# Update HassOS version
if self.sys_hassos.board:
self._data[ATTR_HASSOS] = data["hassos"][self.sys_hassos.board]
self._data[ATTR_OTA] = data["ota"]
# Update Home Assistant plugins
self._data[ATTR_CLI] = data["cli"]

View File

@ -27,6 +27,7 @@ from .const import (
ATTR_LOGGING,
ATTR_MULTICAST,
ATTR_OBSERVER,
ATTR_OTA,
ATTR_PASSWORD,
ATTR_PORT,
ATTR_PORTS,
@ -135,6 +136,7 @@ SCHEMA_HASS_CONFIG = vol.Schema(
)
# pylint: disable=no-value-for-parameter
SCHEMA_UPDATER_CONFIG = vol.Schema(
{
vol.Optional(ATTR_CHANNEL, default=UpdateChannel.STABLE): vol.Coerce(
@ -160,6 +162,7 @@ SCHEMA_UPDATER_CONFIG = vol.Schema(
},
extra=vol.REMOVE_EXTRA,
),
vol.Optional(ATTR_OTA): vol.Url(),
},
extra=vol.REMOVE_EXTRA,
)