core/homeassistant/components/webdav/__init__.py

76 lines
2.3 KiB
Python

"""The WebDAV integration."""
from __future__ import annotations
import logging
from aiowebdav2.client import Client
from aiowebdav2.exceptions import UnauthorizedError
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME, CONF_VERIFY_SSL
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryError, ConfigEntryNotReady
from .const import CONF_BACKUP_PATH, DATA_BACKUP_AGENT_LISTENERS, DOMAIN
from .helpers import (
async_create_client,
async_ensure_path_exists,
async_migrate_wrong_folder_path,
)
type WebDavConfigEntry = ConfigEntry[Client]
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: WebDavConfigEntry) -> bool:
"""Set up WebDAV from a config entry."""
client = async_create_client(
hass=hass,
url=entry.data[CONF_URL],
username=entry.data[CONF_USERNAME],
password=entry.data[CONF_PASSWORD],
verify_ssl=entry.data.get(CONF_VERIFY_SSL, True),
)
try:
result = await client.check()
except UnauthorizedError as err:
raise ConfigEntryError(
translation_domain=DOMAIN,
translation_key="invalid_username_password",
) from err
# Check if we can connect to the WebDAV server
# and access the root directory
if not result:
raise ConfigEntryNotReady(
translation_domain=DOMAIN,
translation_key="cannot_connect",
)
path = entry.data.get(CONF_BACKUP_PATH, "/")
await async_migrate_wrong_folder_path(client, path)
# Ensure the backup directory exists
if not await async_ensure_path_exists(client, path):
raise ConfigEntryNotReady(
translation_domain=DOMAIN,
translation_key="cannot_access_or_create_backup_path",
)
entry.runtime_data = client
def async_notify_backup_listeners() -> None:
for listener in hass.data.get(DATA_BACKUP_AGENT_LISTENERS, []):
listener()
entry.async_on_unload(entry.async_on_state_change(async_notify_backup_listeners))
return True
async def async_unload_entry(hass: HomeAssistant, entry: WebDavConfigEntry) -> bool:
"""Unload a WebDAV config entry."""
return True