diff --git a/README.md b/README.md index 458d534c..1239a186 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ To make a custom colorscheme, check out the [template](./colorschemes/template.g `-p`, `--percpu` Show each CPU in the CPU widget. `-a`, `--averagecpu` Show average CPU in the CPU widget. `-s`, `--statusbar` Show a statusbar with the time. -`-b`, `--battery` Show battery level widget (`minimal` turns off). [preview](./assets/screenshots/battery.png) +`-b`, `--battery` Show battery level widget (`minimal` turns off). [preview](./assets/screenshots/battery.png) `-i`, `--interface=NAME` Select network interface [default: all]. ## Built With diff --git a/src/widgets/net.go b/src/widgets/net.go index 3042a108..f13965c7 100644 --- a/src/widgets/net.go +++ b/src/widgets/net.go @@ -3,6 +3,7 @@ package widgets import ( "fmt" "log" + "strings" "time" psNet "github.com/shirou/gopsutil/net" @@ -25,7 +26,7 @@ type NetWidget struct { // used to calculate recent network activity totalBytesRecv uint64 totalBytesSent uint64 - NetInterface string + NetInterface []string } func NewNetWidget(netInterface string) *NetWidget { @@ -39,7 +40,7 @@ func NewNetWidget(netInterface string) *NetWidget { self := &NetWidget{ SparklineGroup: spark, updateInterval: time.Second, - NetInterface: netInterface, + NetInterface: strings.Split(netInterface, ","), } self.Title = " Network Usage " if netInterface != "all" { @@ -68,9 +69,28 @@ func (self *NetWidget) update() { var totalBytesRecv uint64 var totalBytesSent uint64 + interfaceMap := make(map[string]bool) + // Default behaviour + interfaceMap[NET_INTERFACE_ALL] = true + interfaceMap[NET_INTERFACE_VPN] = false + // Build a map with wanted status for each interfaces. + for _, iface := range self.NetInterface { + if strings.HasPrefix(iface, "!") { + interfaceMap[strings.TrimPrefix(iface, "!")] = false + } else { + // if we specify a wanted interface, remove capture on all. + delete(interfaceMap, NET_INTERFACE_ALL) + interfaceMap[iface] = true + } + } for _, _interface := range interfaces { - // ignore VPN interface or filter interface by name - if ((self.NetInterface == NET_INTERFACE_ALL) && (_interface.Name != NET_INTERFACE_VPN)) || (_interface.Name == self.NetInterface) { + wanted, ok := interfaceMap[_interface.Name] + if wanted && ok { // Simple case + totalBytesRecv += _interface.BytesRecv + totalBytesSent += _interface.BytesSent + } else if ok { // Present but unwanted + continue + } else if interfaceMap[NET_INTERFACE_ALL] { // Capture other totalBytesRecv += _interface.BytesRecv totalBytesSent += _interface.BytesSent }