Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
335752ea9c | |||
368b8a8f36 | |||
2a5f3fadee |
7 changed files with 135 additions and 86 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1 +1,5 @@
|
||||||
/release
|
/release
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
/.idea
|
||||||
|
/.vscode
|
5
Makefile
5
Makefile
|
@ -13,7 +13,7 @@ clean:
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: clean
|
build: clean
|
||||||
go build -o "${APP}" ${BUILDFLAGS}
|
go build ${BUILDFLAGS}
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
|
@ -29,4 +29,5 @@ release:
|
||||||
GOOS=linux GOARCH=amd64 go build -o "release/${APP}_linux_amd64" -trimpath ${BUILDFLAGS}
|
GOOS=linux GOARCH=amd64 go build -o "release/${APP}_linux_amd64" -trimpath ${BUILDFLAGS}
|
||||||
GOOS=linux GOARCH=arm64 go build -o "release/${APP}_linux_arm64" -trimpath ${BUILDFLAGS}
|
GOOS=linux GOARCH=arm64 go build -o "release/${APP}_linux_arm64" -trimpath ${BUILDFLAGS}
|
||||||
GOOS=linux GOARCH=386 go build -o "release/${APP}_linux_386" -trimpath ${BUILDFLAGS}
|
GOOS=linux GOARCH=386 go build -o "release/${APP}_linux_386" -trimpath ${BUILDFLAGS}
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o "release/${APP}_windows_amd64.exe" -trimpath ${BUILDFLAGS}
|
||||||
|
GOOS=windows GOARCH=386 go build -o "release/${APP}_windows_386.exe" -trimpath ${BUILDFLAGS}
|
||||||
|
|
8
config/config.go
Normal file
8
config/config.go
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
type Format struct {
|
||||||
|
Default, Warning string
|
||||||
|
}
|
||||||
|
|
||||||
|
var DefaultFormat = Format{}
|
||||||
|
var TmuxFormat = Format{Default: "#[default]", Warning: "#[bg=colour208]"}
|
33
cpu/load.go
Normal file
33
cpu/load.go
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
//+build !windows
|
||||||
|
|
||||||
|
package cpu
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
cpuUtil "github.com/shirou/gopsutil/v3/cpu"
|
||||||
|
"github.com/shirou/gopsutil/v3/load"
|
||||||
|
|
||||||
|
"go.fanir.de/statusline/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Load(format config.Format, precision int) (string, error) {
|
||||||
|
l, err := load.Avg()
|
||||||
|
if err != nil {
|
||||||
|
return "", err // FIXME
|
||||||
|
}
|
||||||
|
|
||||||
|
cpus, err := cpuUtil.Counts(true)
|
||||||
|
if err != nil {
|
||||||
|
// TODO: log error
|
||||||
|
cpus = runtime.NumCPU()
|
||||||
|
}
|
||||||
|
|
||||||
|
if l.Load1 > float64(cpus) {
|
||||||
|
return fmt.Sprintf(format.Warning), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("[%.[1]*[2]f %.[1]*[3]f %.[1]*[4]f]",
|
||||||
|
precision, l.Load1, l.Load5, l.Load15), nil
|
||||||
|
}
|
8
cpu/load_windows.go
Normal file
8
cpu/load_windows.go
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package cpu
|
||||||
|
|
||||||
|
import "go.fanir.de/statusline/config"
|
||||||
|
|
||||||
|
func Load(format config.Format, precision int) (string, error) {
|
||||||
|
// todo: implement printLoad on windows
|
||||||
|
return "", nil
|
||||||
|
}
|
56
mem/mem.go
Normal file
56
mem/mem.go
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
package mem
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/shirou/gopsutil/v3/mem"
|
||||||
|
|
||||||
|
"go.fanir.de/statusline/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
var binarySuffixes = []string{"B", "KiB", "MiB", "GiB", "TiB"}
|
||||||
|
|
||||||
|
const binaryFactor = 1024
|
||||||
|
|
||||||
|
func HBin(a uint64, precision int) string {
|
||||||
|
f := float64(a)
|
||||||
|
var suffix string
|
||||||
|
for _, suffix = range binarySuffixes {
|
||||||
|
if f < binaryFactor {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
f /= binaryFactor
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%.*f%s", precision, f, suffix)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Mem(format config.Format, absolute, percent bool) (string, error) {
|
||||||
|
if !(absolute || percent) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := mem.VirtualMemory()
|
||||||
|
if err != nil {
|
||||||
|
return "", err // FIXME
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &strings.Builder{}
|
||||||
|
if v.UsedPercent > 90 {
|
||||||
|
fmt.Fprint(s, format.Warning, "[")
|
||||||
|
} else {
|
||||||
|
fmt.Fprint(s, format.Default, "[")
|
||||||
|
}
|
||||||
|
if absolute {
|
||||||
|
fmt.Fprintf(s, "%s/%s", HBin(v.Used, 1), HBin(v.Total, 1))
|
||||||
|
if percent {
|
||||||
|
fmt.Fprint(s, " ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if percent {
|
||||||
|
fmt.Fprintf(s, "%.0f%%", v.UsedPercent)
|
||||||
|
}
|
||||||
|
fmt.Fprint(s, "]")
|
||||||
|
|
||||||
|
return s.String(), nil
|
||||||
|
}
|
101
statusline.go
101
statusline.go
|
@ -4,85 +4,24 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/v3/load"
|
"go.fanir.de/statusline/config"
|
||||||
"github.com/shirou/gopsutil/v3/mem"
|
"go.fanir.de/statusline/cpu"
|
||||||
|
"go.fanir.de/statusline/mem"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Format struct {
|
func Print(s string, err error) {
|
||||||
Default, Warning string
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultFormat = Format{}
|
|
||||||
var tmuxFormat = Format{Default: "#[default]", Warning: "#[bg=colour208]"}
|
|
||||||
|
|
||||||
var binarySuffixes = []string{"B", "KiB", "MiB", "GiB", "TiB"}
|
|
||||||
|
|
||||||
const binaryFactor = 1024
|
|
||||||
|
|
||||||
func HBin(a uint64, precision int) string {
|
|
||||||
f := float64(a)
|
|
||||||
var suffix string
|
|
||||||
for _, suffix = range binarySuffixes {
|
|
||||||
if f < binaryFactor {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
f /= binaryFactor
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%.*f%s", precision, f, suffix)
|
|
||||||
}
|
|
||||||
|
|
||||||
func usage() {
|
|
||||||
fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "<window_width>")
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func printLoad(format Format, precision int) {
|
|
||||||
l, err := load.Avg()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err) // fixme
|
panic(err) // FIXME
|
||||||
}
|
}
|
||||||
|
fmt.Print(s)
|
||||||
if l.Load1 > float64(runtime.NumCPU()) {
|
|
||||||
fmt.Print(format.Warning)
|
|
||||||
}
|
|
||||||
fmt.Printf("[%.[1]*[2]f %.[1]*[3]f %.[1]*[4]f]",
|
|
||||||
precision, l.Load1, l.Load5, l.Load15)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func printMem(format Format, absolute, percent bool) {
|
func Time(format config.Format, timeFormat string) string {
|
||||||
if !(absolute || percent) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := mem.VirtualMemory()
|
|
||||||
if err != nil {
|
|
||||||
panic(err) //fixme
|
|
||||||
}
|
|
||||||
|
|
||||||
if v.UsedPercent > 90 {
|
|
||||||
fmt.Print(format.Warning, "[")
|
|
||||||
} else {
|
|
||||||
fmt.Print(format.Default, "[")
|
|
||||||
}
|
|
||||||
if absolute {
|
|
||||||
fmt.Printf("%s/%s", HBin(v.Used, 1), HBin(v.Total, 1))
|
|
||||||
if percent {
|
|
||||||
fmt.Print(" ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if percent {
|
|
||||||
fmt.Printf("%.0f%%", v.UsedPercent)
|
|
||||||
}
|
|
||||||
fmt.Print("]")
|
|
||||||
}
|
|
||||||
|
|
||||||
func printTime(format Format, timeFormat string) {
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
||||||
fmt.Print(format.Default, now.Format(timeFormat))
|
return fmt.Sprint(format.Default, now.Format(timeFormat))
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -90,11 +29,11 @@ func main() {
|
||||||
mode := flag.String("style", "none", "Include style directives in output. Valid values: none tmux")
|
mode := flag.String("style", "none", "Include style directives in output. Valid values: none tmux")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
format := defaultFormat
|
format := config.DefaultFormat
|
||||||
switch *mode {
|
switch *mode {
|
||||||
case "", "none":
|
case "", "none":
|
||||||
case "tmux":
|
case "tmux":
|
||||||
format = tmuxFormat
|
format = config.TmuxFormat
|
||||||
default:
|
default:
|
||||||
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
|
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
|
@ -102,18 +41,18 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if *cols == 0 || *cols >= 150 {
|
if *cols == 0 || *cols >= 150 {
|
||||||
printLoad(format, 2)
|
Print(cpu.Load(format, 2))
|
||||||
printMem(format, true, true)
|
Print(mem.Mem(format, true, true))
|
||||||
printTime(format, " Mon 2006-01-02 15:04")
|
fmt.Print(Time(format, " Mon 2006-01-02 15:04"))
|
||||||
} else if *cols >= 120 {
|
} else if *cols >= 120 {
|
||||||
printLoad(format, 2)
|
Print(cpu.Load(format, 2))
|
||||||
printMem(format, false, true)
|
Print(mem.Mem(format, false, true))
|
||||||
printTime(format, " 15:04")
|
fmt.Print(Time(format, " 15:04"))
|
||||||
} else if *cols >= 100 {
|
} else if *cols >= 100 {
|
||||||
printLoad(format, 0)
|
Print(cpu.Load(format, 0))
|
||||||
printMem(format, false, true)
|
Print(mem.Mem(format, false, true))
|
||||||
printTime(format, " 15:04")
|
fmt.Print(Time(format, " 15:04"))
|
||||||
} else if *cols >= 80 {
|
} else if *cols >= 80 {
|
||||||
printTime(format, "15:04")
|
fmt.Print(Time(format, "15:04"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue