1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-15 15:07:52 +02:00

Fix log retrieval with FQDN when mDNS is disabled (#11202)

This commit is contained in:
J. Nick Koston 2025-10-13 11:23:44 -10:00 committed by GitHub
parent 3df4dbd3a6
commit 9fb254fdc2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 14 deletions

View File

@ -268,8 +268,10 @@ def has_ip_address() -> bool:
def has_resolvable_address() -> bool: def has_resolvable_address() -> bool:
"""Check if CORE.address is resolvable (via mDNS or is an IP address).""" """Check if CORE.address is resolvable (via mDNS, DNS, or is an IP address)."""
return has_mdns() or has_ip_address() # Any address (IP, mDNS hostname, or regular DNS hostname) is resolvable
# The resolve_ip_address() function in helpers.py handles all types via AsyncResolver
return CORE.address is not None
def mqtt_get_ip(config: ConfigType, username: str, password: str, client_id: str): def mqtt_get_ip(config: ConfigType, username: str, password: str, client_id: str):
@ -578,11 +580,12 @@ def show_logs(config: ConfigType, args: ArgsProtocol, devices: list[str]) -> int
if has_api(): if has_api():
addresses_to_use: list[str] | None = None addresses_to_use: list[str] | None = None
if port_type == "NETWORK" and (has_mdns() or is_ip_address(port)): if port_type == "NETWORK":
# Network addresses (IPs, mDNS names, or regular DNS hostnames) can be used
# The resolve_ip_address() function in helpers.py handles all types
addresses_to_use = devices addresses_to_use = devices
elif port_type in ("NETWORK", "MQTT", "MQTTIP") and has_mqtt_ip_lookup(): elif port_type in ("MQTT", "MQTTIP") and has_mqtt_ip_lookup():
# Only use MQTT IP lookup if the first condition didn't match # Use MQTT IP lookup for MQTT/MQTTIP types
# (for MQTT/MQTTIP types, or for NETWORK when mdns/ip check fails)
addresses_to_use = mqtt_get_ip( addresses_to_use = mqtt_get_ip(
config, args.username, args.password, args.client_id config, args.username, args.password, args.client_id
) )

View File

@ -1203,6 +1203,31 @@ def test_show_logs_api(
) )
@patch("esphome.components.api.client.run_logs")
def test_show_logs_api_with_fqdn_mdns_disabled(
mock_run_logs: Mock,
) -> None:
"""Test show_logs with API using FQDN when mDNS is disabled."""
setup_core(
config={
"logger": {},
CONF_API: {},
CONF_MDNS: {CONF_DISABLED: True},
},
platform=PLATFORM_ESP32,
)
mock_run_logs.return_value = 0
args = MockArgs()
devices = ["device.example.com"]
result = show_logs(CORE.config, args, devices)
assert result == 0
# Should use the FQDN directly, not try MQTT lookup
mock_run_logs.assert_called_once_with(CORE.config, ["device.example.com"])
@patch("esphome.components.api.client.run_logs") @patch("esphome.components.api.client.run_logs")
def test_show_logs_api_with_mqtt_fallback( def test_show_logs_api_with_mqtt_fallback(
mock_run_logs: Mock, mock_run_logs: Mock,
@ -1222,7 +1247,7 @@ def test_show_logs_api_with_mqtt_fallback(
mock_mqtt_get_ip.return_value = ["192.168.1.200"] mock_mqtt_get_ip.return_value = ["192.168.1.200"]
args = MockArgs(username="user", password="pass", client_id="client") args = MockArgs(username="user", password="pass", client_id="client")
devices = ["device.local"] devices = ["MQTTIP"]
result = show_logs(CORE.config, args, devices) result = show_logs(CORE.config, args, devices)
@ -1487,27 +1512,31 @@ def test_mqtt_get_ip() -> None:
def test_has_resolvable_address() -> None: def test_has_resolvable_address() -> None:
"""Test has_resolvable_address function.""" """Test has_resolvable_address function."""
# Test with mDNS enabled and hostname address # Test with mDNS enabled and .local hostname address
setup_core(config={}, address="esphome-device.local") setup_core(config={}, address="esphome-device.local")
assert has_resolvable_address() is True assert has_resolvable_address() is True
# Test with mDNS disabled and hostname address # Test with mDNS disabled and .local hostname address (still resolvable via DNS)
setup_core( setup_core(
config={CONF_MDNS: {CONF_DISABLED: True}}, address="esphome-device.local" config={CONF_MDNS: {CONF_DISABLED: True}}, address="esphome-device.local"
) )
assert has_resolvable_address() is False assert has_resolvable_address() is True
# Test with IP address (mDNS doesn't matter) # Test with mDNS disabled and regular DNS hostname (resolvable)
setup_core(config={CONF_MDNS: {CONF_DISABLED: True}}, address="device.example.com")
assert has_resolvable_address() is True
# Test with IP address (always resolvable, mDNS doesn't matter)
setup_core(config={}, address="192.168.1.100") setup_core(config={}, address="192.168.1.100")
assert has_resolvable_address() is True assert has_resolvable_address() is True
# Test with IP address and mDNS disabled # Test with IP address and mDNS disabled (still resolvable)
setup_core(config={CONF_MDNS: {CONF_DISABLED: True}}, address="192.168.1.100") setup_core(config={CONF_MDNS: {CONF_DISABLED: True}}, address="192.168.1.100")
assert has_resolvable_address() is True assert has_resolvable_address() is True
# Test with no address but mDNS enabled (can still resolve mDNS names) # Test with no address
setup_core(config={}, address=None) setup_core(config={}, address=None)
assert has_resolvable_address() is True assert has_resolvable_address() is False
# Test with no address and mDNS disabled # Test with no address and mDNS disabled
setup_core(config={CONF_MDNS: {CONF_DISABLED: True}}, address=None) setup_core(config={CONF_MDNS: {CONF_DISABLED: True}}, address=None)