diff --git a/src/wormhole/ipaddrs.py b/src/wormhole/ipaddrs.py new file mode 100644 index 0000000..faab34a --- /dev/null +++ b/src/wormhole/ipaddrs.py @@ -0,0 +1,71 @@ + +# Find all of our ip addresses. From tahoe's src/allmydata/util/iputil.py + +import os, re, subprocess, errno +from sys import platform + +# Wow, I'm really amazed at home much mileage we've gotten out of calling +# the external route.exe program on windows... It appears to work on all +# versions so far. Still, the real system calls would much be preferred... +# ... thus wrote Greg Smith in time immemorial... +_win32_re = re.compile(r'^\s*\d+\.\d+\.\d+\.\d+\s.+\s(?P
\d+\.\d+\.\d+\.\d+)\s+(?P\d+)\s*$', flags=re.M|re.I|re.S) +_win32_commands = (('route.exe', ('print',), _win32_re),) + +# These work in most Unices. +_addr_re = re.compile(r'^\s*inet [a-zA-Z]*:?(?P
\d+\.\d+\.\d+\.\d+)[\s/].+$', flags=re.M|re.I|re.S) +_unix_commands = (('/bin/ip', ('addr',), _addr_re), + ('/sbin/ifconfig', ('-a',), _addr_re), + ('/usr/sbin/ifconfig', ('-a',), _addr_re), + ('/usr/etc/ifconfig', ('-a',), _addr_re), + ('ifconfig', ('-a',), _addr_re), + ('/sbin/ifconfig', (), _addr_re), + ) + + +def find_addresses(): + # originally by Greg Smith, hacked by Zooko and then Daira + + # We don't reach here for cygwin. + if platform == 'win32': + commands = _win32_commands + else: + commands = _unix_commands + + for (pathtotool, args, regex) in commands: + assert os.path.isabs(pathtotool) + if not os.path.isfile(pathtotool): + continue + try: + addresses = _query(pathtotool, args, regex) + except Exception: + addresses = [] + if addresses: + return addresses + return [] + +def _query(path, args, regex): + env = {'LANG': 'en_US.UTF-8'} + TRIES = 5 + for trial in xrange(TRIES): + try: + p = subprocess.Popen([path] + list(args), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env) + (output, err) = p.communicate() + break + except OSError, e: + if e.errno == errno.EINTR and trial < TRIES-1: + continue + raise + + addresses = [] + outputsplit = output.split('\n') + for outline in outputsplit: + m = regex.match(outline) + if m: + addr = m.group('address') + if addr not in addresses: + addresses.append(addr) + + return addresses