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)