Merge pull request #36 from akutz/feature/additional-network-filters
Additional network filters
diff --git a/DataSourceVMwareGuestInfo.py b/DataSourceVMwareGuestInfo.py
index 2cb589a..73b9219 100644
--- a/DataSourceVMwareGuestInfo.py
+++ b/DataSourceVMwareGuestInfo.py
@@ -23,6 +23,7 @@
import copy
from distutils.spawn import find_executable
from distutils.util import strtobool
+import ipaddress
import json
import os
import socket
@@ -557,6 +558,21 @@
return name
+def is_valid_ip_addr(val):
+ """
+ Returns false if the address is loopback, link local or unspecified;
+ otherwise true is returned.
+ """
+ addr = None
+ try:
+ addr = ipaddress.ip_address(val)
+ except:
+ return False
+ if addr.is_link_local or addr.is_loopback or addr.is_unspecified:
+ return False
+ return True
+
+
def get_host_info():
'''
Returns host information such as the host name and network interfaces.
@@ -607,15 +623,25 @@
key = mac
val = {}
if af_inet4:
- val["ipv4"] = af_inet4
+ af_inet4_vals = []
+ for ip_info in af_inet4:
+ if not is_valid_ip_addr(ip_info['addr']):
+ continue
+ af_inet4_vals.append(ip_info)
+ val["ipv4"] = af_inet4_vals
if af_inet6:
- val["ipv6"] = af_inet6
+ af_inet6_vals = []
+ for ip_info in af_inet6:
+ if not is_valid_ip_addr(ip_info['addr']):
+ continue
+ af_inet6_vals.append(ip_info)
+ val["ipv6"] = af_inet6_vals
by_mac[key] = val
if af_inet4:
for ip_info in af_inet4:
key = ip_info['addr']
- if key == '127.0.0.1':
+ if not is_valid_ip_addr(key):
continue
val = copy.deepcopy(ip_info)
del val['addr']
@@ -626,7 +652,7 @@
if af_inet6:
for ip_info in af_inet6:
key = ip_info['addr']
- if key == '::1':
+ if not is_valid_ip_addr(key):
continue
val = copy.deepcopy(ip_info)
del val['addr']
@@ -660,12 +686,26 @@
host_info = None
while host_info == None:
host_info = get_host_info()
- if wait_on_ipv4 and LOCAL_IPV4 not in host_info:
- LOG.info("ipv4 not ready")
- host_info = None
- if wait_on_ipv6 and LOCAL_IPV6 not in host_info:
- LOG.info("ipv6 not ready")
- host_info = None
+ if wait_on_ipv4:
+ ipv4_ready = False
+ if 'network' in host_info:
+ if 'interfaces' in host_info['network']:
+ if 'by-ipv4' in host_info['network']['interfaces']:
+ if len(host_info['network']['interfaces']['by-ipv4']) > 0:
+ ipv4_ready = True
+ if not ipv4_ready:
+ LOG.info("ipv4 not ready")
+ host_info = None
+ if wait_on_ipv6:
+ ipv6_ready = False
+ if 'network' in host_info:
+ if 'interfaces' in host_info['network']:
+ if 'by-ipv6' in host_info['network']['interfaces']:
+ if len(host_info['network']['interfaces']['by-ipv6']) > 0:
+ ipv6_ready = True
+ if not ipv6_ready:
+ LOG.info("ipv6 not ready")
+ host_info = None
if host_info == None:
LOG.info("waiting on network")
time.sleep(1)