mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-18 06:36:30 +00:00
Merge remote-tracking branch 'origin/dev'
This commit is contained in:
commit
b03a2c5c5f
4
API.md
4
API.md
@ -435,6 +435,10 @@ Output is the raw Docker log.
|
|||||||
|
|
||||||
- POST `/addons/{addon}/restart`
|
- POST `/addons/{addon}/restart`
|
||||||
|
|
||||||
|
- POST `/addons/{addon}/rebuild`
|
||||||
|
|
||||||
|
Only supported for local build addons
|
||||||
|
|
||||||
## Host Control
|
## Host Control
|
||||||
|
|
||||||
Communicate over UNIX socket with a host daemon.
|
Communicate over UNIX socket with a host daemon.
|
||||||
|
@ -8,6 +8,7 @@ import shutil
|
|||||||
import tarfile
|
import tarfile
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory
|
||||||
|
|
||||||
|
from deepmerge import Merger
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
from voluptuous.humanize import humanize_error
|
from voluptuous.humanize import humanize_error
|
||||||
|
|
||||||
@ -30,6 +31,8 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
RE_VOLUME = re.compile(MAP_VOLUME)
|
RE_VOLUME = re.compile(MAP_VOLUME)
|
||||||
RE_WEBUI = re.compile(r"^(.*\[HOST\]:)\[PORT:(\d+)\](.*)$")
|
RE_WEBUI = re.compile(r"^(.*\[HOST\]:)\[PORT:(\d+)\](.*)$")
|
||||||
|
|
||||||
|
MERGE_OPT = Merger([(dict, ['merge'])], ['override'], ['override'])
|
||||||
|
|
||||||
|
|
||||||
class Addon(object):
|
class Addon(object):
|
||||||
"""Hold data for addon inside HassIO."""
|
"""Hold data for addon inside HassIO."""
|
||||||
@ -104,10 +107,10 @@ class Addon(object):
|
|||||||
def options(self):
|
def options(self):
|
||||||
"""Return options with local changes."""
|
"""Return options with local changes."""
|
||||||
if self.is_installed:
|
if self.is_installed:
|
||||||
return {
|
return MERGE_OPT.merge(
|
||||||
**self.data.system[self._id][ATTR_OPTIONS],
|
self.data.system[self._id][ATTR_OPTIONS],
|
||||||
**self.data.user[self._id][ATTR_OPTIONS],
|
self.data.user[self._id][ATTR_OPTIONS],
|
||||||
}
|
)
|
||||||
return self.data.cache[self._id][ATTR_OPTIONS]
|
return self.data.cache[self._id][ATTR_OPTIONS]
|
||||||
|
|
||||||
@options.setter
|
@options.setter
|
||||||
@ -515,6 +518,27 @@ class Addon(object):
|
|||||||
"""
|
"""
|
||||||
return self.docker.logs()
|
return self.docker.logs()
|
||||||
|
|
||||||
|
@check_installed
|
||||||
|
async def rebuild(self):
|
||||||
|
"""Performe a rebuild of local build addon."""
|
||||||
|
last_state = await self.state()
|
||||||
|
|
||||||
|
if not self.need_build:
|
||||||
|
_LOGGER.error("Can't rebuild a none local build addon!")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# remove docker container but not addon config
|
||||||
|
if not await self.docker.remove():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not await self.docker.install(self.version_installed):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# restore state
|
||||||
|
if last_state == STATE_STARTED:
|
||||||
|
await self.docker.run()
|
||||||
|
return True
|
||||||
|
|
||||||
@check_installed
|
@check_installed
|
||||||
async def snapshot(self, tar_file):
|
async def snapshot(self, tar_file):
|
||||||
"""Snapshot a state of a addon."""
|
"""Snapshot a state of a addon."""
|
||||||
|
@ -94,6 +94,8 @@ class RestAPI(object):
|
|||||||
'/addons/{addon}/update', api_addons.update)
|
'/addons/{addon}/update', api_addons.update)
|
||||||
self.webapp.router.add_post(
|
self.webapp.router.add_post(
|
||||||
'/addons/{addon}/options', api_addons.options)
|
'/addons/{addon}/options', api_addons.options)
|
||||||
|
self.webapp.router.add_post(
|
||||||
|
'/addons/{addon}/rebuild', api_addons.rebuild)
|
||||||
self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs)
|
self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs)
|
||||||
self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo)
|
self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo)
|
||||||
|
|
||||||
|
@ -213,6 +213,15 @@ class APIAddons(object):
|
|||||||
addon = self._extract_addon(request)
|
addon = self._extract_addon(request)
|
||||||
return asyncio.shield(addon.restart(), loop=self.loop)
|
return asyncio.shield(addon.restart(), loop=self.loop)
|
||||||
|
|
||||||
|
@api_process
|
||||||
|
def rebuild(self, request):
|
||||||
|
"""Rebuild local build addon."""
|
||||||
|
addon = self._extract_addon(request)
|
||||||
|
if not addon.need_build:
|
||||||
|
raise RuntimeError("Only local build addons are supported")
|
||||||
|
|
||||||
|
return asyncio.shield(addon.rebuild(), loop=self.loop)
|
||||||
|
|
||||||
@api_process_raw(CONTENT_TYPE_BINARY)
|
@api_process_raw(CONTENT_TYPE_BINARY)
|
||||||
def logs(self, request):
|
def logs(self, request):
|
||||||
"""Return logs from addon."""
|
"""Return logs from addon."""
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Const file for HassIO."""
|
"""Const file for HassIO."""
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
HASSIO_VERSION = '0.56'
|
HASSIO_VERSION = '0.57'
|
||||||
|
|
||||||
URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/'
|
URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/'
|
||||||
'hassio/{}/version.json')
|
'hassio/{}/version.json')
|
||||||
|
@ -203,7 +203,9 @@ class DockerAddon(DockerBase):
|
|||||||
|
|
||||||
_LOGGER.info("Start build %s on %s", build_tag, build_dir)
|
_LOGGER.info("Start build %s on %s", build_tag, build_dir)
|
||||||
image = self.dock.images.build(
|
image = self.dock.images.build(
|
||||||
path=str(build_dir), tag=build_tag, pull=True)
|
path=str(build_dir), tag=build_tag, pull=True,
|
||||||
|
forcerm=True
|
||||||
|
)
|
||||||
|
|
||||||
image.tag(self.image, tag='latest')
|
image.tag(self.image, tag='latest')
|
||||||
self.process_metadata(image.attrs, force=True)
|
self.process_metadata(image.attrs, force=True)
|
||||||
|
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1 +1 @@
|
|||||||
Subproject commit 1aa387a72f2a8b0c26a005afbba9a8a9fc095e06
|
Subproject commit 9b9cba86c28bf7710a84ac00e065e0165c61754f
|
3
setup.py
3
setup.py
@ -47,6 +47,7 @@ setup(
|
|||||||
'pyotp',
|
'pyotp',
|
||||||
'pyqrcode',
|
'pyqrcode',
|
||||||
'pytz',
|
'pytz',
|
||||||
'pyudev'
|
'pyudev',
|
||||||
|
'deepmerge'
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"hassio": "0.56",
|
"hassio": "0.57",
|
||||||
"homeassistant": "0.51.2",
|
"homeassistant": "0.51.2",
|
||||||
"resinos": "1.0",
|
"resinos": "1.0",
|
||||||
"resinhup": "0.3",
|
"resinhup": "0.3",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user