mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-04-21 19:57:15 +00:00
92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
"""Fetch last versions from webserver."""
|
|
import asyncio
|
|
from datetime import timedelta
|
|
import json
|
|
import logging
|
|
|
|
import aiohttp
|
|
import async_timeout
|
|
|
|
from .const import (
|
|
URL_HASSIO_VERSION, FILE_HASSIO_UPDATER, ATTR_HOMEASSISTANT, ATTR_HASSIO,
|
|
ATTR_CHANNEL, CHANNEL_STABLE, CHANNEL_BETA, CHANNEL_DEV)
|
|
from .coresys import CoreSysAttributes
|
|
from .utils import AsyncThrottle
|
|
from .utils.json import JsonConfig
|
|
from .validate import SCHEMA_UPDATER_CONFIG
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CHANNEL_TO_BRANCH = {
|
|
CHANNEL_STABLE: 'master',
|
|
CHANNEL_BETA: 'rc',
|
|
CHANNEL_DEV: 'dev',
|
|
}
|
|
|
|
|
|
class Updater(JsonConfig, CoreSysAttributes):
|
|
"""Fetch last versions from version.json."""
|
|
|
|
def __init__(self, coresys):
|
|
"""Initialize updater."""
|
|
super().__init__(FILE_HASSIO_UPDATER, SCHEMA_UPDATER_CONFIG)
|
|
self.coresys = coresys
|
|
|
|
def load(self):
|
|
"""Update internal data.
|
|
|
|
Return a coroutine.
|
|
"""
|
|
return self.reload()
|
|
|
|
@property
|
|
def version_homeassistant(self):
|
|
"""Return last version of homeassistant."""
|
|
return self._data.get(ATTR_HOMEASSISTANT)
|
|
|
|
@property
|
|
def version_hassio(self):
|
|
"""Return last version of hassio."""
|
|
return self._data.get(ATTR_HASSIO)
|
|
|
|
@property
|
|
def channel(self):
|
|
"""Return upstream channel of hassio instance."""
|
|
return self._data[ATTR_CHANNEL]
|
|
|
|
@channel.setter
|
|
def channel(self, value):
|
|
"""Set upstream mode."""
|
|
self._data[ATTR_CHANNEL] = value
|
|
|
|
@AsyncThrottle(timedelta(seconds=60))
|
|
async def reload(self):
|
|
"""Fetch current versions from github.
|
|
|
|
Is a coroutine.
|
|
"""
|
|
url = URL_HASSIO_VERSION.format(CHANNEL_TO_BRANCH[self.channel])
|
|
try:
|
|
_LOGGER.info("Fetch update data from %s", url)
|
|
with async_timeout.timeout(10, loop=self._loop):
|
|
async with self._websession.get(url) as request:
|
|
data = await request.json(content_type=None)
|
|
|
|
except (aiohttp.ClientError, asyncio.TimeoutError, KeyError) as err:
|
|
_LOGGER.warning("Can't fetch versions from %s: %s", url, err)
|
|
return
|
|
|
|
except json.JSONDecodeError as err:
|
|
_LOGGER.warning("Can't parse versions from %s: %s", url, err)
|
|
return
|
|
|
|
# data valid?
|
|
if not data:
|
|
_LOGGER.warning("Invalid data from %s", url)
|
|
return
|
|
|
|
# update versions
|
|
self._data[ATTR_HOMEASSISTANT] = data.get('homeassistant')
|
|
self._data[ATTR_HASSIO] = data.get('hassio')
|
|
self.save_data()
|