]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
iputil.get_local_ip_for: tolerate running on a disconnected host
authorBrian Warner <warner@lothar.com>
Fri, 8 Jun 2007 02:23:33 +0000 (19:23 -0700)
committerBrian Warner <warner@lothar.com>
Fri, 8 Jun 2007 02:23:33 +0000 (19:23 -0700)
src/allmydata/util/iputil.py

index 99f228d0f6dc91be84dbb57f566cd252bb93ff45..7759dd092e960ac35134f1bfef1b2518441c4745 100644 (file)
@@ -25,7 +25,9 @@ def get_local_addresses_async(target='A.ROOT-SERVERS.NET'):
         reachable to.
     """
     addresses = []
-    addresses.append(get_local_ip_for(target))
+    local_ip = get_local_ip_for(target)
+    if local_ip:
+        addresses.append(local_ip)
 
     if sys.platform == "cygwin":
         d = _cygwin_hack_find_addresses(target)
@@ -44,14 +46,25 @@ def get_local_addresses_async(target='A.ROOT-SERVERS.NET'):
 def get_local_ip_for(target):
     """Find out what our IP address is for use by a given target.
 
-    @returns: the IP address as a dotted-quad string which could be used by
-        'target' to connect to us. It might work for them, it might not
+    @returns:the IP address as a dotted-quad string which could be used by
+              to connect to us. It might work for them, it might not. If
+              there is no suitable address (perhaps we don't currently have an
+              externally-visible interface), this will return None.
     """
-    target_ipaddr = socket.gethostbyname(target)
+
+    try:
+        target_ipaddr = socket.gethostbyname(target)
+    except socket.gaierror:
+        # DNS isn't running
+        return None
     udpprot = DatagramProtocol()
     port = reactor.listenUDP(0, udpprot)
-    udpprot.transport.connect(target_ipaddr, 7)
-    localip = udpprot.transport.getHost().host
+    try:
+        udpprot.transport.connect(target_ipaddr, 7)
+        localip = udpprot.transport.getHost().host
+    except socket.error:
+        # no route to that host
+        localip = None
     port.stopListening() # note, this returns a Deferred
     return localip