portable Python ifconfig

Bart Van Loon bbbart at inGen.be
Sun Mar 4 07:36:01 CET 2007


It was 3 Mar 2007 18:43:57 -0800, when MonkeeSage wrote:
> Bart,
>
> Can you try this and let us know if it works for FreeBSD?

thanks for you suggestions!

> import socket, fcntl, struct
>
> def _ifinfo(sock, addr, ifname):
>     iface = struct.pack('256s', ifname[:15])
>     info  = fcntl.ioctl(sock.fileno(), addr, iface)
>     if addr == 0x8927:
>         hwaddr = []
>         for char in info[18:24]:
>             hwaddr.append(hex(ord(char))[2:])
>         return ':'.join(hwaddr)
>     else:
>         return socket.inet_ntoa(info[20:24])
>
> def ifconfig(ifname):
>     ifreq = {'ifname': ifname}
>     sock  = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>     try:
>         ifreq['addr']    = _ifinfo(sock, 0x8915, ifname) # SIOCGIFADDR
>         ifreq['brdaddr'] = _ifinfo(sock, 0x8919, ifname) #
> SIOCGIFBRDADDR
>         ifreq['netmask'] = _ifinfo(sock, 0x891b, ifname) #
> SIOCGIFNETMASK
>         ifreq['hwaddr']  = _ifinfo(sock, 0x8927, ifname) #
> SIOCSIFHWADDR
>     except:
>         pass
>     sock.close()
>     return ifreq

apparenlty, it doesn't. :-(

I changes the except block into

    except Exception, e:
        print e

and added

if __name__ == '__main__':
     print ifconfig('ng0')
     print ifconfig('vr0')
     print ifconfig('vr2')
     print ifconfig('xl0')

ng0 exists and has an IP (virtual interface created by mpd)
vr0 exists but does not have an IP (phisical interface for mpd)
vr2 exists and has an IP configured
xl0 does not exist

output:

[Errno 25] Inappropriate ioctl for device
{'ifname': 'ng0'}
[Errno 25] Inappropriate ioctl for device
{'ifname': 'vr0'}
[Errno 25] Inappropriate ioctl for device
{'ifname': 'vr2'}
[Errno 25] Inappropriate ioctl for device
{'ifname': 'xl0'}

however, in Linux I get the following results:

[Errno 99] Cannot assign requested address
{'ifname': 'eth0'}
{'hwaddr': '0:17:f2:4c:a5:c', 'ifname': 'ath0', 'netmask': '255.255.255.0', 'addr': '192.168.50.104', 'brdaddr': '192.168.50.255'}
{'hwaddr': '0:0:0:0:0:0', 'ifname': 'tun0', 'netmask': '255.255.255.255', 'addr': '192.168.3.6', 'brdaddr': '0.0.0.0'}
[Errno 19] No such device
{'ifname': 'wielewoele'}

which seems 100% correct.

-- 
regards,
BBBart

   Susie: You'd get a good grade without doing any work.  
   Calvin: So?  
   Susie: It's wrong to get rewards you haven't earned.  
   Calvin: I've never heard of anyone who couldn't live with that.



More information about the Python-list mailing list