X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sioc.py;h=f8872450a072b4c09c18204856834424c06dd439;hb=292045f14ff8b50814c61b706a4c6cf37bb7e576;hp=fd657efb7f4d822cfb5c486d6bd8730951850917;hpb=712ca0a3e915adbb8bc539756d0cf8af1d755575;p=pyplnet.git diff --git a/sioc.py b/sioc.py index fd657ef..f887245 100644 --- a/sioc.py +++ b/sioc.py @@ -1,4 +1,3 @@ -# $Id$ # vim:set ts=4 sw=4 expandtab: # (c) Copyright 2008 The Trustees of Princeton University @@ -6,6 +5,7 @@ import os import socket import fcntl import struct +import subprocess SIOCGIFADDR = 0x8915 SIOCGIFADDR_struct = "16xH2xI8x" @@ -33,28 +33,18 @@ def gifaddr(interface): return None def gifconf(): - try: - interfaces = os.listdir("/sys/class/net") - except: - interfaces = [] - s = None ret = {} - try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) - for interface in interfaces: - try: - ifreq = fcntl.ioctl(s.fileno(), SIOCGIFADDR, - struct.pack("16sH14x", interface, socket.AF_INET)) - (family, ip) = struct.unpack(SIOCGIFADDR_struct, ifreq) - if family == socket.AF_INET: - ret[interface] = _format_ip(ip) - else: - raise Exception - except: - ret[interface] = "0.0.0.0" - finally: - if s is not None: - s.close() + ip = subprocess.Popen(["/sbin/ip", "-4", "addr", "ls"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, close_fds=True) + (stdout, stderr) = ip.communicate() + # no wait is needed when using communicate + for line in stdout.split("\n"): + fields = [ field.strip() for field in line.split() ] + if fields and fields[0] == "inet": + # fields[-1] is the last column in fields, which has the interface name + # fields[1] has the IP address / netmask width + ret[fields[-1]] = fields[1].split("/")[0] return ret def gifhwaddr(interface):