mirror of https://github.com/home-assistant/core
165 lines
4.7 KiB
Python
165 lines
4.7 KiB
Python
"""Websocket commands for the Backup integration."""
|
|
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components import websocket_api
|
|
from homeassistant.core import HomeAssistant, callback
|
|
|
|
from .const import DATA_MANAGER, LOGGER
|
|
from .manager import BackupProgress
|
|
|
|
|
|
@callback
|
|
def async_register_websocket_handlers(hass: HomeAssistant, with_hassio: bool) -> None:
|
|
"""Register websocket commands."""
|
|
if with_hassio:
|
|
websocket_api.async_register_command(hass, handle_backup_end)
|
|
websocket_api.async_register_command(hass, handle_backup_start)
|
|
return
|
|
|
|
websocket_api.async_register_command(hass, handle_details)
|
|
websocket_api.async_register_command(hass, handle_info)
|
|
websocket_api.async_register_command(hass, handle_create)
|
|
websocket_api.async_register_command(hass, handle_remove)
|
|
websocket_api.async_register_command(hass, handle_restore)
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.websocket_command({vol.Required("type"): "backup/info"})
|
|
@websocket_api.async_response
|
|
async def handle_info(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""List all stored backups."""
|
|
manager = hass.data[DATA_MANAGER]
|
|
backups = await manager.async_get_backups()
|
|
connection.send_result(
|
|
msg["id"],
|
|
{
|
|
"backups": list(backups.values()),
|
|
"backing_up": manager.backup_task is not None,
|
|
},
|
|
)
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.websocket_command(
|
|
{
|
|
vol.Required("type"): "backup/details",
|
|
vol.Required("slug"): str,
|
|
}
|
|
)
|
|
@websocket_api.async_response
|
|
async def handle_details(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Get backup details for a specific slug."""
|
|
backup = await hass.data[DATA_MANAGER].async_get_backup(slug=msg["slug"])
|
|
connection.send_result(
|
|
msg["id"],
|
|
{
|
|
"backup": backup,
|
|
},
|
|
)
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.websocket_command(
|
|
{
|
|
vol.Required("type"): "backup/remove",
|
|
vol.Required("slug"): str,
|
|
}
|
|
)
|
|
@websocket_api.async_response
|
|
async def handle_remove(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Remove a backup."""
|
|
await hass.data[DATA_MANAGER].async_remove_backup(slug=msg["slug"])
|
|
connection.send_result(msg["id"])
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.websocket_command(
|
|
{
|
|
vol.Required("type"): "backup/restore",
|
|
vol.Required("slug"): str,
|
|
}
|
|
)
|
|
@websocket_api.async_response
|
|
async def handle_restore(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Restore a backup."""
|
|
await hass.data[DATA_MANAGER].async_restore_backup(msg["slug"])
|
|
connection.send_result(msg["id"])
|
|
|
|
|
|
@websocket_api.require_admin
|
|
@websocket_api.websocket_command({vol.Required("type"): "backup/generate"})
|
|
@websocket_api.async_response
|
|
async def handle_create(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Generate a backup."""
|
|
|
|
def on_progress(progress: BackupProgress) -> None:
|
|
connection.send_message(websocket_api.event_message(msg["id"], progress))
|
|
|
|
backup = await hass.data[DATA_MANAGER].async_create_backup(on_progress=on_progress)
|
|
connection.send_result(msg["id"], backup)
|
|
|
|
|
|
@websocket_api.ws_require_user(only_supervisor=True)
|
|
@websocket_api.websocket_command({vol.Required("type"): "backup/start"})
|
|
@websocket_api.async_response
|
|
async def handle_backup_start(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Backup start notification."""
|
|
manager = hass.data[DATA_MANAGER]
|
|
LOGGER.debug("Backup start notification")
|
|
|
|
try:
|
|
await manager.async_pre_backup_actions()
|
|
except Exception as err: # noqa: BLE001
|
|
connection.send_error(msg["id"], "pre_backup_actions_failed", str(err))
|
|
return
|
|
|
|
connection.send_result(msg["id"])
|
|
|
|
|
|
@websocket_api.ws_require_user(only_supervisor=True)
|
|
@websocket_api.websocket_command({vol.Required("type"): "backup/end"})
|
|
@websocket_api.async_response
|
|
async def handle_backup_end(
|
|
hass: HomeAssistant,
|
|
connection: websocket_api.ActiveConnection,
|
|
msg: dict[str, Any],
|
|
) -> None:
|
|
"""Backup end notification."""
|
|
manager = hass.data[DATA_MANAGER]
|
|
LOGGER.debug("Backup end notification")
|
|
|
|
try:
|
|
await manager.async_post_backup_actions()
|
|
except Exception as err: # noqa: BLE001
|
|
connection.send_error(msg["id"], "post_backup_actions_failed", str(err))
|
|
return
|
|
|
|
connection.send_result(msg["id"])
|