mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-18 22:56:31 +00:00
parent
34c4acf199
commit
ebcc21370e
@ -3,18 +3,20 @@ import copy
|
|||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
from pathlib import Path, PurePath
|
from pathlib import Path, PurePath
|
||||||
|
import re
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
from voluptuous.humanize import humanize_error
|
from voluptuous.humanize import humanize_error
|
||||||
|
|
||||||
from .util import extract_hash_from_path
|
from .util import extract_hash_from_path
|
||||||
from .validate import (
|
from .validate import (
|
||||||
validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG)
|
validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG,
|
||||||
|
MAP_VOLUME)
|
||||||
from ..const import (
|
from ..const import (
|
||||||
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
|
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
|
||||||
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO,
|
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO,
|
||||||
ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP,
|
ATTR_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH,
|
||||||
ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES)
|
ATTR_LOCATON, ATTR_DEVICES)
|
||||||
from ..config import Config
|
from ..config import Config
|
||||||
from ..tools import read_json_file, write_json_file
|
from ..tools import read_json_file, write_json_file
|
||||||
|
|
||||||
@ -26,6 +28,8 @@ USER = 'user'
|
|||||||
REPOSITORY_CORE = 'core'
|
REPOSITORY_CORE = 'core'
|
||||||
REPOSITORY_LOCAL = 'local'
|
REPOSITORY_LOCAL = 'local'
|
||||||
|
|
||||||
|
RE_VOLUME = re.compile(MAP_VOLUME)
|
||||||
|
|
||||||
|
|
||||||
class AddonsData(Config):
|
class AddonsData(Config):
|
||||||
"""Hold data for addons inside HassIO."""
|
"""Hold data for addons inside HassIO."""
|
||||||
@ -327,21 +331,14 @@ class AddonsData(Config):
|
|||||||
)
|
)
|
||||||
return ATTR_IMAGE not in addon_data
|
return ATTR_IMAGE not in addon_data
|
||||||
|
|
||||||
def map_config(self, addon):
|
def map_volumes(self, addon):
|
||||||
"""Return True if config map is needed."""
|
"""Return a dict of {volume: policy} from addon."""
|
||||||
return MAP_CONFIG in self._system_data[addon][ATTR_MAP]
|
volumes = {}
|
||||||
|
for volume in self._system_data[addon][ATTR_MAP]:
|
||||||
|
result = RE_VOLUME.match(volume)
|
||||||
|
volumes[result.group(1)] = result.group(2) or 'ro'
|
||||||
|
|
||||||
def map_ssl(self, addon):
|
return volumes
|
||||||
"""Return True if ssl map is needed."""
|
|
||||||
return MAP_SSL in self._system_data[addon][ATTR_MAP]
|
|
||||||
|
|
||||||
def map_addons(self, addon):
|
|
||||||
"""Return True if addons map is needed."""
|
|
||||||
return MAP_ADDONS in self._system_data[addon][ATTR_MAP]
|
|
||||||
|
|
||||||
def map_backup(self, addon):
|
|
||||||
"""Return True if backup map is needed."""
|
|
||||||
return MAP_BACKUP in self._system_data[addon][ATTR_MAP]
|
|
||||||
|
|
||||||
def path_data(self, addon):
|
def path_data(self, addon):
|
||||||
"""Return addon data path inside supervisor."""
|
"""Return addon data path inside supervisor."""
|
||||||
|
@ -4,9 +4,12 @@ import voluptuous as vol
|
|||||||
from ..const import (
|
from ..const import (
|
||||||
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP,
|
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP,
|
||||||
ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER,
|
ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER,
|
||||||
STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, MAP_SSL,
|
STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE,
|
||||||
MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH,
|
ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH, ATTR_DEVICES, ARCH_ARMHF,
|
||||||
ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386, ATTR_DEVICES)
|
ARCH_AARCH64, ARCH_AMD64, ARCH_I386)
|
||||||
|
|
||||||
|
|
||||||
|
MAP_VOLUME = r"^(config|ssl|addons|backup)(:rw|:ro)?$"
|
||||||
|
|
||||||
V_STR = 'str'
|
V_STR = 'str'
|
||||||
V_INT = 'int'
|
V_INT = 'int'
|
||||||
@ -35,9 +38,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({
|
|||||||
vol.In([BOOT_AUTO, BOOT_MANUAL]),
|
vol.In([BOOT_AUTO, BOOT_MANUAL]),
|
||||||
vol.Optional(ATTR_PORTS): dict,
|
vol.Optional(ATTR_PORTS): dict,
|
||||||
vol.Optional(ATTR_DEVICES): [vol.Match(r"(.*):(.*):(rwm|rw|rm)")],
|
vol.Optional(ATTR_DEVICES): [vol.Match(r"(.*):(.*):(rwm|rw|rm)")],
|
||||||
vol.Optional(ATTR_MAP, default=[]): [
|
vol.Optional(ATTR_MAP, default=[]): [vol.Match(MAP_VOLUME)],
|
||||||
vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP])
|
|
||||||
],
|
|
||||||
vol.Required(ATTR_OPTIONS): dict,
|
vol.Required(ATTR_OPTIONS): dict,
|
||||||
vol.Required(ATTR_SCHEMA): {
|
vol.Required(ATTR_SCHEMA): {
|
||||||
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [
|
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [
|
||||||
|
@ -7,7 +7,7 @@ import docker
|
|||||||
|
|
||||||
from . import DockerBase
|
from . import DockerBase
|
||||||
from .util import dockerfile_template
|
from .util import dockerfile_template
|
||||||
from ..const import META_ADDON
|
from ..const import META_ADDON, MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -35,28 +35,30 @@ class DockerAddon(DockerBase):
|
|||||||
'bind': '/data', 'mode': 'rw'
|
'bind': '/data', 'mode': 'rw'
|
||||||
}}
|
}}
|
||||||
|
|
||||||
if self.addons_data.map_config(self.addon):
|
addon_mapping = self.addons_data.map_volumes(self.addon)
|
||||||
|
|
||||||
|
if MAP_CONFIG in addon_mapping:
|
||||||
volumes.update({
|
volumes.update({
|
||||||
str(self.config.path_extern_config): {
|
str(self.config.path_extern_config): {
|
||||||
'bind': '/config', 'mode': 'rw'
|
'bind': '/config', 'mode': addon_mapping[MAP_CONFIG]
|
||||||
}})
|
}})
|
||||||
|
|
||||||
if self.addons_data.map_ssl(self.addon):
|
if MAP_SSL in addon_mapping:
|
||||||
volumes.update({
|
volumes.update({
|
||||||
str(self.config.path_extern_ssl): {
|
str(self.config.path_extern_ssl): {
|
||||||
'bind': '/ssl', 'mode': 'rw'
|
'bind': '/ssl', 'mode': addon_mapping[MAP_SSL]
|
||||||
}})
|
}})
|
||||||
|
|
||||||
if self.addons_data.map_addons(self.addon):
|
if MAP_ADDONS in addon_mapping:
|
||||||
volumes.update({
|
volumes.update({
|
||||||
str(self.config.path_extern_addons_local): {
|
str(self.config.path_extern_addons_local): {
|
||||||
'bind': '/addons', 'mode': 'rw'
|
'bind': '/addons', 'mode': addon_mapping[MAP_ADDONS]
|
||||||
}})
|
}})
|
||||||
|
|
||||||
if self.addons_data.map_backup(self.addon):
|
if MAP_BACKUP in addon_mapping:
|
||||||
volumes.update({
|
volumes.update({
|
||||||
str(self.config.path_extern_backup): {
|
str(self.config.path_extern_backup): {
|
||||||
'bind': '/backup', 'mode': 'rw'
|
'bind': '/backup', 'mode': addon_mapping[MAP_BACKUP]
|
||||||
}})
|
}})
|
||||||
|
|
||||||
return volumes
|
return volumes
|
||||||
|
Loading…
x
Reference in New Issue
Block a user