2016-10-31 13:03:16 +01:00
import pyroute2
import netifaces
import bumblebee . module
2016-10-31 16:08:03 +01:00
def usage ( ) :
return " nic "
def notes ( ) :
return " Interfaces starting with ' lo ' or ' virbr ' are ignored. Critical if the status of an interface is ' down ' , Warning if it is anything else but ' up ' . Interface status is derived from whether an IP address is available or not. "
def description ( ) :
return " Displays the names, IP addresses and status of each available interface. "
2016-10-31 13:03:16 +01:00
class Module ( bumblebee . module . Module ) :
2016-11-05 14:26:02 +01:00
def __init__ ( self , output , config , alias ) :
super ( Module , self ) . __init__ ( output , config , alias )
2016-11-03 19:45:12 +01:00
self . _exclude = ( " lo " , " virbr " , " docker " , " vboxnet " )
2016-10-31 13:03:16 +01:00
self . _state = " down "
2016-11-05 13:47:27 +01:00
self . _typecache = { }
2016-10-31 13:03:16 +01:00
2016-11-05 13:42:26 +01:00
def widgets ( self ) :
result = [ ]
interfaces = [ i for i in netifaces . interfaces ( ) if not i . startswith ( self . _exclude ) ]
2016-10-31 13:03:16 +01:00
addr = [ ]
2016-11-05 13:42:26 +01:00
state = " down "
for intf in interfaces :
try :
if netifaces . AF_INET in netifaces . ifaddresses ( intf ) :
for ip in netifaces . ifaddresses ( intf ) [ netifaces . AF_INET ] :
if " addr " in ip and ip [ " addr " ] != " " :
addr . append ( ip [ " addr " ] )
state = " up "
except Exception as e :
addr = [ ]
widget = bumblebee . output . Widget ( self , " {} {} {} " . format (
intf , state , " , " . join ( addr )
) )
widget . set ( " intf " , intf )
widget . set ( " state " , state )
result . append ( widget )
2016-10-31 13:03:16 +01:00
2016-11-05 13:42:26 +01:00
return result
2016-10-31 13:03:16 +01:00
def _iswlan ( self , intf ) :
2016-11-05 13:42:26 +01:00
iw = pyroute2 . IW ( )
ip = pyroute2 . IPRoute ( )
idx = ip . link_lookup ( ifname = intf ) [ 0 ]
try :
iw . get_interface_by_ifindex ( idx )
return True
except Exception as e :
return False
2016-10-31 13:03:16 +01:00
2016-10-31 13:34:48 +01:00
def _istunnel ( self , intf ) :
return intf . startswith ( " tun " )
2016-11-05 13:42:26 +01:00
def state ( self , widget ) :
intf = widget . get ( " intf " )
2016-10-31 13:09:52 +01:00
2016-11-05 13:47:27 +01:00
if not intf in self . _typecache :
t = " wireless " if self . _iswlan ( intf ) else " wired "
t = " tunnel " if self . _istunnel ( intf ) else t
self . _typecache [ intf ] = t
2016-10-31 13:34:48 +01:00
2016-11-05 13:47:27 +01:00
return " {} - {} " . format ( self . _typecache [ intf ] , widget . get ( " state " ) )
2016-10-31 13:03:16 +01:00
2016-11-05 13:42:26 +01:00
def warning ( self , widget ) :
return widget . get ( " state " ) != " up "
2016-10-31 13:03:16 +01:00
2016-11-05 13:42:26 +01:00
def critical ( self , widget ) :
return widget . get ( " state " ) == " down "
2016-10-31 13:03:16 +01:00
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4