Septiembre
2008
Mi primer paquete en Debian
python-netifaces es un pequeño módulo de python que permite obtener información de los interfaces de red.
Desde hace unas versiones es dependencia de TcosMonitor (encuentra interfaces del tipo eth0:1 cosa que con /sys/class/net no es posible)
Como hay que empezar por algo, entré en el IRC del grupo de empaquetadores de módulos python y me echaron una mano (bastante grande por cierto) para que el paquete estuviese lo mejor posible. Después de haber mandado un ITP, ayer ha sido subido a NEW, y acaba de ser etiquetado como pendiente.
La forma de usarlo es muy sencilla:
$ python
>>> import netifaces
>>> dir(netifaces)
['AF_APPLETALK', 'AF_ASH', 'AF_ATMPVC', 'AF_ATMSVC', 'AF_AX25', 'AF_BLUETOOTH', 'AF_BRIDGE', 'AF_DECnet', 'AF_ECONET', 'AF_FILE', 'AF_INET', 'AF_INET6', 'AF_IPX', 'AF_IRDA', 'AF_KEY', 'AF_LINK', 'AF_NETBEUI', 'AF_NETLINK', 'AF_NETROM', 'AF_PACKET', 'AF_PPPOX', 'AF_ROSE', 'AF_ROUTE', 'AF_SECURITY', 'AF_SNA', 'AF_UNIX', 'AF_UNSPEC', 'AF_WANPIPE', 'AF_X25', '__doc__', '__file__', '__name__', 'ifaddresses', 'interfaces']>>> netifaces.interfaces()
['lo', 'eth0', 'br0', 'vbox0', 'vbox1', 'vbox2']>>> for iface in netifaces.interfaces():
IFACE: lo {17: [{'peer': '00:00:00:00:00:00', 'addr': '00:00:00:00:00:00'}], 2: [{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', 'addr': '::1'}]}
... print "IFACE: ", iface, " ", netifaces.ifaddresses(iface)
...
IFACE: eth0 {17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:1a:6b:6a:xx:xx'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::21a:6bff:fe6a:bec9%eth0'}]}
IFACE: br0 {17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:1a:6b:6a:xx:xx'}], 2: [{'broadcast': '192.168.0.255', 'netmask': '255.255.255.0', 'addr': '192.168.0.3'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::21a:6bff:fe6a:bec9%br0'}]}
IFACE: vbox0 {17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:ff:eb:8c:87:f0'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::2ff:ebff:fe8c:87f0%vbox0'}]}
IFACE: vbox1 {17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:ff:b0:e6:18:e8'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::2ff:b0ff:fee6:18e8%vbox1'}]}
IFACE: vbox2 {17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:ff:d4:4c:e8:67'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::2ff:d4ff:fe4c:e867%vbox2'}]}
Como vemos devuelve un diccionario con la información de cada interfaz, para sacar los datos IPV4 (lo más usual):
>>> netifaces.ifaddresses('br0')[netifaces.AF_INET]
[{'broadcast': '192.168.0.255', 'netmask': '255.255.255.0', 'addr': '192.168.0.3'}]
Quizás como última mejora le falta obtener la puerta de enlace (por ejemplo a través de /proc/net/route, mediante la tercera columna, hay que pasarlo a decimal y rotarlo), yo en tcosmonitor lo he ampliado mediante python.