From 68ef55a98214e33f331fd603ed6762cff64bdc24 Mon Sep 17 00:00:00 2001 From: Dan Date: Sat, 3 Sep 2016 19:41:38 -0400 Subject: [PATCH] Add exclude option to nmap device tracker (#2983) * Add exclude option to nmap device tracker Adds an optional exclude paramater to nmap device tracker. Devices specified in the exclude list will never be scanned by nmap. This can help to reduce log spam. ex: ``` device_tracker: - platform: nmap_tracker hosts: 10.0.0.1/24 home_interval: 1 interval_seconds: 12 consider_home: 120 track_new_devices: yes exclude: - 10.0.0.2 - 10.0.0.1 ``` * Handle optional exclude * Style fixed --- .../components/device_tracker/nmap_tracker.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/device_tracker/nmap_tracker.py b/homeassistant/components/device_tracker/nmap_tracker.py index 7b9f2e9036b..e23d5f31145 100644 --- a/homeassistant/components/device_tracker/nmap_tracker.py +++ b/homeassistant/components/device_tracker/nmap_tracker.py @@ -22,7 +22,8 @@ MIN_TIME_BETWEEN_SCANS = timedelta(seconds=5) _LOGGER = logging.getLogger(__name__) # Interval in minutes to exclude devices from a scan while they are home -CONF_HOME_INTERVAL = "home_interval" +CONF_HOME_INTERVAL = 'home_interval' +CONF_EXCLUDE = 'exclude' REQUIREMENTS = ['python-nmap==0.6.1'] @@ -60,6 +61,7 @@ class NmapDeviceScanner(object): self.last_results = [] self.hosts = config[CONF_HOSTS] + self.exclude = config.get(CONF_EXCLUDE, []) minutes = convert(config.get(CONF_HOME_INTERVAL), int, 0) self.home_interval = timedelta(minutes=minutes) @@ -93,7 +95,8 @@ class NmapDeviceScanner(object): from nmap import PortScanner, PortScannerError scanner = PortScanner() - options = "-F --host-timeout 5s" + options = "-F --host-timeout 5s " + exclude = "--exclude " if self.home_interval: boundary = dt_util.now() - self.home_interval @@ -102,10 +105,16 @@ class NmapDeviceScanner(object): if last_results: # Pylint is confused here. # pylint: disable=no-member - options += " --exclude {}".format(",".join(device.ip for device - in last_results)) + exclude_hosts = self.exclude + [device.ip for device + in last_results] + else: + exclude_hosts = self.exclude else: last_results = [] + exclude_hosts = self.exclude + if exclude_hosts: + exclude = " --exclude {}".format(",".join(exclude_hosts)) + options += exclude try: result = scanner.scan(hosts=self.hosts, arguments=options)