From 18325251bf4672538764be28c2df720b04a8e2f4 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Wed, 7 Mar 2007 18:22:30 -0700 Subject: [PATCH] iputil: add get_local_addresses(), an attempt to enumerate all IPv4 addresses on this host. This is pretty unix-specific for right now (it calls ifconfig) --- src/allmydata/test/test_iputil.py | 14 ++++++++++++++ src/allmydata/util/iputil.py | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/allmydata/test/test_iputil.py diff --git a/src/allmydata/test/test_iputil.py b/src/allmydata/test/test_iputil.py new file mode 100644 index 00000000..7a064a4f --- /dev/null +++ b/src/allmydata/test/test_iputil.py @@ -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 + diff --git a/src/allmydata/util/iputil.py b/src/allmydata/util/iputil.py index bfa5b5f9..6c52c64e 100644 --- a/src/allmydata/util/iputil.py +++ b/src/allmydata/util/iputil.py @@ -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. -- 2.45.2