mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-09 10:59:43 +00:00
99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
"""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])
|