Home Assistant Unofficial Reference 2024.12.1
http.py
Go to the documentation of this file.
1 """Http view for the Backup integration."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from http import HTTPStatus
7 from typing import cast
8 
9 from aiohttp import BodyPartReader
10 from aiohttp.hdrs import CONTENT_DISPOSITION
11 from aiohttp.web import FileResponse, Request, Response
12 
13 from homeassistant.components.http import KEY_HASS, HomeAssistantView, require_admin
14 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.util import slugify
16 
17 from .const import DATA_MANAGER
18 
19 
20 @callback
21 def async_register_http_views(hass: HomeAssistant) -> None:
22  """Register the http views."""
23  hass.http.register_view(DownloadBackupView)
24  hass.http.register_view(UploadBackupView)
25 
26 
27 class DownloadBackupView(HomeAssistantView):
28  """Generate backup view."""
29 
30  url = "/api/backup/download/{slug}"
31  name = "api:backup:download"
32 
33  async def get(
34  self,
35  request: Request,
36  slug: str,
37  ) -> FileResponse | Response:
38  """Download a backup file."""
39  if not request["hass_user"].is_admin:
40  return Response(status=HTTPStatus.UNAUTHORIZED)
41 
42  manager = request.app[KEY_HASS].data[DATA_MANAGER]
43  backup = await manager.async_get_backup(slug=slug)
44 
45  if backup is None or not backup.path.exists():
46  return Response(status=HTTPStatus.NOT_FOUND)
47 
48  return FileResponse(
49  path=backup.path.as_posix(),
50  headers={
51  CONTENT_DISPOSITION: f"attachment; filename={slugify(backup.name)}.tar"
52  },
53  )
54 
55 
56 class UploadBackupView(HomeAssistantView):
57  """Generate backup view."""
58 
59  url = "/api/backup/upload"
60  name = "api:backup:upload"
61 
62  @require_admin
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())
68 
69  try:
70  await manager.async_receive_backup(contents=contents)
71  except OSError as err:
72  return Response(
73  body=f"Can't write backup file {err}",
74  status=HTTPStatus.INTERNAL_SERVER_ERROR,
75  )
76  except asyncio.CancelledError:
77  return Response(status=HTTPStatus.INTERNAL_SERVER_ERROR)
78 
79  return Response(status=HTTPStatus.CREATED)
FileResponse|Response get(self, Request request, str slug)
Definition: http.py:37
Response post(self, Request request)
Definition: http.py:63
None async_register_http_views(HomeAssistant hass)
Definition: http.py:21