From 84d428e7d49ca2570844d42db28ee9f88da11225 Mon Sep 17 00:00:00 2001 From: pvizeli Date: Tue, 4 Apr 2017 10:26:58 +0200 Subject: [PATCH] Protect version controll --- hassio_api/hassio/api/host.py | 3 +++ hassio_api/hassio/api/supervisor.py | 3 +++ hassio_api/hassio/api/util.py | 6 +++++- hassio_api/hassio/config.py | 2 +- hassio_api/hassio/core.py | 1 + hassio_api/hassio/host_controll.py | 1 + 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hassio_api/hassio/api/host.py b/hassio_api/hassio/api/host.py index dc62dfe3d..5fc0c0fa4 100644 --- a/hassio_api/hassio/api/host.py +++ b/hassio_api/hassio/api/host.py @@ -47,4 +47,7 @@ class APIHost(object): body = await request.json(loads=json_loads) version = body.get(ATTR_VERSION) + if version == self.host_controll.version: + raise RuntimeError("%s is already in use.", version) + return await self.host_controll.host_update(version=version) diff --git a/hassio_api/hassio/api/supervisor.py b/hassio_api/hassio/api/supervisor.py index 9118787bf..11cdf656d 100644 --- a/hassio_api/hassio/api/supervisor.py +++ b/hassio_api/hassio/api/supervisor.py @@ -31,4 +31,7 @@ class APISupervisor(object): body = await request.json(loads=json_loads) version = body.get(ATTR_VERSION, self.config.current_hassio) + if version == HASSIO_VERSION: + raise RuntimeError("%s is already in use.", version) + return await self.host_controll.supervisor_update(version=version) diff --git a/hassio_api/hassio/api/util.py b/hassio_api/hassio/api/util.py index c77c5badd..c1225400b 100644 --- a/hassio_api/hassio/api/util.py +++ b/hassio_api/hassio/api/util.py @@ -44,7 +44,11 @@ def api_process_hostcontroll(method): if not api.host_controll.active: raise HTTPServiceUnavailable() - answer = await method(api, *args, **kwargs) + try: + answer = await method(api, *args, **kwargs) + except RuntimeError as err: + return api_return_error(message=str(err)) + if isinstance(answer, dict): return api_return_ok(data=answer) elif answer is None: diff --git a/hassio_api/hassio/config.py b/hassio_api/hassio/config.py index ca5bc3749..1f77d2557 100644 --- a/hassio_api/hassio/config.py +++ b/hassio_api/hassio/config.py @@ -33,10 +33,10 @@ class CoreConfig(object): except OSError: _LOGGER.warning("Can't read %s", self._filename) + # init data if not self._data: self._data.update({ HOMEASSISTANT_IMAGE: os.environ['HOMEASSISTANT_REPOSITORY'], - HOMEASSISTANT_TAG: None, }) def save(self): diff --git a/hassio_api/hassio/core.py b/hassio_api/hassio/core.py index 9f2c95160..f54384744 100644 --- a/hassio_api/hassio/core.py +++ b/hassio_api/hassio/core.py @@ -49,6 +49,7 @@ class HassIO(object): # hostcontroll host_info = await self.host_controll.info() if host_info: + self.host_controll.version = host_info.get('version') _LOGGER.info( "Connected to HostControll. OS: %s Version: %s Hostname: %s " "Feature-lvl: %d", host_info.get('os'), diff --git a/hassio_api/hassio/host_controll.py b/hassio_api/hassio/host_controll.py index b7c710d77..a6674009d 100644 --- a/hassio_api/hassio/host_controll.py +++ b/hassio_api/hassio/host_controll.py @@ -26,6 +26,7 @@ class HostControll(object): """Initialize HostControll socket client.""" self.loop = loop self.active = False + self.version = None mode = os.stat(SOCKET_HC)[stat.ST_MODE] if stat.S_ISSOCK(mode):