From 80763c4bbf74d8640e806c33928a8e8018a6d8d1 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 2 Dec 2020 14:59:42 +0100 Subject: [PATCH] Support OTA url over version files (#2324) * Support OTA url over version files * Fix new schema --- supervisor/const.py | 6 +----- supervisor/hassos.py | 9 ++++++--- supervisor/updater.py | 21 ++++++++++++++------- supervisor/validate.py | 3 +++ 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/supervisor/const.py b/supervisor/const.py index a09eb9166..4c153076b 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -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" diff --git a/supervisor/hassos.py b/supervisor/hassos.py index 2780616a7..3e9503d06 100644 --- a/supervisor/hassos.py +++ b/supervisor/hassos.py @@ -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: diff --git a/supervisor/updater.py b/supervisor/updater.py index 75dbac7e2..eb408b15d 100644 --- a/supervisor/updater.py +++ b/supervisor/updater.py @@ -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"] diff --git a/supervisor/validate.py b/supervisor/validate.py index 48925c6ba..294a6f8ed 100644 --- a/supervisor/validate.py +++ b/supervisor/validate.py @@ -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, )