diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..aba78f6b5
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "home-assistant-polymer"]
+ path = home-assistant-polymer
+ url = https://github.com/home-assistant/home-assistant-polymer
diff --git a/hassio/addons/data.py b/hassio/addons/data.py
index fe88551a0..e4eae0a95 100644
--- a/hassio/addons/data.py
+++ b/hassio/addons/data.py
@@ -13,8 +13,8 @@ from .validate import (
from ..const import (
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO,
- DOCKER_REPO, ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS,
- MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, ATTR_LOCATON)
+ ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP,
+ ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, ATTR_LOCATON)
from ..config import Config
from ..tools import read_json_file, write_json_file
@@ -308,28 +308,20 @@ class AddonsData(Config):
addon, self._addons_cache.get(addon)
)
- # core repository
- if addon_data[ATTR_REPOSITORY] == REPOSITORY_CORE:
- return "{}/{}-addon-{}".format(
- DOCKER_REPO, self.arch, addon_data[ATTR_SLUG])
-
# Repository with dockerhub images
if ATTR_IMAGE in addon_data:
return addon_data[ATTR_IMAGE].format(arch=self.arch)
- # Local build addon
- if addon_data[ATTR_REPOSITORY] == REPOSITORY_LOCAL:
- return "local/{}-addon-{}".format(self.arch, addon_data[ATTR_SLUG])
-
- _LOGGER.error("No image for %s", addon)
+ # local build
+ return "{}/{}-addon-{}".format(
+ addon_data[ATTR_REPOSITORY], self.arch, addon_data[ATTR_SLUG])
def need_build(self, addon):
- """Return True if this addon need a local build."""
+ """Return True if this addon need a local build."""
addon_data = self._system_data.get(
addon, self._addons_cache.get(addon)
)
- return addon_data[ATTR_REPOSITORY] == REPOSITORY_LOCAL \
- and not addon_data.get(ATTR_IMAGE)
+ return ATTR_IMAGE not in addon_data
def map_config(self, addon):
"""Return True if config map is needed."""
diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py
index a2d20b1f3..e3dcb40b4 100644
--- a/hassio/addons/validate.py
+++ b/hassio/addons/validate.py
@@ -70,10 +70,10 @@ def validate_options(raw_schema):
try:
if isinstance(typ, list):
# nested value
- options[key] = _nested_validate(typ[0], value)
+ options[key] = _nested_validate(typ[0], value, key)
else:
# normal value
- options[key] = _single_validate(typ, value)
+ options[key] = _single_validate(typ, value, key)
except (IndexError, KeyError):
raise vol.Invalid(
"Type error for {}.".format(key)) from None
@@ -84,12 +84,12 @@ def validate_options(raw_schema):
# pylint: disable=no-value-for-parameter
-def _single_validate(typ, value):
+def _single_validate(typ, value, key):
"""Validate a single element."""
try:
# if required argument
if value is None:
- raise vol.Invalid("A required argument is not set!")
+ raise vol.Invalid("Missing required option '{}'.".format(key))
if typ == V_STR:
return str(value)
@@ -104,13 +104,13 @@ def _single_validate(typ, value):
elif typ == V_URL:
return vol.Url()(value)
- raise vol.Invalid("Fatal error for {}.".format(value))
+ raise vol.Invalid("Fatal error for {} type {}.".format(key, typ))
except ValueError:
raise vol.Invalid(
- "Type {} error for {}.".format(typ, value)) from None
+ "Type {} error for '{}' on {}.".format(typ, value, key)) from None
-def _nested_validate(typ, data_list):
+def _nested_validate(typ, data_list, key):
"""Validate nested items."""
options = []
@@ -123,10 +123,10 @@ def _nested_validate(typ, data_list):
raise vol.Invalid(
"Unknown nested options {}.".format(c_key))
- c_options[c_key] = _single_validate(typ[c_key], c_value)
+ c_options[c_key] = _single_validate(typ[c_key], c_value, c_key)
options.append(c_options)
# normal list
else:
- options.append(_single_validate(typ, element))
+ options.append(_single_validate(typ, element, key))
return options
diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py
index c037ee53c..44a656a69 100644
--- a/hassio/api/__init__.py
+++ b/hassio/api/__init__.py
@@ -1,5 +1,6 @@
"""Init file for HassIO rest api."""
import logging
+from pathlib import Path
from aiohttp import web
@@ -96,6 +97,13 @@ class RestAPI(object):
self.webapp.router.add_post('/security/totp', api_security.totp)
self.webapp.router.add_post('/security/session', api_security.session)
+ def register_panel(self):
+ """Register panel for homeassistant."""
+ panel_dir = Path(__file__).parents[1].joinpath('panel')
+
+ self.webapp.router.register_resource(
+ web.StaticResource('/panel', str(panel_dir)))
+
async def start(self):
"""Run rest api webserver."""
self._handler = self.webapp.make_handler(loop=self.loop)
diff --git a/hassio/const.py b/hassio/const.py
index 08623b146..51747567e 100644
--- a/hassio/const.py
+++ b/hassio/const.py
@@ -1,7 +1,7 @@
"""Const file for HassIO."""
from pathlib import Path
-HASSIO_VERSION = '0.25'
+HASSIO_VERSION = '0.26'
URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/'
'hassio/master/version.json')
@@ -10,8 +10,6 @@ URL_HASSIO_VERSION_BETA = ('https://raw.githubusercontent.com/home-assistant/'
URL_HASSIO_ADDONS = 'https://github.com/home-assistant/hassio-addons'
-DOCKER_REPO = "homeassistant"
-
HASSIO_SHARE = Path("/data")
RUN_UPDATE_INFO_TASKS = 28800
diff --git a/hassio/core.py b/hassio/core.py
index cbcb4cc46..99a0b4df2 100644
--- a/hassio/core.py
+++ b/hassio/core.py
@@ -74,6 +74,7 @@ class HassIO(object):
self.api.register_homeassistant(self.homeassistant)
self.api.register_addons(self.addons)
self.api.register_security()
+ self.api.register_panel()
# schedule api session cleanup
self.scheduler.register_task(
diff --git a/hassio/dock/__init__.py b/hassio/dock/__init__.py
index c78b32826..ac585ea75 100644
--- a/hassio/dock/__init__.py
+++ b/hassio/dock/__init__.py
@@ -51,13 +51,13 @@ class DockerBase(object):
_LOGGER.info("Pull image %s tag %s.", self.image, tag)
image = self.dock.images.pull("{}:{}".format(self.image, tag))
+ self.version = tag
image.tag(self.image, tag='latest')
- self.version = get_version_from_env(image.attrs['Config']['Env'])
- _LOGGER.info("Tag image %s with version %s as latest",
- self.image, self.version)
except docker.errors.APIError as err:
_LOGGER.error("Can't install %s:%s -> %s.", self.image, tag, err)
return False
+
+ _LOGGER.info("Tag image %s with version %s as latest", self.image, tag)
return True
def exists(self):
diff --git a/hassio/dock/addon.py b/hassio/dock/addon.py
index 88ace43d7..8a32569ab 100644
--- a/hassio/dock/addon.py
+++ b/hassio/dock/addon.py
@@ -159,12 +159,14 @@ class DockerAddon(DockerBase):
image = self.dock.images.build(
path=str(build_dir), tag=build_tag, pull=True)
- _LOGGER.info("Build %s done", build_tag)
+ self.version = tag
image.tag(self.image, tag='latest')
+
except (docker.errors.DockerException, TypeError) as err:
_LOGGER.error("Can't build %s -> %s", build_tag, err)
return False
+ _LOGGER.info("Build %s done", build_tag)
return True
finally:
diff --git a/hassio/panel/hassio-main.html b/hassio/panel/hassio-main.html
new file mode 100644
index 000000000..b366d109c
--- /dev/null
+++ b/hassio/panel/hassio-main.html
@@ -0,0 +1,20 @@
+
![]()
Hostname | [[data.hostname]] |
Type | [[data.type]] |
OS | [[data.os]] |
Host Control version | [[data.version]] |
Latest available version | [[data.last_version]] |
Error: [[errors]]
UpdateReboot
Current version | [[data.version]] |
Latest version | [[data.last_version]] |
Error: [[errors]]
UpdateRestart
Version | [[data.version]] |
Beta channel | [[data.beta_channel]] |
Latest available version | [[data.last_version]] |
Error: [[errors]]
[[addon.name]]
[[addon.description]]
[[addon.installed]]Hass.io
[[addonInfo.description]]
Installed | [[computeInstallStatus(addonInfo)]] |
Version | [[addonInfo.version]] |
Detached | [[addonInfo.detached]] |
Install
Version | [[addonState.version]] |
State | [[addonState.state]] |
Boot | [[addonState.boot]] |
StartRestartStopUpdateUninstall
[[addonInfo.name]]
Configure which add-on repositories to fetch data from. One repository per line.
Save
Maintained by [[repo.maintainer]].Visit repository website. [[addon.name]]
[[addon.description]]
[[computeInstallStatus(addon)]]Hass.io Add-Ons
Supervisor Logs
[[logs]]
\ No newline at end of file
diff --git a/hassio/panel/hassio-main.html.gz b/hassio/panel/hassio-main.html.gz
new file mode 100644
index 000000000..4e830f571
Binary files /dev/null and b/hassio/panel/hassio-main.html.gz differ
diff --git a/home-assistant-polymer b/home-assistant-polymer
new file mode 160000
index 000000000..a341ccf94
--- /dev/null
+++ b/home-assistant-polymer
@@ -0,0 +1 @@
+Subproject commit a341ccf9440fc2028dff54d569e7f5897bf42b2f
diff --git a/version.json b/version.json
index 7e76528f7..51cc05976 100644
--- a/version.json
+++ b/version.json
@@ -1,5 +1,5 @@
{
- "hassio": "0.25",
+ "hassio": "0.26",
"homeassistant": "0.44.2",
"resinos": "0.7",
"resinhup": "0.1",