network_traffic: allow to hide down interfaces

Interfaces which are down can be hidden or formatted differently.

The following options are added:
hide_down - whether to not display a interface which is down
format_down - format string if the interface is down (unless hide_down is set)
This commit is contained in:
Simon Legner 2014-10-30 08:23:00 +01:00
parent fbd44cd4dd
commit 9591de4461

View File

@ -21,12 +21,16 @@ class NetworkTraffic(IntervalModule):
interval = 1 interval = 1
settings = ( settings = (
("format", "format string"), ("format", "format string"),
("format_down", "format string if the interface is down (unless hide_down is set)"),
("hide_down", "whether to not display a interface which is down"),
("interface", "network interface"), ("interface", "network interface"),
("divisor", "divide all byte values by this value"), ("divisor", "divide all byte values by this value"),
("round_size", "defines number of digits in round"), ("round_size", "defines number of digits in round"),
) )
format = "{interface} \u2197{bytes_sent}kB/s \u2198{bytes_recv}kB/s" format = "{interface} \u2197{bytes_sent}kB/s \u2198{bytes_recv}kB/s"
format_down = "{interface} \u2013"
hide_down = True
interface = "eth0" interface = "eth0"
divisor = 1024 divisor = 1024
round_size = None round_size = None
@ -36,7 +40,8 @@ class NetworkTraffic(IntervalModule):
def update_counters(self): def update_counters(self):
self.pnic_before = self.pnic self.pnic_before = self.pnic
self.pnic = psutil.net_io_counters(pernic=True)[self.interface] counters = psutil.net_io_counters(pernic=True)
self.pnic = counters[self.interface] if self.interface in counters else None
def get_bytes_sent(self): def get_bytes_sent(self):
return (self.pnic.bytes_sent - self.pnic_before.bytes_sent) / self.divisor return (self.pnic.bytes_sent - self.pnic_before.bytes_sent) / self.divisor
@ -50,8 +55,18 @@ class NetworkTraffic(IntervalModule):
def get_packets_received(self): def get_packets_received(self):
return self.pnic.packets_recv - self.pnic_before.packets_recv return self.pnic.packets_recv - self.pnic_before.packets_recv
def sysfs_interface_up(self):
try:
sysfs = "/sys/class/net/{}/operstate".format(self.interface)
with open(sysfs) as operstate:
status = operstate.read().strip()
return status == "up" or status == "unknown"
except FileNotFoundError:
return False
def run(self): def run(self):
self.update_counters() self.update_counters()
if self.sysfs_interface_up():
if not self.pnic_before: if not self.pnic_before:
return return
cdict = { cdict = {
@ -66,3 +81,14 @@ class NetworkTraffic(IntervalModule):
"full_text": self.format.format(**cdict), "full_text": self.format.format(**cdict),
"instance": self.interface, "instance": self.interface,
} }
elif self.hide_down:
self.output = None
return
else:
cdict = {
"interface": self.interface,
}
self.output = {
"full_text": self.format_down.format(**cdict),
"instance": self.interface,
}