Home Assistant Unofficial Reference 2024.12.1
config_flow.py
Go to the documentation of this file.
1 """Config flow for Webmin."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Mapping
6 from http import HTTPStatus
7 from typing import Any, cast
8 from xmlrpc.client import Fault
9 
10 from aiohttp.client_exceptions import ClientConnectionError, ClientResponseError
11 import voluptuous as vol
12 
13 from homeassistant.const import (
14  CONF_HOST,
15  CONF_PASSWORD,
16  CONF_PORT,
17  CONF_SSL,
18  CONF_USERNAME,
19  CONF_VERIFY_SSL,
20 )
21 from homeassistant.helpers import selector
23  SchemaCommonFlowHandler,
24  SchemaConfigFlowHandler,
25  SchemaFlowError,
26  SchemaFlowFormStep,
27 )
28 
29 from .const import DEFAULT_PORT, DEFAULT_SSL, DEFAULT_VERIFY_SSL, DOMAIN, LOGGER
30 from .helpers import get_instance_from_options, get_sorted_mac_addresses
31 
32 
34  handler: SchemaCommonFlowHandler, user_input: dict[str, Any]
35 ) -> dict[str, Any]:
36  """Validate user input."""
37  handler.parent_handler._async_abort_entries_match( # noqa: SLF001
38  {CONF_HOST: user_input[CONF_HOST]}
39  )
40  instance, _ = get_instance_from_options(handler.parent_handler.hass, user_input)
41  try:
42  data = await instance.update()
43  except ClientResponseError as err:
44  if err.status == HTTPStatus.UNAUTHORIZED:
45  raise SchemaFlowError("invalid_auth") from err
46  raise SchemaFlowError("cannot_connect") from err
47  except Fault as fault:
48  LOGGER.exception(f"Fault {fault.faultCode}: {fault.faultString}")
49  raise SchemaFlowError("unknown") from fault
50  except ClientConnectionError as err:
51  raise SchemaFlowError("cannot_connect") from err
52  except Exception as err:
53  raise SchemaFlowError("unknown") from err
54 
55  if len(mac_addresses := get_sorted_mac_addresses(data)) > 0:
56  await cast(SchemaConfigFlowHandler, handler.parent_handler).async_set_unique_id(
57  mac_addresses[0]
58  )
59  return user_input
60 
61 
62 CONFIG_SCHEMA = vol.Schema(
63  {
64  vol.Required(CONF_HOST): selector.TextSelector(),
65  vol.Required(CONF_PORT, default=DEFAULT_PORT): selector.NumberSelector(
66  selector.NumberSelectorConfig(
67  min=1, max=65535, mode=selector.NumberSelectorMode.BOX
68  )
69  ),
70  vol.Required(CONF_USERNAME): selector.TextSelector(),
71  vol.Required(CONF_PASSWORD): selector.TextSelector(
72  selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD)
73  ),
74  vol.Required(CONF_SSL, default=DEFAULT_SSL): selector.BooleanSelector(),
75  vol.Required(
76  CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL
77  ): selector.BooleanSelector(),
78  }
79 )
80 
81 CONFIG_FLOW = {
82  "user": SchemaFlowFormStep(
83  schema=CONFIG_SCHEMA, validate_user_input=validate_user_input
84  ),
85 }
86 
87 
89  """Handle a config flow for Webmin."""
90 
91  config_flow = CONFIG_FLOW
92 
93  def async_config_entry_title(self, options: Mapping[str, Any]) -> str:
94  """Return config entry title."""
95  return str(options[CONF_HOST])
str async_config_entry_title(self, Mapping[str, Any] options)
Definition: config_flow.py:93
str
dict[str, Any] validate_user_input(SchemaCommonFlowHandler handler, dict[str, Any] user_input)
Definition: config_flow.py:35
tuple[WebminInstance, URL] get_instance_from_options(HomeAssistant hass, Mapping[str, Any] options)
Definition: helpers.py:23
list[str] get_sorted_mac_addresses(dict[str, Any] data)
Definition: helpers.py:43