[modules/traffic] Allow for state filtering
The optional parameter "states" can now be used to filter which interfaces to display. "^" can be used for negation. For example, to only show "up" interfaces: -p traffic.states=up To show all interfaces not in "down" state: -p traffic.states=^down fixes #98
This commit is contained in:
parent
c4a3a9d6a4
commit
2d99bdf314
1 changed files with 28 additions and 1 deletions
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
* traffic.exclude: Comma-separated list of interface prefixes to exclude (defaults to "lo,virbr,docker,vboxnet,veth")
|
* traffic.exclude: Comma-separated list of interface prefixes to exclude (defaults to "lo,virbr,docker,vboxnet,veth")
|
||||||
|
* traffic.states: Comma-separated list of states to show (prefix with "^" to invert - i.e. ^down -> show all devices that are not in state down)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
@ -20,9 +21,18 @@ class Module(bumblebee.engine.Module):
|
||||||
widgets = []
|
widgets = []
|
||||||
super(Module, self).__init__(engine, config, widgets)
|
super(Module, self).__init__(engine, config, widgets)
|
||||||
self._exclude = tuple(filter(len, self.parameter("exclude", "lo,virbr,docker,vboxnet,veth").split(",")))
|
self._exclude = tuple(filter(len, self.parameter("exclude", "lo,virbr,docker,vboxnet,veth").split(",")))
|
||||||
self._update_widgets(widgets)
|
|
||||||
self._status = ""
|
self._status = ""
|
||||||
|
|
||||||
|
self._states = {}
|
||||||
|
self._states["include"] = []
|
||||||
|
self._states["exclude"] = []
|
||||||
|
for state in tuple(filter(len, self.parameter("states", "").split(","))):
|
||||||
|
if state[0] == "^":
|
||||||
|
self._states["exclude"].append(state[1:])
|
||||||
|
else:
|
||||||
|
self._states["include"].append(state)
|
||||||
|
self._update_widgets(widgets)
|
||||||
|
|
||||||
def state(self, widget):
|
def state(self, widget):
|
||||||
if "traffic.rx" in widget.name:
|
if "traffic.rx" in widget.name:
|
||||||
return "rx"
|
return "rx"
|
||||||
|
@ -46,12 +56,29 @@ class Module(bumblebee.engine.Module):
|
||||||
|
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
|
def get_addresses(self, intf):
|
||||||
|
retval = []
|
||||||
|
try:
|
||||||
|
for ip in netifaces.ifaddresses(intf).get(netifaces.AF_INET, []):
|
||||||
|
if ip.get("addr", "") != "":
|
||||||
|
retval.append(ip.get("addr"))
|
||||||
|
except Exception:
|
||||||
|
return []
|
||||||
|
return retval
|
||||||
|
|
||||||
def _update_widgets(self, widgets):
|
def _update_widgets(self, widgets):
|
||||||
interfaces = [ i for i in netifaces.interfaces() if not i.startswith(self._exclude) ]
|
interfaces = [ i for i in netifaces.interfaces() if not i.startswith(self._exclude) ]
|
||||||
|
|
||||||
counters = psutil.net_io_counters(pernic=True)
|
counters = psutil.net_io_counters(pernic=True)
|
||||||
for interface in interfaces:
|
for interface in interfaces:
|
||||||
if not interface: interface = "lo"
|
if not interface: interface = "lo"
|
||||||
|
state = "down"
|
||||||
|
if len(self.get_addresses(interface)) > 0:
|
||||||
|
state = "up"
|
||||||
|
|
||||||
|
if len(self._states["exclude"]) > 0 and state in self._states["exclude"]: continue
|
||||||
|
if len(self._states["include"]) > 0 and state not in self._states["include"]: continue
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"rx": counters[interface].bytes_recv,
|
"rx": counters[interface].bytes_recv,
|
||||||
"tx": counters[interface].bytes_sent,
|
"tx": counters[interface].bytes_sent,
|
||||||
|
|
Loading…
Reference in a new issue