"""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"])