diff --git a/API.md b/API.md index 352c087eb..db9e103ec 100644 --- a/API.md +++ b/API.md @@ -243,6 +243,7 @@ Optional: "serial": ["/dev/xy"], "input": ["Input device name"], "disk": ["/dev/sdax"], + "gpio": ["gpiochip0", "gpiochip100"], "audio": { "CARD_ID": { "name": "xy", diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 2a5ed4438..87b1ebeca 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -21,7 +21,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_HOMEASSISTANT_API, ATTR_STDIN) + ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, ATTR_LEGACY) from .util import check_installed from ..dock.addon import DockerAddon from ..tools import write_json_file, read_json_file @@ -257,6 +257,11 @@ class Addon(object): """Return list of privilege.""" return self._mesh.get(ATTR_PRIVILEGED) + @property + def legacy(self): + """Return if the add-on don't support hass labels.""" + return self._mesh.get(ATTR_LEGACY) + @property def access_hassio_api(self): """Return True if the add-on access to hassio api.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 8cd79a978..3e36161cc 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -15,7 +15,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_HOMEASSISTANT_API, ATTR_STDIN) + ATTR_ARGS, ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, ATTR_LEGACY) from ..validate import NETWORK_PORT, DOCKER_PORTS, ALSA_CHANNEL _LOGGER = logging.getLogger(__name__) @@ -102,6 +102,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Optional(ATTR_HASSIO_API, default=False): vol.Boolean(), vol.Optional(ATTR_HOMEASSISTANT_API, default=False): vol.Boolean(), vol.Optional(ATTR_STDIN, default=False): vol.Boolean(), + vol.Optional(ATTR_LEGACY, 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/__init__.py b/hassio/api/__init__.py index 449974ef7..8888b7de4 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -166,5 +166,5 @@ class RestAPI(object): await self.webapp.shutdown() if self._handler: - await self._handler.finish_connections(60) + await self._handler.shutdown(60) await self.webapp.cleanup() diff --git a/hassio/api/host.py b/hassio/api/host.py index 5815ebf76..5087e6837 100644 --- a/hassio/api/host.py +++ b/hassio/api/host.py @@ -8,7 +8,7 @@ from .util import api_process_hostcontrol, api_process, api_validate from ..const import ( ATTR_VERSION, ATTR_LAST_VERSION, ATTR_TYPE, ATTR_HOSTNAME, ATTR_FEATURES, ATTR_OS, ATTR_SERIAL, ATTR_INPUT, ATTR_DISK, ATTR_AUDIO, ATTR_AUDIO_INPUT, - ATTR_AUDIO_OUTPUT) + ATTR_AUDIO_OUTPUT, ATTR_GPIO) from ..validate import ALSA_CHANNEL _LOGGER = logging.getLogger(__name__) @@ -83,8 +83,9 @@ class APIHost(object): async def hardware(self, request): """Return local hardware infos.""" return { - ATTR_SERIAL: self.local_hw.serial_devices, - ATTR_INPUT: self.local_hw.input_devices, - ATTR_DISK: self.local_hw.disk_devices, + ATTR_SERIAL: list(self.local_hw.serial_devices), + ATTR_INPUT: list(self.local_hw.input_devices), + ATTR_DISK: list(self.local_hw.disk_devices), + ATTR_GPIO: list(self.local_hw.gpio_devices), ATTR_AUDIO: self.local_hw.audio_devices, } diff --git a/hassio/const.py b/hassio/const.py index 891e8df13..7cd8506e4 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -2,7 +2,7 @@ from pathlib import Path from ipaddress import ip_network -HASSIO_VERSION = '0.72' +HASSIO_VERSION = '0.73' URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/' 'hassio/{}/version.json') @@ -127,6 +127,7 @@ ATTR_SECURITY = 'security' ATTR_BUILD_FROM = 'build_from' ATTR_SQUASH = 'squash' ATTR_GPIO = 'gpio' +ATTR_LEGACY = 'ATTR_LEGACY' ATTR_ADDONS_CUSTOM_LIST = 'addons_custom_list' STARTUP_INITIALIZE = 'initialize' diff --git a/hassio/dock/addon.py b/hassio/dock/addon.py index 2c63fe817..e41d991e9 100644 --- a/hassio/dock/addon.py +++ b/hassio/dock/addon.py @@ -25,6 +25,21 @@ class DockerAddon(DockerInterface): config, loop, api, image=addon.image, timeout=addon.timeout) self.addon = addon + def process_metadata(self, metadata, force=False): + """Use addon data instead meta data with legacy.""" + if not self.addon.legacy: + return super().process_metadata(metadata, force=force) + + # set meta data + if not self.version or force: + if force: # called on install/update/build + self.version = self.addon.last_version + else: + self.version = self.addon.version_installed + + if not self.arch: + self.arch = self.config.arch + @property def name(self): """Return name of docker container.""" @@ -89,6 +104,7 @@ class DockerAddon(DockerInterface): """Return hosts mapping.""" return { 'homeassistant': self.docker.network.gateway, + 'hassio': self.docker.network.supervisor, } @property diff --git a/hassio/hardware.py b/hassio/hardware.py index eddfc6f39..09be04acc 100644 --- a/hassio/hardware.py +++ b/hassio/hardware.py @@ -19,6 +19,8 @@ RE_DEVICES = re.compile(r"\[.*(\d+)- (\d+).*\]: ([\w ]*)") PROC_STAT = Path("/proc/stat") RE_BOOT_TIME = re.compile(r"btime (\d+)") +GPIO_DEVICES = Path("/sys/class/gpio") + class Hardware(object): """Represent a interface to procfs, sysfs and udev.""" @@ -35,7 +37,7 @@ class Hardware(object): if 'ID_VENDOR' in device: dev_list.add(device.device_node) - return list(dev_list) + return dev_list @property def input_devices(self): @@ -45,7 +47,7 @@ class Hardware(object): if 'NAME' in device: dev_list.add(device['NAME'].replace('"', '')) - return list(dev_list) + return dev_list @property def disk_devices(self): @@ -55,7 +57,7 @@ class Hardware(object): if device.device_node.startswith('/dev/sd'): dev_list.add(device.device_node) - return list(dev_list) + return dev_list @property def audio_devices(self): @@ -90,6 +92,15 @@ class Hardware(object): return audio_list + @property + def gpio_devices(self): + """Return list of GPIO interface on device.""" + dev_list = set() + for interface in GPIO_DEVICES.glob("gpio*"): + dev_list.add(interface.name) + + return dev_list + @property def last_boot(self): """Return last boot time.""" diff --git a/version.json b/version.json index dbd19f0ba..58afe05da 100644 --- a/version.json +++ b/version.json @@ -1,5 +1,5 @@ { - "hassio": "0.72", + "hassio": "0.73", "homeassistant": "0.56.2", "resinos": "1.1", "resinhup": "0.3",