mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-06-23 02:16:29 +00:00

* Code cleanup & add config check to API * Fix comments * fix lint p1 * Fix lint p2 * fix coro * fix parameter * add log output * fix command layout * fix Pannel * fix lint p4 * fix regex * convert to ascii * fix lint p5 * add temp logging * fix output on non-zero exit * remove temporary log
136 lines
4.3 KiB
Python
136 lines
4.3 KiB
Python
"""Init file for HassIO snapshot rest api."""
|
|
import asyncio
|
|
import logging
|
|
|
|
import voluptuous as vol
|
|
|
|
from .util import api_process, api_validate
|
|
from ..snapshots.validate import ALL_FOLDERS
|
|
from ..const import (
|
|
ATTR_NAME, ATTR_SLUG, ATTR_DATE, ATTR_ADDONS, ATTR_REPOSITORIES,
|
|
ATTR_HOMEASSISTANT, ATTR_VERSION, ATTR_SIZE, ATTR_FOLDERS, ATTR_TYPE,
|
|
ATTR_DEVICES, ATTR_SNAPSHOTS)
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
# pylint: disable=no-value-for-parameter
|
|
SCHEMA_RESTORE_PARTIAL = vol.Schema({
|
|
vol.Optional(ATTR_HOMEASSISTANT): vol.Boolean(),
|
|
vol.Optional(ATTR_ADDONS): [vol.Coerce(str)],
|
|
vol.Optional(ATTR_FOLDERS): [vol.In(ALL_FOLDERS)],
|
|
})
|
|
|
|
SCHEMA_SNAPSHOT_FULL = vol.Schema({
|
|
vol.Optional(ATTR_NAME): vol.Coerce(str),
|
|
})
|
|
|
|
SCHEMA_SNAPSHOT_PARTIAL = SCHEMA_SNAPSHOT_FULL.extend({
|
|
vol.Optional(ATTR_ADDONS): [vol.Coerce(str)],
|
|
vol.Optional(ATTR_FOLDERS): [vol.In(ALL_FOLDERS)],
|
|
})
|
|
|
|
|
|
class APISnapshots(object):
|
|
"""Handle rest api for snapshot functions."""
|
|
|
|
def __init__(self, config, loop, snapshots):
|
|
"""Initialize network rest api part."""
|
|
self.config = config
|
|
self.loop = loop
|
|
self.snapshots = snapshots
|
|
|
|
def _extract_snapshot(self, request):
|
|
"""Return addon and if not exists trow a exception."""
|
|
snapshot = self.snapshots.get(request.match_info.get('snapshot'))
|
|
if not snapshot:
|
|
raise RuntimeError("Snapshot not exists")
|
|
return snapshot
|
|
|
|
@api_process
|
|
async def list(self, request):
|
|
"""Return snapshot list."""
|
|
data_snapshots = []
|
|
for snapshot in self.snapshots.list_snapshots:
|
|
data_snapshots.append({
|
|
ATTR_SLUG: snapshot.slug,
|
|
ATTR_NAME: snapshot.name,
|
|
ATTR_DATE: snapshot.date,
|
|
})
|
|
|
|
return {
|
|
ATTR_SNAPSHOTS: data_snapshots,
|
|
}
|
|
|
|
@api_process
|
|
async def reload(self, request):
|
|
"""Reload snapshot list."""
|
|
await asyncio.shield(self.snapshots.reload(), loop=self.loop)
|
|
return True
|
|
|
|
@api_process
|
|
async def info(self, request):
|
|
"""Return snapshot info."""
|
|
snapshot = self._extract_snapshot(request)
|
|
|
|
data_addons = []
|
|
for addon_data in snapshot.addons:
|
|
data_addons.append({
|
|
ATTR_SLUG: addon_data[ATTR_SLUG],
|
|
ATTR_NAME: addon_data[ATTR_NAME],
|
|
ATTR_VERSION: addon_data[ATTR_VERSION],
|
|
})
|
|
|
|
return {
|
|
ATTR_SLUG: snapshot.slug,
|
|
ATTR_TYPE: snapshot.sys_type,
|
|
ATTR_NAME: snapshot.name,
|
|
ATTR_DATE: snapshot.date,
|
|
ATTR_SIZE: snapshot.size,
|
|
ATTR_HOMEASSISTANT: {
|
|
ATTR_VERSION: snapshot.homeassistant_version,
|
|
ATTR_DEVICES: snapshot.homeassistant_devices,
|
|
},
|
|
ATTR_ADDONS: data_addons,
|
|
ATTR_REPOSITORIES: snapshot.repositories,
|
|
ATTR_FOLDERS: snapshot.folders,
|
|
}
|
|
|
|
@api_process
|
|
async def snapshot_full(self, request):
|
|
"""Full-Snapshot a snapshot."""
|
|
body = await api_validate(SCHEMA_SNAPSHOT_FULL, request)
|
|
return await asyncio.shield(
|
|
self.snapshots.do_snapshot_full(**body), loop=self.loop)
|
|
|
|
@api_process
|
|
async def snapshot_partial(self, request):
|
|
"""Partial-Snapshot a snapshot."""
|
|
body = await api_validate(SCHEMA_SNAPSHOT_PARTIAL, request)
|
|
return await asyncio.shield(
|
|
self.snapshots.do_snapshot_partial(**body), loop=self.loop)
|
|
|
|
@api_process
|
|
def restore_full(self, request):
|
|
"""Full-Restore a snapshot."""
|
|
snapshot = self._extract_snapshot(request)
|
|
return asyncio.shield(
|
|
self.snapshots.do_restore_full(snapshot), loop=self.loop)
|
|
|
|
@api_process
|
|
async def restore_partial(self, request):
|
|
"""Partial-Restore a snapshot."""
|
|
snapshot = self._extract_snapshot(request)
|
|
body = await api_validate(SCHEMA_SNAPSHOT_PARTIAL, request)
|
|
|
|
return await asyncio.shield(
|
|
self.snapshots.do_restore_partial(snapshot, **body),
|
|
loop=self.loop
|
|
)
|
|
|
|
@api_process
|
|
async def remove(self, request):
|
|
"""Remove a snapshot."""
|
|
snapshot = self._extract_snapshot(request)
|
|
return self.snapshots.remove(snapshot)
|