diff --git a/hassio/addons/data.py b/hassio/addons/data.py index 3d60bc5c8..77b6ce012 100644 --- a/hassio/addons/data.py +++ b/hassio/addons/data.py @@ -9,7 +9,7 @@ from ..const import ( FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP, ATTR_BOOT, ATTR_MAP_SSL, ATTR_MAP_CONFIG, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER, STARTUP_BEFORE, BOOT_AUTO, - BOOT_MANUAL, DOCKER_REPO, ATTR_INSTALLED, ATTR_SCHEMA) + BOOT_MANUAL, DOCKER_REPO, ATTR_INSTALLED, ATTR_SCHEMA, ATTR_IMAGE) from ..config import Config from ..tools import read_json_file, write_json_file @@ -40,6 +40,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Required(ATTR_SCHEMA): { vol.Any: vol.In([V_STR, V_INT, V_FLOAT, V_BOOL]) }, + vol.Optional(ATTR_IMAGE): vol.Match(r"\w*/\w*"), }) @@ -54,7 +55,12 @@ class AddonsData(Config): def read_addons_repo(self): """Read data from addons repository.""" - pattern = ADDONS_REPO_PATTERN.format(self.config.path_addons_repo) + self._read_addons_folder(self.config.path_addons_repo) + self._read_addons_folder(self.config.path_addons_custom) + + def _read_addons_folder(self, folder): + """Read data from addons folder.""" + pattern = ADDONS_REPO_PATTERN.format(folder) for addon in glob.iglob(pattern): try: @@ -191,6 +197,14 @@ class AddonsData(Config): """Return ports of addon.""" return self._addons_data[addon].get(ATTR_PORTS) + def get_image(self, addon): + """Return image name of addon.""" + if ATTR_IMAGE is not in self._addons_data[addon]: + return "{}/addon_{}".format( + DOCKER_REPO, self.addons_data.get_slug(self.addon)) + + return self._addons_data[addon][ATTR_IMAGE] + def need_config(self, addon): """Return True if config map is needed.""" return self._addons_data[addon][ATTR_MAP_CONFIG] diff --git a/hassio/bootstrap.py b/hassio/bootstrap.py index 779b91b0d..f5be8edea 100644 --- a/hassio/bootstrap.py +++ b/hassio/bootstrap.py @@ -32,6 +32,11 @@ def initialize_system_data(websession): config.path_addons_data) os.mkdir(config.path_addons_data) + if not os.path.isdir(config.path_addons_custom): + _LOGGER.info("Create Home-Assistant addon custom folder %s", + config.path_addons_custom) + os.mkdir(config.path_addons_custom) + return config diff --git a/hassio/config.py b/hassio/config.py index 2bdc61a7f..1f7fd6832 100644 --- a/hassio/config.py +++ b/hassio/config.py @@ -18,6 +18,7 @@ HASSIO_CURRENT = 'hassio_current' ADDONS_REPO = "{}/addons" ADDONS_DATA = "{}/addons_data" +ADDONS_CUSTOM = "{}/addons_custom" UPSTREAM_BETA = 'upstream_beta' @@ -132,6 +133,11 @@ class CoreConfig(Config): """Return git repo path for addons.""" return ADDONS_REPO.format(HASSIO_SHARE) + @property + def path_addons_custom(self): + """Return path for customs addons.""" + return ADDONS_CUSTOM.format(HASSIO_SHARE) + @property def path_addons_data(self): """Return root addon data folder.""" diff --git a/hassio/const.py b/hassio/const.py index 131a64d30..1a35682a3 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -44,6 +44,7 @@ ATTR_OPTIONS = 'options' ATTR_INSTALLED = 'installed' ATTR_STATE = 'state' ATTR_SCHEMA = 'schema' +ATTR_IMAGE = 'image' STARTUP_BEFORE = 'before' STARTUP_AFTER = 'after' diff --git a/hassio/dock/addon.py b/hassio/dock/addon.py index 3afeb2889..ef61fc7e6 100644 --- a/hassio/dock/addon.py +++ b/hassio/dock/addon.py @@ -24,7 +24,7 @@ class DockerAddon(DockerBase): @property def docker_name(self): """Return name of docker container.""" - return "addon_{}".format(self.addons_data.get_slug(self.addon)) + return self.addons_data.get_image(self.addon) def _run(self): """Run docker image.