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); + } + }
