Add WiFi and IP address blocks

This commit is contained in:
akp 2022-03-31 10:43:42 +01:00
parent 891906a049
commit f11cb57dfc
No known key found for this signature in database
GPG key ID: AA5726202C8879B7
6 changed files with 217 additions and 8 deletions

View file

@ -25,6 +25,8 @@ func run() error {
}
blocks := []i3bar.BlockGenerator{
providers.NewIPAddress("wlp0s20f3"),
providers.NewWiFi("wlp0s20f3", 75),
providers.NewBattery("BAT0", 80, 30, 20),
providers.NewDisk("/", 30, 10),
providers.NewCPU(20, 50),

7
go.mod
View file

@ -1,3 +1,8 @@
module github.com/codemicro/bar
go 1.17
go 1.18
require (
github.com/samber/lo v1.11.0 // indirect
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
)

4
go.sum Normal file
View file

@ -0,0 +1,4 @@
github.com/samber/lo v1.11.0 h1:JfeYozXL1xfkhRUFOfH13ociyeiLSC/GRJjGKI668xM=
github.com/samber/lo v1.11.0/go.mod h1:2I7tgIv8Q1SG2xEIkRq0F2i2zgxVpnyPOP0d3Gj2r+A=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=

View file

@ -0,0 +1,77 @@
package providers
import (
"fmt"
"strings"
"github.com/codemicro/bar/internal/i3bar"
"github.com/samber/lo"
)
type IPAddress struct {
Adapter string
}
func NewIPAddress(adapter string) i3bar.BlockGenerator {
return &IPAddress{
Adapter: adapter,
}
}
func (g *IPAddress) getAdapterIPAddress() (string, error) {
// call ifconfig
output, err := runCommand("ifconfig")
if err != nil {
return "", err
}
adapters := lo.Filter(
strings.Split(string(output), "\n\n"),
func(x string, _ int) bool {
return x != ""
},
)
var ipAddr string
// parse output
// split by \n\n
for _, adapter := range adapters {
fields := strings.Fields(adapter)
if !strings.EqualFold(
strings.TrimSuffix(fields[0], ":"), g.Adapter,
) {
continue
}
for i, field := range fields {
if field == "inet" {
ipAddr = fields[i+1]
break
}
}
}
return ipAddr, nil
}
func (g *IPAddress) Block(colors *i3bar.ColorSet) (*i3bar.Block, error) {
ipAddr, err := g.getAdapterIPAddress()
if err != nil {
return nil, err
}
block := new(i3bar.Block)
if ipAddr == "" {
block.TextColor = colors.Bad
block.FullText = fmt.Sprintf("%s no IP", g.Adapter)
block.ShortText = "no IP"
} else {
block.TextColor = colors.Good
block.FullText = ipAddr
}
return block, nil
}

View file

@ -4,15 +4,8 @@ import (
"fmt"
"os/exec"
"strings"
"github.com/codemicro/bar/internal/i3bar"
)
var Known = map[string]func() i3bar.BlockGenerator{
"datetime": NewDateTime,
"pulseaudioVolume": NewPulseaudioVolume,
}
func runCommand(program string, args ...string) ([]byte, error) {
cmd := exec.Command(program, args...)
out, err := cmd.Output()

128
internal/providers/wifi.go Normal file
View file

@ -0,0 +1,128 @@
package providers
import (
"fmt"
"regexp"
"strconv"
"strings"
"github.com/codemicro/bar/internal/i3bar"
"github.com/samber/lo"
)
type WiFi struct {
Adapter string
OkThreshold float32
}
func NewWiFi(adapter string, okThreshold float32) i3bar.BlockGenerator {
return &WiFi{
Adapter: adapter,
OkThreshold: okThreshold,
}
}
var (
// For use with iwconfig
essidRegexp = regexp.MustCompile(`ESSID:(?:"(.+)"|off/any)`)
frequencyRegexp = regexp.MustCompile(`Frequency:(\d(?:\.\d+)? [a-zA-Z]Hz)`)
linkQualityRegexp = regexp.MustCompile(`Link Quality=(\d+\/\d+)`)
)
func (g *WiFi) getAdapterIPAddress() (string, error) {
// call ifconfig
output, err := runCommand("ifconfig")
if err != nil {
return "", err
}
adapters := lo.Filter(
strings.Split(string(output), "\n\n"),
func(x string, _ int) bool {
return x != ""
},
)
var ipAddr string
// parse output
// split by \n\n
for _, adapter := range adapters {
fields := strings.Fields(adapter)
if !strings.EqualFold(
strings.TrimSuffix(fields[0], ":"), g.Adapter,
) {
continue
}
for i, field := range fields {
if field == "inet" {
ipAddr = fields[i+1]
break
}
}
}
return ipAddr, nil
}
func (g *WiFi) getConnectionInfo() (ssid, frequency string, linkQuality float32, err error) {
output, err := runCommand("iwconfig")
if err != nil {
return "", "", 0, err
}
adapters := lo.Filter(strings.Split(string(output), "\n\n"), func(x string, _ int) bool {
return x != ""
})
for _, adapterInfo := range adapters {
if !strings.HasPrefix(adapterInfo, g.Adapter) {
continue
}
if essidRegexp.MatchString(adapterInfo) {
ssid = essidRegexp.FindStringSubmatch(adapterInfo)[1]
}
if frequencyRegexp.MatchString(adapterInfo) {
frequency = frequencyRegexp.FindStringSubmatch(adapterInfo)[1]
}
if linkQualityRegexp.MatchString(adapterInfo) {
eqn := linkQualityRegexp.FindStringSubmatch(adapterInfo)[1]
sp := strings.Split(eqn, "/")
num, _ := strconv.Atoi(sp[0])
denom, _ := strconv.Atoi(sp[1])
linkQuality = (float32(num) / float32(denom)) * 100
}
}
return
}
func (g *WiFi) Block(colors *i3bar.ColorSet) (*i3bar.Block, error) {
ssid, frequency, linkQuality, err := g.getConnectionInfo()
if err != nil {
return nil, err
}
block := new(i3bar.Block)
if ssid == "" {
block.TextColor = colors.Bad
block.FullText = fmt.Sprintf("%s not connected", g.Adapter)
block.ShortText = "not connected"
} else {
if linkQuality < g.OkThreshold && g.OkThreshold != 0 {
block.TextColor = colors.Warning
}
block.TextColor = colors.Good
block.FullText = fmt.Sprintf("%s (%s) %.0f%%", ssid, strings.ReplaceAll(frequency, " ", ""), linkQuality)
}
return block, nil
}