1 """Http view for the Backup integration."""
3 from __future__
import annotations
6 from http
import HTTPStatus
7 from typing
import cast
9 from aiohttp
import BodyPartReader
10 from aiohttp.hdrs
import CONTENT_DISPOSITION
11 from aiohttp.web
import FileResponse, Request, Response
17 from .const
import DATA_MANAGER
22 """Register the http views."""
23 hass.http.register_view(DownloadBackupView)
24 hass.http.register_view(UploadBackupView)
28 """Generate backup view."""
30 url =
"/api/backup/download/{slug}"
31 name =
"api:backup:download"
37 ) -> FileResponse | Response:
38 """Download a backup file."""
39 if not request[
"hass_user"].is_admin:
40 return Response(status=HTTPStatus.UNAUTHORIZED)
42 manager = request.app[KEY_HASS].data[DATA_MANAGER]
43 backup = await manager.async_get_backup(slug=slug)
45 if backup
is None or not backup.path.exists():
46 return Response(status=HTTPStatus.NOT_FOUND)
49 path=backup.path.as_posix(),
51 CONTENT_DISPOSITION: f
"attachment; filename={slugify(backup.name)}.tar"
57 """Generate backup view."""
59 url =
"/api/backup/upload"
60 name =
"api:backup:upload"
63 async
def post(self, request: Request) -> Response:
64 """Upload a backup file."""
65 manager = request.app[KEY_HASS].data[DATA_MANAGER]
66 reader = await request.multipart()
67 contents = cast(BodyPartReader, await reader.next())
70 await manager.async_receive_backup(contents=contents)
71 except OSError
as err:
73 body=f
"Can't write backup file {err}",
74 status=HTTPStatus.INTERNAL_SERVER_ERROR,
76 except asyncio.CancelledError:
77 return Response(status=HTTPStatus.INTERNAL_SERVER_ERROR)
79 return Response(status=HTTPStatus.CREATED)
FileResponse|Response get(self, Request request, str slug)
Response post(self, Request request)
None async_register_http_views(HomeAssistant hass)