]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
iputil: add get_local_addresses(), an attempt to enumerate all IPv4 addresses on...
authorBrian Warner <warner@lothar.com>
Thu, 8 Mar 2007 01:22:30 +0000 (18:22 -0700)
committerBrian Warner <warner@lothar.com>
Thu, 8 Mar 2007 01:22:30 +0000 (18:22 -0700)
src/allmydata/test/test_iputil.py [new file with mode: 0644]
src/allmydata/util/iputil.py

diff --git a/src/allmydata/test/test_iputil.py b/src/allmydata/test/test_iputil.py
new file mode 100644 (file)
index 0000000..7a064a4
--- /dev/null
@@ -0,0 +1,14 @@
+
+from twisted.trial import unittest
+from allmydata.util.iputil import get_local_addresses
+
+class ListAddresses(unittest.TestCase):
+    def test_list(self):
+        d = get_local_addresses()
+        def _check(addresses):
+            self.failUnless(len(addresses) >= 1) # always have localhost
+            self.failUnless("127.0.0.1" in addresses)
+            print addresses
+        d.addCallbacks(_check)
+        return d
+
index bfa5b5f986f30fd9c28fe6a833449c045fa8ecde..6c52c64eae59d4f45bf35732a669060ef30c2ce5 100644 (file)
@@ -1,9 +1,36 @@
 
 # adapted from nattraverso.ipdiscover
 
+from cStringIO import StringIO
+import re
 import socket
 from twisted.internet import reactor
 from twisted.internet.protocol import DatagramProtocol
+from twisted.internet.utils import getProcessOutput
+
+def get_local_addresses():
+    """Return a Deferred that fires with a list of IPv4 addresses (as
+    dotted-quad strings) that are currently configured on this host.
+    """
+    # eventually I want to use somebody else's cross-platform library for
+    # this. For right now, I'm running ifconfig and grepping for the 'inet '
+    # lines.
+    cmd = "ifconfig"
+    d = getProcessOutput("ifconfig")
+    def _parse(output):
+        addresses = []
+        for line in StringIO(output).readlines():
+            # linux shows: "   inet addr:1.2.3.4  Bcast:1.2.3.255..."
+            # OS-X shows: "   inet 1.2.3.4 ..."
+            m = re.match("^\s+inet\s+[a-z:]*([\d\.]+)\s", line)
+            if m:
+                addresses.append(m.group(1))
+        return addresses
+    def _fallback(f):
+        return ["127.0.0.1", get_local_ip_for()]
+    d.addCallbacks(_parse, _fallback)
+    return d
+
 
 def get_local_ip_for(target='A.ROOT-SERVERS.NET'):
     """Find out what our IP address is for use by a given target.