1 """Diagnostics support for UniFi Network."""
3 from __future__
import annotations
5 from collections.abc
import Mapping
6 from itertools
import chain
14 from .
import UnifiConfigEntry
16 TO_REDACT = {CONF_PASSWORD}
17 REDACT_CONFIG = {CONF_HOST, CONF_PASSWORD, CONF_USERNAME}
18 REDACT_CLIENTS = {
"bssid",
"essid"}
27 "x_ssh_hostkey_fingerprint",
30 REDACT_WLANS = {
"bc_filter_list",
"x_passphrase"}
35 data: Mapping, to_replace: dict[str, str]
37 """Redact sensitive data in a dict."""
39 for key, value
in data.items():
40 if isinstance(value, dict):
42 elif isinstance(value, (list, set, tuple)):
44 elif isinstance(value, str):
45 if value
in to_replace:
46 redacted[key] = to_replace[value]
47 elif value.count(
":") == 5:
48 redacted[key] = REDACTED
54 data: list | set | tuple, to_replace: dict[str, str]
56 """Redact sensitive data in a list."""
59 new_value: Any |
None =
None
60 if isinstance(item, (list, set, tuple)):
62 elif isinstance(item, Mapping):
64 elif isinstance(item, str):
65 if item
in to_replace:
66 new_value = to_replace[item]
67 elif item.count(
":") == 5:
69 redacted.append(new_value
or item)
74 hass: HomeAssistant, config_entry: UnifiConfigEntry
76 """Return diagnostics for a config entry."""
77 hub = config_entry.runtime_data
78 diag: dict[str, Any] = {}
79 macs_to_redact: dict[str, str] = {}
82 for mac
in chain(hub.api.clients, hub.api.devices):
86 for device
in hub.api.devices.values():
87 for entry
in device.raw.get(
"ethernet_table", []):
88 mac = entry.get(
"mac",
"")
89 if mac
not in macs_to_redact:
96 diag[
"role_is_admin"] = hub.is_admin
101 for k, v
in hub.api.clients.items()
107 for k, v
in hub.api.devices.items()
109 diag[
"dpi_apps"] = {k: v.raw
for k, v
in hub.api.dpi_apps.items()}
110 diag[
"dpi_groups"] = {k: v.raw
for k, v
in hub.api.dpi_groups.items()}
115 for k, v
in hub.api.wlans.items()
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
dict[str, Any] async_replace_dict_data(Mapping data, dict[str, str] to_replace)
list[Any] async_replace_list_data(list|set|tuple data, dict[str, str] to_replace)
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, UnifiConfigEntry config_entry)