diff --git a/API.md b/API.md index e2c915414..4d6206e92 100644 --- a/API.md +++ b/API.md @@ -355,7 +355,8 @@ Get all available addons. "logo": "bool", "audio": "bool", "gpio": "bool", - "hassio_api": "bool" + "hassio_api": "bool", + "homeassistant_api": "bool" } ], "repositories": [ @@ -393,6 +394,7 @@ Get all available addons. "devices": ["/dev/xy"], "logo": "bool", "hassio_api": "bool", + "homeassistant_api": "bool", "webui": "null|http(s)://[HOST]:port/xy/zx", "gpio": "bool", "audio": "bool", diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 3c4e5a2f2..be6044e7d 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -22,7 +22,7 @@ from ..const import ( STATE_STARTED, STATE_STOPPED, STATE_NONE, ATTR_USER, ATTR_SYSTEM, ATTR_STATE, ATTR_TIMEOUT, ATTR_AUTO_UPDATE, ATTR_NETWORK, ATTR_WEBUI, ATTR_HASSIO_API, ATTR_AUDIO, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT, - ATTR_GPIO) + ATTR_GPIO, ATTR_HOMEASSISTANT_API) from .util import check_installed from ..dock.addon import DockerAddon from ..tools import write_json_file, read_json_file @@ -261,10 +261,15 @@ class Addon(object): return self._mesh.get(ATTR_PRIVILEGED) @property - def use_hassio_api(self): + def access_hassio_api(self): """Return True if the add-on access to hassio api.""" return self._mesh[ATTR_HASSIO_API] + @property + def access_homeassistant_api(self): + """Return True if the add-on access to Home-Assistant api proxy.""" + return self._mesh[ATTR_HOMEASSISTANT_API] + @property def with_gpio(self): """Return True if the add-on access to gpio interface.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 02d8741cd..56abfe4a7 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -14,7 +14,7 @@ from ..const import ( ATTR_LOCATON, ATTR_REPOSITORY, ATTR_TIMEOUT, ATTR_NETWORK, ATTR_AUTO_UPDATE, ATTR_WEBUI, ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API, ATTR_BUILD_FROM, ATTR_SQUASH, - ATTR_ARGS, ATTR_GPIO) + ATTR_ARGS, ATTR_GPIO, ATTR_HOMEASSISTANT_API) from ..validate import NETWORK_PORT, DOCKER_PORTS, ALSA_CHANNEL @@ -97,6 +97,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Optional(ATTR_AUDIO, default=False): vol.Boolean(), vol.Optional(ATTR_GPIO, default=False): vol.Boolean(), vol.Optional(ATTR_HASSIO_API, default=False): vol.Boolean(), + vol.Optional(ATTR_HOMEASSISTANT_API, default=False): vol.Boolean(), vol.Required(ATTR_OPTIONS): dict, vol.Required(ATTR_SCHEMA): vol.Any(vol.Schema({ vol.Coerce(str): vol.Any(SCHEMA_ELEMENT, [ diff --git a/hassio/api/addons.py b/hassio/api/addons.py index 62b5d35d7..7126b66f6 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -13,7 +13,8 @@ from ..const import ( ATTR_SOURCE, ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_ARCH, ATTR_MAINTAINER, ATTR_INSTALLED, ATTR_LOGO, ATTR_WEBUI, ATTR_DEVICES, ATTR_PRIVILEGED, ATTR_AUDIO, ATTR_AUDIO_INPUT, ATTR_AUDIO_OUTPUT, ATTR_HASSIO_API, - ATTR_GPIO, BOOT_AUTO, BOOT_MANUAL, CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) + ATTR_GPIO, ATTR_HOMEASSISTANT_API, BOOT_AUTO, BOOT_MANUAL, + CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY) from ..validate import DOCKER_PORTS _LOGGER = logging.getLogger(__name__) @@ -77,7 +78,8 @@ class APIAddons(object): ATTR_DEVICES: self._pretty_devices(addon), ATTR_URL: addon.url, ATTR_LOGO: addon.with_logo, - ATTR_HASSIO_API: addon.use_hassio_api, + ATTR_HASSIO_API: addon.access_hassio_api, + ATTR_HOMEASSISTANT_API: addon.access_homeassistant_api, ATTR_AUDIO: addon.with_audio, ATTR_GPIO: addon.with_gpio, }) @@ -127,7 +129,8 @@ class APIAddons(object): ATTR_DEVICES: self._pretty_devices(addon), ATTR_LOGO: addon.with_logo, ATTR_WEBUI: addon.webui, - ATTR_HASSIO_API: addon.use_hassio_api, + ATTR_HASSIO_API: addon.access_hassio_api, + ATTR_HOMEASSISTANT_API: addon.access_homeassistant_api, ATTR_GPIO: addon.with_gpio, ATTR_AUDIO: addon.with_audio, ATTR_AUDIO_INPUT: addon.audio_input, diff --git a/hassio/const.py b/hassio/const.py index 0cd56fee8..e50f1209d 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -110,6 +110,7 @@ ATTR_SNAPSHOTS = 'snapshots' ATTR_HOMEASSISTANT = 'homeassistant' ATTR_HASSIO = 'hassio' ATTR_HASSIO_API = 'hassio_api' +ATTR_HOMEASSISTANT_API = 'homeassistant_api' ATTR_FOLDERS = 'folders' ATTR_SIZE = 'size' ATTR_TYPE = 'type' diff --git a/hassio/snapshots/snapshot.py b/hassio/snapshots/snapshot.py index 41a03a8f3..cc006aad6 100644 --- a/hassio/snapshots/snapshot.py +++ b/hassio/snapshots/snapshot.py @@ -14,7 +14,7 @@ from .util import remove_folder from ..const import ( ATTR_SLUG, ATTR_NAME, ATTR_DATE, ATTR_ADDONS, ATTR_REPOSITORIES, ATTR_HOMEASSISTANT, ATTR_FOLDERS, ATTR_VERSION, ATTR_TYPE, ATTR_DEVICES, - ATTR_IMAGE) + ATTR_IMAGE, ATTR_PORT, ATTR_SSL, ATTR_PASSWORD, ATTR_WATCHDOG, ATTR_BOOT) from ..tools import write_json_file _LOGGER = logging.getLogger(__name__) @@ -101,6 +101,56 @@ class Snapshot(object): """Set snapshot homeassistant custom image.""" self._data[ATTR_HOMEASSISTANT][ATTR_IMAGE] = value + @property + def homeassistant_ssl(self): + """Return snapshot homeassistant api ssl.""" + return self._data[ATTR_HOMEASSISTANT].get(ATTR_SSL) + + @homeassistant_ssl.setter + def homeassistant_ssl(self, value): + """Set snapshot homeassistant api ssl.""" + self._data[ATTR_HOMEASSISTANT][ATTR_SSL] = value + + @property + def homeassistant_port(self): + """Return snapshot homeassistant api port.""" + return self._data[ATTR_HOMEASSISTANT].get(ATTR_PORT) + + @homeassistant_port.setter + def homeassistant_port(self, value): + """Set snapshot homeassistant api port.""" + self._data[ATTR_HOMEASSISTANT][ATTR_PORT] = value + + @property + def homeassistant_password(self): + """Return snapshot homeassistant api password.""" + return self._data[ATTR_HOMEASSISTANT].get(ATTR_PASSWORD) + + @homeassistant_password.setter + def homeassistant_password(self, value): + """Set snapshot homeassistant api password.""" + self._data[ATTR_HOMEASSISTANT][ATTR_PASSWORD] = value + + @property + def homeassistant_watchdog(self): + """Return snapshot homeassistant watchdog options.""" + return self._data[ATTR_HOMEASSISTANT].get(ATTR_WATCHDOG) + + @homeassistant_watchdog.setter + def homeassistant_watchdog(self, value): + """Set snapshot homeassistant watchdog options.""" + self._data[ATTR_HOMEASSISTANT][ATTR_WATCHDOG] = value + + @property + def homeassistant_boot(self): + """Return snapshot homeassistant boot options.""" + return self._data[ATTR_HOMEASSISTANT].get(ATTR_BOOT) + + @homeassistant_boot.setter + def homeassistant_boot(self, value): + """Set snapshot homeassistant boot options.""" + self._data[ATTR_HOMEASSISTANT][ATTR_BOOT] = value + @property def size(self): """Return snapshot size.""" @@ -126,20 +176,34 @@ class Snapshot(object): """Read all data from homeassistant object.""" self.homeassistant_version = homeassistant.version self.homeassistant_devices = homeassistant.devices + self.homeassistant_watchdog = homeassistant.watchdog + self.homeassistant_boot = homeassistant.boot # custom image if homeassistant.is_custom_image: self.homeassistant_image = homeassistant.image + # api + self.homeassistant_port = homeassistant.api_port + self.homeassistant_ssl = homeassistant.api_ssl + self.homeassistant_password = homeassistant.api_password + def restore_homeassistant(self, homeassistant): """Write all data to homeassistant object.""" homeassistant.devices = self.homeassistant_devices + homeassistant.watchdog = self.homeassistant_watchdog + homeassistant.boot = self.homeassistant_boot # custom image if self.homeassistant_image: homeassistant.set_custom( self.homeassistant_image, self.homeassistant_version) + # api + homeassistant.api_port = self.homeassistant_port + homeassistant.api_ssl = self.homeassistant_ssl + homeassistant.api_password = self.homeassistant_password + async def load(self): """Read snapshot.json from tar file.""" if not self.tar_file.is_file(): diff --git a/hassio/snapshots/validate.py b/hassio/snapshots/validate.py index e0a497d76..74c66dc4c 100644 --- a/hassio/snapshots/validate.py +++ b/hassio/snapshots/validate.py @@ -5,9 +5,10 @@ import voluptuous as vol from ..const import ( ATTR_REPOSITORIES, ATTR_ADDONS, ATTR_NAME, ATTR_SLUG, ATTR_DATE, ATTR_VERSION, ATTR_HOMEASSISTANT, ATTR_FOLDERS, ATTR_TYPE, ATTR_DEVICES, - ATTR_IMAGE, FOLDER_SHARE, FOLDER_HOMEASSISTANT, FOLDER_ADDONS, FOLDER_SSL, + ATTR_IMAGE, ATTR_PASSWORD, ATTR_PORT, ATTR_SSL, ATTR_WATCHDOG, ATTR_BOOT, + FOLDER_SHARE, FOLDER_HOMEASSISTANT, FOLDER_ADDONS, FOLDER_SSL, SNAPSHOT_FULL, SNAPSHOT_PARTIAL) -from ..validate import HASS_DEVICES +from ..validate import HASS_DEVICES, NETWORK_PORT ALL_FOLDERS = [FOLDER_HOMEASSISTANT, FOLDER_SHARE, FOLDER_ADDONS, FOLDER_SSL] @@ -21,6 +22,11 @@ SCHEMA_SNAPSHOT = vol.Schema({ vol.Required(ATTR_VERSION): vol.Coerce(str), vol.Optional(ATTR_DEVICES, default=[]): HASS_DEVICES, vol.Optional(ATTR_IMAGE): vol.Coerce(str), + vol.Optional(ATTR_BOOT, default=True): vol.Boolean(), + vol.Optional(ATTR_SSL, default=False): vol.Boolean(), + vol.Optional(ATTR_PORT, default=8123): NETWORK_PORT, + vol.Optional(ATTR_PASSWORD): vol.Any(None, vol.Coerce(str)), + vol.Optional(ATTR_WATCHDOG, default=True): vol.Boolean(), }), vol.Optional(ATTR_FOLDERS, default=[]): [vol.In(ALL_FOLDERS)], vol.Optional(ATTR_ADDONS, default=[]): [vol.Schema({