diff --git a/API.md b/API.md index 334e2a62e..8c7a4d40a 100644 --- a/API.md +++ b/API.md @@ -350,6 +350,10 @@ Load host configs from a USB stick. } ``` +- POST `/hardware/trigger` + +Trigger an udev reload + ### Home Assistant - GET `/homeassistant/info` diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 375ad52a7..be4fc2238 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -471,6 +471,7 @@ class Addon(AddonModel): if self.with_audio: self.write_asound() + # Start Add-on try: await self.instance.run() except DockerAPIError: diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py index 628d7795d..bdde0260f 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -101,6 +101,7 @@ class RestAPI(CoreSysAttributes): [ web.get("/hardware/info", api_hardware.info), web.get("/hardware/audio", api_hardware.audio), + web.post("/hardware/trigger", api_hardware.trigger), ] ) diff --git a/hassio/api/hardware.py b/hassio/api/hardware.py index f9fa125a3..1d71b67f7 100644 --- a/hassio/api/hardware.py +++ b/hassio/api/hardware.py @@ -1,5 +1,9 @@ """Init file for Hass.io hardware RESTful API.""" +import asyncio import logging +from typing import Any, Dict + +from aiohttp import web from .utils import api_process from ..const import ( @@ -19,7 +23,7 @@ class APIHardware(CoreSysAttributes): """Handle RESTful API for hardware functions.""" @api_process - async def info(self, request): + async def info(self, request: web.Request) -> Dict[str, Any]: """Show hardware info.""" return { ATTR_SERIAL: list( @@ -32,7 +36,7 @@ class APIHardware(CoreSysAttributes): } @api_process - async def audio(self, request): + async def audio(self, request: web.Request) -> Dict[str, Any]: """Show ALSA audio devices.""" return { ATTR_AUDIO: { @@ -40,3 +44,8 @@ class APIHardware(CoreSysAttributes): 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()) diff --git a/hassio/api/security.py b/hassio/api/security.py index bdc0b3bc3..0db0826fa 100644 --- a/hassio/api/security.py +++ b/hassio/api/security.py @@ -41,6 +41,7 @@ ADDONS_API_BYPASS = re.compile( r"^(?:" r"|/addons/self/(?!security|update)[^/]+" r"|/info" + r"|/hardware/.+" r"|/services.*" r"|/discovery.*" r"|/auth" diff --git a/hassio/misc/hardware.py b/hassio/misc/hardware.py index 512106377..ef7bcb850 100644 --- a/hassio/misc/hardware.py +++ b/hassio/misc/hardware.py @@ -1,4 +1,5 @@ """Read hardware info from system.""" +import asyncio from datetime import datetime import logging from pathlib import Path @@ -148,3 +149,11 @@ class Hardware: return None 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: + _LOGGER.waring("udevadm device triggering fails!")