1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-16 18:22:22 +01:00

Fix dashboard dns lookup delay

This commit is contained in:
J. Nick Koston
2025-09-11 18:25:06 -05:00
parent 519bc5ef9e
commit bc9d16289e
3 changed files with 53 additions and 4 deletions

View File

@@ -6,6 +6,9 @@ import os
import re
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from esphome.address_cache import AddressCache
from esphome.const import (
CONF_COMMENT,
CONF_ESPHOME,
@@ -584,7 +587,7 @@ class EsphomeCore:
# The current component being processed during validation
self.current_component: str | None = None
# Address cache for DNS and mDNS lookups from command line arguments
self.address_cache: object | None = None
self.address_cache: AddressCache | None = None
def reset(self):
from esphome.pins import PIN_SCHEMA_REGISTRY

View File

@@ -364,14 +364,16 @@ class EsphomePortCommandWebSocket(EsphomeCommandWebSocket):
addresses.extend(sort_ip_addresses(cached))
dns_cache_entries[entry.name] = set(cached)
# Build cache arguments to pass to CLI
# Build cache arguments to pass to CLI (normalize hostnames)
for hostname, addrs in dns_cache_entries.items():
normalized = hostname.rstrip(".").lower()
cache_args.extend(
["--dns-lookup-cache", f"{hostname}={','.join(sorted(addrs))}"]
["--dns-lookup-cache", f"{normalized}={','.join(sorted(addrs))}"]
)
for hostname, addrs in mdns_cache_entries.items():
normalized = hostname.rstrip(".").lower()
cache_args.extend(
["--mdns-lookup-cache", f"{hostname}={','.join(sorted(addrs))}"]
["--mdns-lookup-cache", f"{normalized}={','.join(sorted(addrs))}"]
)
if not addresses:

View File

@@ -581,3 +581,47 @@ def test_address_cache_get_methods() -> None:
assert cache.has_cache() is True
empty_cache = AddressCache()
assert empty_cache.has_cache() is False
def test_address_cache_hostname_normalization() -> None:
"""Test that hostnames are normalized for cache lookups."""
from esphome.address_cache import normalize_hostname
# Test normalize_hostname function
assert normalize_hostname("test.local") == "test.local"
assert normalize_hostname("test.local.") == "test.local"
assert normalize_hostname("TEST.LOCAL") == "test.local"
assert normalize_hostname("TeSt.LoCaL.") == "test.local"
assert normalize_hostname("example.com.") == "example.com"
# Test cache with normalized lookups
cache = AddressCache(
mdns_cache={"test.local": ["192.168.1.1"]},
dns_cache={"example.com": ["10.0.0.1"]},
)
# Should find with different case and trailing dots
assert cache.get_mdns_addresses("test.local") == ["192.168.1.1"]
assert cache.get_mdns_addresses("TEST.LOCAL") == ["192.168.1.1"]
assert cache.get_mdns_addresses("test.local.") == ["192.168.1.1"]
assert cache.get_mdns_addresses("TEST.LOCAL.") == ["192.168.1.1"]
assert cache.get_dns_addresses("example.com") == ["10.0.0.1"]
assert cache.get_dns_addresses("EXAMPLE.COM") == ["10.0.0.1"]
assert cache.get_dns_addresses("example.com.") == ["10.0.0.1"]
assert cache.get_dns_addresses("EXAMPLE.COM.") == ["10.0.0.1"]
# Test from_cli_args also normalizes
cache = AddressCache.from_cli_args(
["TEST.LOCAL.=192.168.1.1"], ["EXAMPLE.COM.=10.0.0.1"]
)
# Should store as normalized
assert "test.local" in cache.mdns_cache
assert "example.com" in cache.dns_cache
# Should find with any variation
assert cache.get_addresses("test.local") == ["192.168.1.1"]
assert cache.get_addresses("TEST.LOCAL.") == ["192.168.1.1"]
assert cache.get_addresses("example.com") == ["10.0.0.1"]
assert cache.get_addresses("EXAMPLE.COM.") == ["10.0.0.1"]