mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-09 10:16:29 +00:00
Add restart support to homeassistant and add-ons (#37)
This commit is contained in:
parent
63b96700e0
commit
f59f0793bc
4
API.md
4
API.md
@ -171,6 +171,8 @@ Optional:
|
|||||||
|
|
||||||
Output the raw docker log
|
Output the raw docker log
|
||||||
|
|
||||||
|
- POST `/homeassistant/restart`
|
||||||
|
|
||||||
### REST API addons
|
### REST API addons
|
||||||
|
|
||||||
- GET `/addons/{addon}/info`
|
- GET `/addons/{addon}/info`
|
||||||
@ -223,6 +225,8 @@ Optional:
|
|||||||
|
|
||||||
Output the raw docker log
|
Output the raw docker log
|
||||||
|
|
||||||
|
- POST `/addons/{addon}/restart`
|
||||||
|
|
||||||
## Host Control
|
## Host Control
|
||||||
|
|
||||||
Communicate over unix socket with a host daemon.
|
Communicate over unix socket with a host daemon.
|
||||||
|
@ -197,6 +197,14 @@ class AddonManager(AddonsData):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def restart(self, addon):
|
||||||
|
"""Restart addon."""
|
||||||
|
if addon not in self.dockers:
|
||||||
|
_LOGGER.error("No docker found for addon %s", addon)
|
||||||
|
return False
|
||||||
|
|
||||||
|
return await self.dockers[addon].restart()
|
||||||
|
|
||||||
async def logs(self, addon):
|
async def logs(self, addon):
|
||||||
"""Return addons log output."""
|
"""Return addons log output."""
|
||||||
if addon not in self.dockers:
|
if addon not in self.dockers:
|
||||||
|
@ -64,6 +64,7 @@ class RestAPI(object):
|
|||||||
|
|
||||||
self.webapp.router.add_get('/homeassistant/info', api_hass.info)
|
self.webapp.router.add_get('/homeassistant/info', api_hass.info)
|
||||||
self.webapp.router.add_post('/homeassistant/update', api_hass.update)
|
self.webapp.router.add_post('/homeassistant/update', api_hass.update)
|
||||||
|
self.webapp.router.add_post('/homeassistant/restart', api_hass.restart)
|
||||||
self.webapp.router.add_get('/homeassistant/logs', api_hass.logs)
|
self.webapp.router.add_get('/homeassistant/logs', api_hass.logs)
|
||||||
|
|
||||||
def register_addons(self, addons):
|
def register_addons(self, addons):
|
||||||
|
@ -143,6 +143,12 @@ class APIAddons(object):
|
|||||||
return await asyncio.shield(
|
return await asyncio.shield(
|
||||||
self.addons.update(addon, version), loop=self.loop)
|
self.addons.update(addon, version), loop=self.loop)
|
||||||
|
|
||||||
|
@api_process
|
||||||
|
async def restart(self, request):
|
||||||
|
"""Restart addon."""
|
||||||
|
addon = self._extract_addon(request)
|
||||||
|
return await asyncio.shield(self.addons.restart(addon), loop=self.loop)
|
||||||
|
|
||||||
@api_process_raw
|
@api_process_raw
|
||||||
def logs(self, request):
|
def logs(self, request):
|
||||||
"""Return logs from addon."""
|
"""Return logs from addon."""
|
||||||
|
@ -35,7 +35,7 @@ class APIHomeAssistant(object):
|
|||||||
|
|
||||||
@api_process
|
@api_process
|
||||||
async def update(self, request):
|
async def update(self, request):
|
||||||
"""Update host OS."""
|
"""Update homeassistant."""
|
||||||
body = await api_validate(SCHEMA_VERSION, request)
|
body = await api_validate(SCHEMA_VERSION, request)
|
||||||
version = body.get(ATTR_VERSION, self.config.last_homeassistant)
|
version = body.get(ATTR_VERSION, self.config.last_homeassistant)
|
||||||
|
|
||||||
@ -48,6 +48,15 @@ class APIHomeAssistant(object):
|
|||||||
return await asyncio.shield(
|
return await asyncio.shield(
|
||||||
self.homeassistant.update(version), loop=self.loop)
|
self.homeassistant.update(version), loop=self.loop)
|
||||||
|
|
||||||
|
@api_process
|
||||||
|
async def restart(self, request):
|
||||||
|
"""Restart homeassistant."""
|
||||||
|
if self.homeassistant.in_progress:
|
||||||
|
raise RuntimeError("Other task is in progress")
|
||||||
|
|
||||||
|
return await asyncio.shield(
|
||||||
|
self.homeassistant.restart(), loop=self.loop)
|
||||||
|
|
||||||
@api_process_raw
|
@api_process_raw
|
||||||
def logs(self, request):
|
def logs(self, request):
|
||||||
"""Return homeassistant docker logs.
|
"""Return homeassistant docker logs.
|
||||||
|
@ -264,3 +264,28 @@ class DockerBase(object):
|
|||||||
return self.container.logs(tail=100, stdout=True, stderr=True)
|
return self.container.logs(tail=100, stdout=True, stderr=True)
|
||||||
except docker.errors.DockerException as err:
|
except docker.errors.DockerException as err:
|
||||||
_LOGGER.warning("Can't grap logs from %s -> %s", self.image, err)
|
_LOGGER.warning("Can't grap logs from %s -> %s", self.image, err)
|
||||||
|
|
||||||
|
async def restart(self):
|
||||||
|
"""Restart docker container."""
|
||||||
|
if self._lock.locked():
|
||||||
|
_LOGGER.error("Can't excute restart while a task is in progress")
|
||||||
|
return False
|
||||||
|
|
||||||
|
async with self._lock:
|
||||||
|
return await self.loop.run_in_executor(None, self._restart)
|
||||||
|
|
||||||
|
def _restart(self):
|
||||||
|
"""Restart docker container.
|
||||||
|
|
||||||
|
Need run inside executor.
|
||||||
|
"""
|
||||||
|
if not self.container:
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.container.restart(timeout=30)
|
||||||
|
except docker.errors.DockerException as err:
|
||||||
|
_LOGGER.warning("Can't restart %s -> %s", self.image, err)
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
@ -81,3 +81,7 @@ class DockerSupervisor(DockerBase):
|
|||||||
async def remove(self):
|
async def remove(self):
|
||||||
"""Remove docker image."""
|
"""Remove docker image."""
|
||||||
raise RuntimeError("Not support on supervisor docker container!")
|
raise RuntimeError("Not support on supervisor docker container!")
|
||||||
|
|
||||||
|
async def restart(self):
|
||||||
|
"""Restart docker container."""
|
||||||
|
raise RuntimeError("Not support on supervisor docker container!")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user