Merge pull request #1607 from home-assistant/dev

Release 212
This commit is contained in:
Pascal Vizeli 2020-03-28 16:09:49 +01:00 committed by GitHub
commit 2e4b545265
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 63 additions and 22 deletions

4
API.md
View File

@ -252,6 +252,10 @@ return:
} }
``` ```
- GET `/host/logs`
Return host dmesg
- POST `/host/options` - POST `/host/options`
```json ```json

View File

@ -74,6 +74,7 @@ class RestAPI(CoreSysAttributes):
self.webapp.add_routes( self.webapp.add_routes(
[ [
web.get("/host/info", api_host.info), web.get("/host/info", api_host.info),
web.get("/host/logs", api_host.logs),
web.post("/host/reboot", api_host.reboot), web.post("/host/reboot", api_host.reboot),
web.post("/host/shutdown", api_host.shutdown), web.post("/host/shutdown", api_host.shutdown),
web.post("/host/reload", api_host.reload), web.post("/host/reload", api_host.reload),

View File

@ -1,24 +1,27 @@
"""Init file for Supervisor host RESTful API.""" """Init file for Supervisor host RESTful API."""
import asyncio import asyncio
import logging import logging
from typing import Awaitable
from aiohttp import web
import voluptuous as vol import voluptuous as vol
from .utils import api_process, api_validate
from ..const import ( from ..const import (
ATTR_HOSTNAME,
ATTR_FEATURES,
ATTR_KERNEL,
ATTR_OPERATING_SYSTEM,
ATTR_CHASSIS, ATTR_CHASSIS,
ATTR_DEPLOYMENT,
ATTR_STATE,
ATTR_NAME,
ATTR_DESCRIPTON,
ATTR_SERVICES,
ATTR_CPE, ATTR_CPE,
ATTR_DEPLOYMENT,
ATTR_DESCRIPTON,
ATTR_FEATURES,
ATTR_HOSTNAME,
ATTR_KERNEL,
ATTR_NAME,
ATTR_OPERATING_SYSTEM,
ATTR_SERVICES,
ATTR_STATE,
CONTENT_TYPE_BINARY,
) )
from ..coresys import CoreSysAttributes from ..coresys import CoreSysAttributes
from .utils import api_process, api_process_raw, api_validate
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@ -107,3 +110,8 @@ class APIHost(CoreSysAttributes):
"""Restart a service.""" """Restart a service."""
unit = request.match_info.get(SERVICE) unit = request.match_info.get(SERVICE)
return asyncio.shield(self.sys_host.services.restart(unit)) return asyncio.shield(self.sys_host.services.restart(unit))
@api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request: web.Request) -> Awaitable[bytes]:
"""Return host kernel logs."""
return self.sys_host.info.get_dmesg()

View File

@ -65,7 +65,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
await self.instance.attach(tag=self.version) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError:
_LOGGER.info("No Audio plugin Docker image %s found.", self.instance.image) _LOGGER.info("No cli plugin Docker image %s found.", self.instance.image)
# Install cli # Install cli
with suppress(CliError): with suppress(CliError):
@ -89,7 +89,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
if self.latest_version: if self.latest_version:
with suppress(DockerAPIError): with suppress(DockerAPIError):
await self.instance.install(self.latest_version) await self.instance.install(self.latest_version, latest=True)
break break
_LOGGER.warning("Error on install cli plugin. Retry in 30sec") _LOGGER.warning("Error on install cli plugin. Retry in 30sec")
await asyncio.sleep(30) await asyncio.sleep(30)
@ -111,11 +111,17 @@ class HaCli(CoreSysAttributes, JsonConfig):
except DockerAPIError: except DockerAPIError:
_LOGGER.error("HA cli update fails") _LOGGER.error("HA cli update fails")
raise CliUpdateError() from None raise CliUpdateError() from None
else:
# Cleanup # Cleanup
with suppress(DockerAPIError): with suppress(DockerAPIError):
await self.instance.cleanup() await self.instance.cleanup()
self.version = version
self.save_data()
# Start cli
await self.start()
async def start(self) -> None: async def start(self) -> None:
"""Run cli.""" """Run cli."""
# Create new API token # Create new API token

View File

@ -3,7 +3,7 @@ from enum import Enum
from ipaddress import ip_network from ipaddress import ip_network
from pathlib import Path from pathlib import Path
SUPERVISOR_VERSION = "211" SUPERVISOR_VERSION = "212"
URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons" URL_HASSIO_ADDONS = "https://github.com/home-assistant/hassio-addons"

View File

@ -165,12 +165,13 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
_LOGGER.warning("Version %s is already installed for CoreDNS", version) _LOGGER.warning("Version %s is already installed for CoreDNS", version)
return return
# Update
try: try:
await self.instance.update(version) await self.instance.update(version)
except DockerAPIError: except DockerAPIError:
_LOGGER.error("CoreDNS update fails") _LOGGER.error("CoreDNS update fails")
raise CoreDNSUpdateError() from None raise CoreDNSUpdateError() from None
else:
# Cleanup # Cleanup
with suppress(DockerAPIError): with suppress(DockerAPIError):
await self.instance.cleanup() await self.instance.cleanup()

View File

@ -1,9 +1,15 @@
"""Info control for host.""" """Info control for host."""
import asyncio
import logging import logging
from typing import Optional from typing import Optional
from ..coresys import CoreSysAttributes from ..coresys import CoreSysAttributes
from ..exceptions import HostNotSupportedError, DBusNotConnectedError, DBusError from ..exceptions import (
HostNotSupportedError,
HostError,
DBusNotConnectedError,
DBusError,
)
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@ -45,6 +51,21 @@ class InfoCenter(CoreSysAttributes):
"""Return local CPE.""" """Return local CPE."""
return self.sys_dbus.hostname.cpe return self.sys_dbus.hostname.cpe
async def get_dmesg(self) -> bytes:
"""Return host dmesg output."""
proc = await asyncio.create_subprocess_shell(
"dmesg", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT
)
# Get kernel log
try:
stdout, _ = await proc.communicate()
except OSError as err:
_LOGGER.error("Can't read kernel log: %s", err)
raise HostError()
return stdout
async def update(self): async def update(self):
"""Update properties over dbus.""" """Update properties over dbus."""
_LOGGER.info("Update local host information") _LOGGER.info("Update local host information")