|
'''
|
|
This borrows extensivelly from Gnome Network Monitor
|
|
https://gnetworkmonitor.svn.sourceforge.net/svnroot/gnetworkmonitor/trunk/
|
|
Gnome-network-monitor is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, version 2 of the License.
|
|
'''
|
|
import socket
|
|
import fcntl
|
|
SIOCGIFHWADDR = 0x8927 # MAC address
|
|
SIOCGIFADDR = 0x8915 # IPv4 address
|
|
SIOCGIFNETMASK = 0x891B # interface mask
|
|
SIOCGIFBRDADDR = 0x8919 # broadcast address
|
|
|
|
|
|
|
|
#def get_interfaces():
|
|
#"""
|
|
#Returns a list of all network interfaces present, such as [eth0, eth1, lo]
|
|
#"""
|
|
fl = open('/proc/net/dev','r')
|
|
lines = fl.readlines()
|
|
fl.seek(0)
|
|
print [ l[:l.find(":")].strip() for l in lines if ":" in l ]
|
|
# end def get_interfaces():
|
|
|
|
|
|
#def get_iface_statistics(iface):
|
|
keys_dyn_data = ["bytes_in", "packets_in","errors_in", "bytes_out", "packets_out","errors_out" ]
|
|
a = 'eth0'
|
|
delim = "%s:" % (a) # "eth0:"
|
|
if_numbers = [ t.strip().strip(delim) for t in lines if delim in t ][0]
|
|
iface_data = dict(zip(keys_dyn_data, [ int(if_numbers.split()[index]) for index in (0, 1, 2, 8, 9, 10)]))
|
|
print iface_data
|
|
#end def get_iface_statistics
|
|
|
|
|
|
#helper for get_MAC_address
|
|
def strip_hex(n):
|
|
return "%02x" % (ord(n))
|
|
# end helper for get_MAC_address
|
|
|
|
#def get_MAC_address(self, iface):
|
|
"""
|
|
Returns the MAC address for an interface or None if the
|
|
interface does not have one.
|
|
"""
|
|
iface = 'eth0'
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
iface = iface.strip()
|
|
ifr = iface + '\0'*(32-len(iface))
|
|
|
|
try:
|
|
r = fcntl.ioctl(s.fileno(), SIOCGIFADDR, ifr)
|
|
addr = map(strip_hex, r[18:24])
|
|
ret = (':'.join(map(str, addr)))
|
|
except IOError:
|
|
ret = ''
|
|
print ret
|
|
# end def get_MAC_address(self, iface):
|
|
|
|
#helper for iface data except MAC
|
|
#def __get_socket_data(self, iface, ioctl_const):
|
|
def get_socket_data(iface, ioctl_const):
|
|
#"""
|
|
#Calls ioctl with a given constant.
|
|
#"""
|
|
sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
ifreq = (iface + '\0'*32)[:32]
|
|
try:
|
|
result = fcntl.ioctl(sockfd.fileno(), ioctl_const, ifreq)
|
|
return socket.inet_ntoa(result[20:24])
|
|
except IOError:
|
|
return "None"
|
|
# end helper for iface data except MAC
|
|
|
|
print get_socket_data('eth0', SIOCGIFADDR)
|
|
print get_socket_data('eth0', SIOCGIFNETMASK)
|
|
print get_socket_data('eth0', SIOCGIFBRDADDR)
|
|
|