From 6218cd648db45e3d6b20e7640ce9a40feeeaade9 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" <nick@koston.org> Date: Fri, 20 Aug 2021 06:01:55 -0500 Subject: [PATCH] Update nmap_tracker to use the network integration (#54877) * Update nmap_tracker to use the network integration * fix redefine variable inner scope --- .../components/nmap_tracker/config_flow.py | 41 ++++++++----------- .../components/nmap_tracker/manifest.json | 2 +- requirements_all.txt | 1 - requirements_test_all.txt | 1 - 4 files changed, 18 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/nmap_tracker/config_flow.py b/homeassistant/components/nmap_tracker/config_flow.py index eaea87e775a..a6d7d3ee74e 100644 --- a/homeassistant/components/nmap_tracker/config_flow.py +++ b/homeassistant/components/nmap_tracker/config_flow.py @@ -4,16 +4,16 @@ from __future__ import annotations from ipaddress import ip_address, ip_network, summarize_address_range from typing import Any -import ifaddr import voluptuous as vol from homeassistant import config_entries +from homeassistant.components import network from homeassistant.components.device_tracker.const import CONF_SCAN_INTERVAL +from homeassistant.components.network.const import MDNS_TARGET_IP from homeassistant.const import CONF_EXCLUDE, CONF_HOSTS -from homeassistant.core import callback +from homeassistant.core import HomeAssistant, callback from homeassistant.data_entry_flow import FlowResult import homeassistant.helpers.config_validation as cv -from homeassistant.util import get_local_ip from .const import ( CONF_HOME_INTERVAL, @@ -26,24 +26,20 @@ from .const import ( DEFAULT_NETWORK_PREFIX = 24 -def get_network(): +async def async_get_network(hass: HomeAssistant) -> str: """Search adapters for the network.""" - adapters = ifaddr.get_adapters() - local_ip = get_local_ip() - network_prefix = ( - get_ip_prefix_from_adapters(local_ip, adapters) or DEFAULT_NETWORK_PREFIX - ) + # We want the local ip that is most likely to be + # on the LAN and not the WAN so we use MDNS_TARGET_IP + local_ip = await network.async_get_source_ip(hass, MDNS_TARGET_IP) + network_prefix = DEFAULT_NETWORK_PREFIX + for adapter in await network.async_get_adapters(hass): + for ipv4 in adapter["ipv4"]: + if ipv4["address"] == local_ip: + network_prefix = ipv4["network_prefix"] + break return str(ip_network(f"{local_ip}/{network_prefix}", False)) -def get_ip_prefix_from_adapters(local_ip, adapters): - """Find the network prefix for an adapter.""" - for adapter in adapters: - for ip_cfg in adapter.ips: - if local_ip == ip_cfg.ip: - return ip_cfg.network_prefix - - def _normalize_ips_and_network(hosts_str): """Check if a list of hosts are all ips or ip networks.""" @@ -64,19 +60,16 @@ def _normalize_ips_and_network(hosts_str): continue try: - ip_addr = ip_address(host) + normalized_hosts.append(str(ip_address(host))) except ValueError: pass else: - normalized_hosts.append(str(ip_addr)) continue try: - network = ip_network(host) + normalized_hosts.append(str(ip_network(host))) except ValueError: return None - else: - normalized_hosts.append(str(network)) return normalized_hosts @@ -100,9 +93,9 @@ def normalize_input(user_input): async def _async_build_schema_with_user_input(hass, user_input, include_options): - hosts = user_input.get(CONF_HOSTS, await hass.async_add_executor_job(get_network)) + hosts = user_input.get(CONF_HOSTS, await async_get_network(hass)) exclude = user_input.get( - CONF_EXCLUDE, await hass.async_add_executor_job(get_local_ip) + CONF_EXCLUDE, await network.async_get_source_ip(hass, MDNS_TARGET_IP) ) schema = { vol.Required(CONF_HOSTS, default=hosts): str, diff --git a/homeassistant/components/nmap_tracker/manifest.json b/homeassistant/components/nmap_tracker/manifest.json index ee05843c4fe..bbd15834ef2 100644 --- a/homeassistant/components/nmap_tracker/manifest.json +++ b/homeassistant/components/nmap_tracker/manifest.json @@ -2,10 +2,10 @@ "domain": "nmap_tracker", "name": "Nmap Tracker", "documentation": "https://www.home-assistant.io/integrations/nmap_tracker", + "dependencies": ["network"], "requirements": [ "netmap==0.7.0.2", "getmac==0.8.2", - "ifaddr==0.1.7", "mac-vendor-lookup==0.1.11" ], "codeowners": ["@bdraco"], diff --git a/requirements_all.txt b/requirements_all.txt index 667a1803924..8ddac2bd76b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -841,7 +841,6 @@ ibmiotf==0.3.4 icmplib==3.0 # homeassistant.components.network -# homeassistant.components.nmap_tracker ifaddr==0.1.7 # homeassistant.components.iglo diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f4b934e5a6b..5a03aaca96f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -490,7 +490,6 @@ iaqualink==0.3.90 icmplib==3.0 # homeassistant.components.network -# homeassistant.components.nmap_tracker ifaddr==0.1.7 # homeassistant.components.influxdb