Repository: brooklyn-server
Updated Branches:
  refs/heads/0.4.0 [created] 35b69e111


util for checking whether DNS resolution is bogus


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/79602449
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/79602449
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/79602449

Branch: refs/heads/0.4.0
Commit: 79602449e55ef263a4662366bf67d2bb96378f94
Parents: 6d4edd6
Author: Alex Heneveld <[email protected]>
Authored: Tue Sep 25 22:45:40 2012 -0400
Committer: Alex Heneveld <[email protected]>
Committed: Tue Sep 25 22:48:47 2012 -0400

----------------------------------------------------------------------
 .../main/java/brooklyn/util/NetworkUtils.java   | 42 ++++++++++++++++++++
 .../java/brooklyn/util/NetworkUtilsTest.java    |  7 ++++
 2 files changed, 49 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79602449/core/src/main/java/brooklyn/util/NetworkUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/NetworkUtils.java 
b/core/src/main/java/brooklyn/util/NetworkUtils.java
index 6190edf..c399c2b 100644
--- a/core/src/main/java/brooklyn/util/NetworkUtils.java
+++ b/core/src/main/java/brooklyn/util/NetworkUtils.java
@@ -7,8 +7,15 @@ import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Map;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.util.text.Identifiers;
+
 public class NetworkUtils {
 
+    private static final Logger log = 
LoggerFactory.getLogger(NetworkUtils.class);
+    
     public static final int MIN_PORT_NUMBER = 1;
     public static final int MAX_PORT_NUMBER = 65535;
     
@@ -93,5 +100,40 @@ public class NetworkUtils {
         
         return false;
     }
+
+    private static boolean triedUnresolvableHostname = false;
+    private static String cachedAddressOfUnresolvableHostname = null;
+    
+    /** returns null in a sane DNS environment, but if DNS provides a bogus 
address for made-up hostnames, this returns that address */
+    public synchronized static String getAddressOfUnresolvableHostname() {
+        if (triedUnresolvableHostname) return 
cachedAddressOfUnresolvableHostname;
+        String h = "noexistent-machine-"+Identifiers.makeRandomBase64Id(8);
+        try {
+            cachedAddressOfUnresolvableHostname = 
InetAddress.getByName(h).getHostAddress();
+            log.info("NetworkUtils detected 
"+cachedAddressOfUnresolvableHostname+" being returned by DNS for bogus 
hostnames ("+h+")");
+        } catch (Exception e) {
+            log.debug("NetworkUtils detected failure on DNS resolution of 
unknown hostname ("+h+" throws "+e+")");
+            cachedAddressOfUnresolvableHostname = null;
+        }
+        triedUnresolvableHostname = true;
+        return cachedAddressOfUnresolvableHostname;
+    }
+    
+    /** resolves the given hostname to an IP address, returning null if 
unresolvable or 
+     * if the resolution is bogus (eg 169.* subnet or a "catch-all" IP 
resolution supplied by some miscreant DNS services) */
+    public static InetAddress resolve(String hostname) {
+        try {
+            InetAddress a = InetAddress.getByName(hostname);
+            if (a==null) return null;
+            String ha = a.getHostAddress();
+            if (log.isDebugEnabled()) log.debug("NetworkUtils resolved 
"+hostname+" as "+a);
+            if (ha.equals(getAddressOfUnresolvableHostname())) return null;
+            if (ha.startsWith("169.")) return null;
+            return a;
+        } catch (Exception e) {
+            if (log.isDebugEnabled()) log.debug("NetworkUtils failed to 
resolve "+hostname+", threw "+e);
+            return null;
+        }
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/79602449/core/src/test/java/brooklyn/util/NetworkUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/NetworkUtilsTest.java 
b/core/src/test/java/brooklyn/util/NetworkUtilsTest.java
index fefb4ab..f09ca3d 100644
--- a/core/src/test/java/brooklyn/util/NetworkUtilsTest.java
+++ b/core/src/test/java/brooklyn/util/NetworkUtilsTest.java
@@ -10,6 +10,8 @@ import java.net.UnknownHostException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import brooklyn.util.text.Identifiers;
+
 public class NetworkUtilsTest {
 
     @Test
@@ -66,4 +68,9 @@ public class NetworkUtilsTest {
         Assert.assertTrue(NetworkUtils.isPrivateSubnet(address));
     }
 
+    @Test(groups="Integration")
+    public void testBogusHostnameUnresolvable() {
+        
Assert.assertEquals(NetworkUtils.resolve("bogus-hostname-"+Identifiers.makeRandomId(8)),
 null);
+    }
+
 }

Reply via email to