The fab21 patch 1 #38
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Speed up discovery and keep hostnames (post-resolution)
Summary
This PR makes network_scanner much faster on Docker/Synology setups while still exposing hostnames.
Key idea: perform a fast, DNS-free discovery with Nmap, then do a targeted reverse-DNS only for active hosts, with a very short timeout. It also normalizes hostnames to the short label (e.g., Tuya_plug.santoni.ch → tuya_plug).
Motivation
Using Nmap with DNS resolution (-R or default reverse lookups) can introduce ~seconds of delay per IP on bridged Docker networks (PTR timeouts via the embedded resolver).
Disabling DNS with -n is fast but loses hostnames.
We want both: speed and useful hostnames.
What changed (from the original file)
Fast scan arguments
From: -sn
To: -sn -n -T4
Reason: discovery without DNS (-n) and with more aggressive timing (-T4) is dramatically faster, especially inside containers.
Post-scan reverse-DNS with short timeout
After Nmap returns active hosts, we attempt socket.gethostbyaddr(ip) only for hosts that lack a name from Nmap, using a very small timeout (e.g., 300 ms) to avoid global slowdowns.
Hostname normalization
New helper to convert any hostname to a “short label”: trim trailing dot, take the part before the first dot, lowercase it, and strip non [a-z0-9_-].
Example: Tuya_plug.santoni.ch → tuya_plug.
Robust extraction of names from Nmap output
Prefer nm[host].hostname(), but also check the hostnames list if present.
Safety & cleanliness
Restore the original default socket timeout after each reverse-DNS attempt so we don’t affect Home Assistant internals.
Keep vendor detection and MAC mapping behavior unchanged.
Preserve sorting by IP as before.
Implementation highlights
New utilities:
_short_label(name: str) -> str | None
_fast_rdns(ip: str, timeout: float = 0.3) -> str | None
Scan flow:
self.nm.scan(hosts=self.ip_range, arguments='-sn -n -T4')
For each active host:
read IP/MAC/vendor
get raw hostname from Nmap (and/or hostnames list)
normalize with _short_label
if empty, try _fast_rdns(ip); normalize that result too
Backwards compatibility
Entity name, attributes, and structure remain the same (devices list with ip, mac, name, type, vendor, hostname).
Only behavioral change is faster scans and more consistent short hostnames.
Performance impact
Eliminates per-IP PTR delays during discovery.
Reverse-DNS is done only for discovered hosts and with a tiny timeout → bounded, predictable latency even on /24 networks.
Testing
Docker + Synology (bridge): verified that a /24 scan completes quickly and hostnames appear where PTR exists or via Nmap’s own results.
Verified hostname normalization on FQDNs (.local, domain FQDNs, trailing dot).
Ensured default socket timeout is restored after each lookup.