"""Init file for HassIO addons.""" import logging import glob import json import voluptuous as vol from voluptuous.humanize import humanize_error 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_MAP_DATA, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER, STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, DOCKER_REPO) _LOGGER = logging.getLogger(__name__) ADDONS_REPO_PATTERN = "{}/*/config.json" # pylint: disable=no-value-for-parameter SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Required(ATTR_NAME): vol.Coerce(str), vol.Required(ATTR_VERSION): vol.Coerce(str), vol.Required(ATTR_SLUG): vol.Coerce(str), vol.Required(ATTR_DESCRIPTON): vol.Coerce(str), vol.Required(ATTR_STARTUP): vol.In([STARTUP_BEFORE, STARTUP_AFTER, STARTUP_ONCE]), vol.Required(ATTR_BOOT): vol.IN([BOOT_AUTO, BOOT_MANUAL]), vol.Optional(ATTR_PORTS): dict, vol.Required(ATTR_MAP_CONFIG): vol.Boolean(), vol.Required(ATTR_MAP_SSL): vol.Boolean(), vol.Required(ATTR_OPTIONS): dict, }) class AddonsConfig(Config): """Config for addons inside HassIO.""" def __init__(self, config): """Initialize docker base wrapper.""" super().__init__(FILE_HASSIO_ADDONS) self.config self._addons_data = {} def read_addons_repo(self): """Read data from addons repository.""" pattern = ADDONS_REPO_PATTERN.format(self.config.path_addons_repo) for addon in glob.iglob(pattern): try: with open(addon, 'r') as cfile: addon_config = json.loads(cfile.read()) addon_config = SCHEMA_ADDON_CONFIG(addon_config) self._addons_data[addon_config[ATTR_SLUG]] = addon_config except (OSError, KeyError): _LOGGER.warning("Can't read %s", addon) except vol.Invalid as ex: _LOGGER.warnign("Can't read %s -> %s.", addon, humanize_error(addon_config, ex)) def get_image(self, addon): """Return name of addon docker image.""" return "{}/{}-addon-{}".format( DOCKER_REPO, self.config.hassio_arch, self._addons_data[addon][ATTR_SLUG]) def get_slug(self, addon): """Return slug of addon.""" return self._addons_data[addon][ATTR_SLUG] def get_ports(self, addon): """Return ports of addon.""" return self._addons_data[addon].get(ATTR_PORTS) def need_config(self, addon): """Return True if config map is needed.""" return self._addons_data[addon][ATTR_MAP_CONFIG] def need_ssl(self, addon): """Return True if ssl map is needed.""" return self._addons_data[addon][ATTR_MAP_SSL] def need_data(self, addon): """Return True if data map is needed.""" return self._addons_data[addon][ATTR_MAP_DATA] def path_data(self, addon): """Return addon data path inside supervisor.""" return "{}/{}".format( self.config.path_addons_data, self._addons_data[addon][ATTR_SLUG]) def path_data_docker(self, addon): """Return addon data path external for docker.""" return "{}/{}".format(self.config.path_addons_data_docker, self._addons_data[addon][ATTR_SLUG])