Merge pull request #1274 from home-assistant/dev

Release 185
This commit is contained in:
Pascal Vizeli 2019-09-02 14:39:17 +02:00 committed by GitHub
commit 10d9135d86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 48 additions and 7 deletions

4
API.md
View File

@ -350,6 +350,10 @@ Load host configs from a USB stick.
} }
``` ```
- POST `/hardware/trigger`
Trigger an udev reload
### Home Assistant ### Home Assistant
- GET `/homeassistant/info` - GET `/homeassistant/info`

View File

@ -471,6 +471,7 @@ class Addon(AddonModel):
if self.with_audio: if self.with_audio:
self.write_asound() self.write_asound()
# Start Add-on
try: try:
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:

View File

@ -1,8 +1,8 @@
"""Init file for Hass.io add-ons.""" """Init file for Hass.io add-ons."""
from distutils.version import StrictVersion
from pathlib import Path from pathlib import Path
from typing import Any, Awaitable, Dict, List, Optional from typing import Any, Awaitable, Dict, List, Optional
from packaging import version as pkg_version
import voluptuous as vol import voluptuous as vol
from ..const import ( from ..const import (
@ -482,7 +482,9 @@ class AddonModel(CoreSysAttributes):
# Home Assistant # Home Assistant
version = config.get(ATTR_HOMEASSISTANT) or self.sys_homeassistant.version version = config.get(ATTR_HOMEASSISTANT) or self.sys_homeassistant.version
if StrictVersion(self.sys_homeassistant.version) < StrictVersion(version): if pkg_version.parse(self.sys_homeassistant.version) < pkg_version.parse(
version
):
return False return False
return True return True

View File

@ -101,6 +101,7 @@ class RestAPI(CoreSysAttributes):
[ [
web.get("/hardware/info", api_hardware.info), web.get("/hardware/info", api_hardware.info),
web.get("/hardware/audio", api_hardware.audio), web.get("/hardware/audio", api_hardware.audio),
web.post("/hardware/trigger", api_hardware.trigger),
] ]
) )

View File

@ -1,5 +1,9 @@
"""Init file for Hass.io hardware RESTful API.""" """Init file for Hass.io hardware RESTful API."""
import asyncio
import logging import logging
from typing import Any, Dict
from aiohttp import web
from .utils import api_process from .utils import api_process
from ..const import ( from ..const import (
@ -19,7 +23,7 @@ class APIHardware(CoreSysAttributes):
"""Handle RESTful API for hardware functions.""" """Handle RESTful API for hardware functions."""
@api_process @api_process
async def info(self, request): async def info(self, request: web.Request) -> Dict[str, Any]:
"""Show hardware info.""" """Show hardware info."""
return { return {
ATTR_SERIAL: list( ATTR_SERIAL: list(
@ -32,7 +36,7 @@ class APIHardware(CoreSysAttributes):
} }
@api_process @api_process
async def audio(self, request): async def audio(self, request: web.Request) -> Dict[str, Any]:
"""Show ALSA audio devices.""" """Show ALSA audio devices."""
return { return {
ATTR_AUDIO: { ATTR_AUDIO: {
@ -40,3 +44,8 @@ class APIHardware(CoreSysAttributes):
ATTR_OUTPUT: self.sys_host.alsa.output_devices, ATTR_OUTPUT: self.sys_host.alsa.output_devices,
} }
} }
@api_process
def trigger(self, request: web.Request) -> None:
"""Trigger a udev device reload."""
return asyncio.shield(self.sys_hardware.udev_trigger())

View File

@ -41,6 +41,7 @@ ADDONS_API_BYPASS = re.compile(
r"^(?:" r"^(?:"
r"|/addons/self/(?!security|update)[^/]+" r"|/addons/self/(?!security|update)[^/]+"
r"|/info" r"|/info"
r"|/hardware/trigger"
r"|/services.*" r"|/services.*"
r"|/discovery.*" r"|/discovery.*"
r"|/auth" r"|/auth"

View File

@ -2,7 +2,7 @@
from pathlib import Path from pathlib import Path
from ipaddress import ip_network from ipaddress import ip_network
HASSIO_VERSION = "184" HASSIO_VERSION = "185"
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons" URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"

View File

@ -188,3 +188,10 @@ class JsonFileError(HassioError):
class DockerAPIError(HassioError): class DockerAPIError(HassioError):
"""Docker API error.""" """Docker API error."""
# Hardware
class HardwareNotSupportedError(HassioNotSupportedError):
"""Raise if hardware function is not supported."""

View File

@ -2,7 +2,6 @@
import asyncio import asyncio
from contextlib import asynccontextmanager, suppress from contextlib import asynccontextmanager, suppress
from datetime import datetime, timedelta from datetime import datetime, timedelta
from distutils.version import StrictVersion
from ipaddress import IPv4Address from ipaddress import IPv4Address
import logging import logging
import os import os
@ -16,6 +15,7 @@ from uuid import UUID
import aiohttp import aiohttp
from aiohttp import hdrs from aiohttp import hdrs
import attr import attr
from packaging import version as pkg_version
from .const import ( from .const import (
ATTR_ACCESS_TOKEN, ATTR_ACCESS_TOKEN,
@ -80,7 +80,9 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.version: if not self.version:
self.version = await self.instance.get_latest_version(key=StrictVersion) self.version = await self.instance.get_latest_version(
key=pkg_version.parse
)
await self.instance.attach(tag=self.version) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError:

View File

@ -1,4 +1,5 @@
"""Read hardware info from system.""" """Read hardware info from system."""
import asyncio
from datetime import datetime from datetime import datetime
import logging import logging
from pathlib import Path from pathlib import Path
@ -8,6 +9,7 @@ from typing import Any, Dict, Optional, Set
import pyudev import pyudev
from ..const import ATTR_DEVICES, ATTR_NAME, ATTR_TYPE, CHAN_ID, CHAN_TYPE from ..const import ATTR_DEVICES, ATTR_NAME, ATTR_TYPE, CHAN_ID, CHAN_TYPE
from ..exceptions import HardwareNotSupportedError
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@ -148,3 +150,14 @@ class Hardware:
return None return None
return datetime.utcfromtimestamp(int(found.group(1))) return datetime.utcfromtimestamp(int(found.group(1)))
async def udev_trigger(self) -> None:
"""Trigger a udev reload."""
proc = await asyncio.create_subprocess_exec("udevadm", "trigger")
await proc.wait()
if proc.returncode == 0:
return
_LOGGER.waring("udevadm device triggering fails!")
raise HardwareNotSupportedError()

View File

@ -7,6 +7,7 @@ cpe==1.2.1
cryptography==2.7 cryptography==2.7
docker==4.0.2 docker==4.0.2
gitpython==3.0.2 gitpython==3.0.2
packaging==19.1
pytz==2019.2 pytz==2019.2
pyudev==0.21.0 pyudev==0.21.0
uvloop==0.12.2 uvloop==0.12.2