Merge branch 'v3.4.x' into nvidia
This commit is contained in:
commit
4fce1654c5
22
CHANGELOG.md
22
CHANGELOG.md
|
@ -15,16 +15,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
## [3.4.x] - ??
|
||||
|
||||
- Added: metrics. If run with the `--export :2112` flag (`:2112` is a port),
|
||||
metrics are exposed as Prometheus metrics on that port and can be HTTP
|
||||
GET-ted.
|
||||
- Added: a battery gauge as a `power` widget; battery as a bar rather than
|
||||
### Added
|
||||
|
||||
- Device data export via HTTP. If run with the `--export :2112` flag (`:2112`
|
||||
is a port), metrics are exposed as Prometheus metrics on that port.
|
||||
- A battery gauge as a `power` widget; battery as a bar rather than
|
||||
a histogram.
|
||||
- Temp widget displays degree symbol (merged from BartWillems, thanks
|
||||
also fleaz)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Keys not controlling process widget, #59
|
||||
- The one-column bug, #62
|
||||
|
||||
## [3.3.2] - ??
|
||||
|
||||
- Fixes #15, crash caused by battery widget when some accessories have batteries
|
||||
- Fixes #57, colors with dashes in the name not found.
|
||||
### Fixed
|
||||
|
||||
- #15, crash caused by battery widget when some accessories have batteries
|
||||
- #57, colors with dashes in the name not found.
|
||||
- Also, cjbassi/gotop#127 and cjbassi/gotop#130 were released back in v3.1.0.
|
||||
|
||||
## [3.3.1] - 2020-02-18
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
|
@ -14,6 +15,7 @@ import (
|
|||
|
||||
docopt "github.com/docopt/docopt.go"
|
||||
ui "github.com/gizak/termui/v3"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
|
||||
"github.com/xxxserxxx/gotop"
|
||||
"github.com/xxxserxxx/gotop/colorschemes"
|
||||
|
@ -25,7 +27,7 @@ import (
|
|||
|
||||
const (
|
||||
appName = "gotop"
|
||||
version = "3.3.1"
|
||||
version = "3.4.0"
|
||||
|
||||
graphHorizontalScaleDelta = 3
|
||||
defaultUI = "cpu\ndisk/1 2:mem/2\ntemp\nnet procs"
|
||||
|
@ -41,10 +43,10 @@ var (
|
|||
stderrLogger = log.New(os.Stderr, "", 0)
|
||||
)
|
||||
|
||||
// TODO: Add tab completion for Linux https://gist.github.com/icholy/5314423
|
||||
// TODO: state:merge #135 linux console font (cmatsuoka/console-font)
|
||||
// TODO: state:deferred 157 FreeBSD fixes & Nvidia GPU support (kraust/master). Significant CPU use impact for NVidia changes.
|
||||
// TODO: Virtual devices from Prometeus metrics @feature
|
||||
// TODO: Export Prometheus metrics @feature
|
||||
// TODO: state:merge #167 configuration file (jrswab/configFile111)
|
||||
func parseArgs(conf *gotop.Config) error {
|
||||
usage := `
|
||||
|
@ -64,6 +66,7 @@ Options:
|
|||
-B, --bandwidth=bits Specify the number of bits per seconds.
|
||||
-l, --layout=NAME Name of layout spec file for the UI. Looks first in $XDG_CONFIG_HOME/gotop, then as a path. Use "-" to pipe.
|
||||
-i, --interface=NAME Select network interface [default: all].
|
||||
-x, --export=PORT Enable metrics for export on the specified port.
|
||||
|
||||
Several interfaces can be defined using comma separated values.
|
||||
|
||||
|
@ -115,8 +118,11 @@ Colorschemes:
|
|||
if args["--minimal"].(bool) {
|
||||
conf.Layout = "minimal"
|
||||
}
|
||||
if val, _ := args["--statusbar"]; val != nil {
|
||||
rateStr, _ := args["--rate"].(string)
|
||||
if val, _ := args["--export"]; val != nil {
|
||||
conf.ExportPort = val.(string)
|
||||
}
|
||||
if val, _ := args["--rate"]; val != nil {
|
||||
rateStr, _ := val.(string)
|
||||
rate, err := strconv.ParseFloat(rateStr, 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid rate parameter")
|
||||
|
@ -335,7 +341,7 @@ func makeConfig() gotop.Config {
|
|||
HelpVisible: false,
|
||||
UpdateInterval: time.Second,
|
||||
AverageLoad: false,
|
||||
PercpuLoad: false,
|
||||
PercpuLoad: true,
|
||||
TempScale: w.Celsius,
|
||||
Statusbar: false,
|
||||
NetInterface: w.NET_INTERFACE_ALL,
|
||||
|
@ -345,6 +351,7 @@ func makeConfig() gotop.Config {
|
|||
return conf
|
||||
}
|
||||
|
||||
// TODO: mpd visualizer widget
|
||||
func main() {
|
||||
// Set up default config
|
||||
conf := makeConfig()
|
||||
|
@ -400,6 +407,12 @@ func main() {
|
|||
ui.Render(bar)
|
||||
}
|
||||
|
||||
if conf.ExportPort != "" {
|
||||
go func() {
|
||||
http.Handle("/metrics", promhttp.Handler())
|
||||
http.ListenAndServe(conf.ExportPort, nil)
|
||||
}()
|
||||
}
|
||||
eventLoop(conf, grid)
|
||||
}
|
||||
|
||||
|
@ -414,7 +427,6 @@ func getLayout(conf gotop.Config) io.Reader {
|
|||
case "battery":
|
||||
return strings.NewReader(batteryUI)
|
||||
default:
|
||||
log.Printf("layout = %s", conf.Layout)
|
||||
fp := filepath.Join(conf.ConfigDir, conf.Layout)
|
||||
fin, err := os.Open(fp)
|
||||
if err != nil {
|
||||
|
|
|
@ -30,6 +30,7 @@ type Config struct {
|
|||
NetInterface string
|
||||
Layout string
|
||||
MaxLogSize int64
|
||||
ExportPort string
|
||||
}
|
||||
|
||||
func Parse(in io.Reader, conf *Config) error {
|
||||
|
@ -109,6 +110,8 @@ func Parse(in io.Reader, conf *Config) error {
|
|||
return err
|
||||
}
|
||||
conf.MaxLogSize = int64(iv)
|
||||
case "export":
|
||||
conf.ExportPort = kv[1]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
package devices
|
||||
|
||||
import (
|
||||
"github.com/NVIDIA/gpu-monitoring-tools/bindings/go/nvml"
|
||||
"time"
|
||||
)
|
||||
|
||||
func init() {
|
||||
if nvml.Init() == nil {
|
||||
shutdownFuncs = append(shutdownFuncs, func() { nvml.Shutdown() })
|
||||
deviceCounts = append(deviceCounts, func(b bool) (int, error) {
|
||||
r, e := nvml.GetDeviceCount()
|
||||
return int(r), e
|
||||
})
|
||||
devicePercents = append(devicePercents, func(t time.Duration, b bool) ([]float64, error) {
|
||||
return nil, nil
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,9 +1,26 @@
|
|||
package devices
|
||||
|
||||
var shutdownFuncs []func()
|
||||
import "log"
|
||||
|
||||
var shutdownFuncs []func() error
|
||||
|
||||
// RegisterShutdown stores a function to be called by gotop on exit, allowing
|
||||
// extensions to properly release resources. Extensions should register a
|
||||
// shutdown function IFF the extension is using resources that need to be
|
||||
// released. The returned error will be logged, but no other action will be
|
||||
// taken.
|
||||
func RegisterShutdown(f func() error) {
|
||||
shutdownFuncs = append(shutdownFuncs, f)
|
||||
}
|
||||
|
||||
// Shutdown will be called by the `main()` function if gotop is exited
|
||||
// cleanly. It will call all of the registered shutdown functions of devices,
|
||||
// logging all errors but otherwise not responding to them.
|
||||
func Shutdown() {
|
||||
for _, f := range shutdownFuncs {
|
||||
f()
|
||||
err := f()
|
||||
if err != nil {
|
||||
log.Print(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
22
docs/extensions.md
Normal file
22
docs/extensions.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
% Plugins
|
||||
|
||||
|
||||
# Extensions
|
||||
|
||||
- Plugins will supply an `Init()` function that will call the appropriate
|
||||
`Register\*()` functions in the `github.com/xxxserxxx/gotop/devices` package.
|
||||
- `devices` will supply:
|
||||
- RegisterCPU (opt)
|
||||
- Counts (req)
|
||||
- Percents (req)
|
||||
- RegisterMem (opt)
|
||||
- RegisterTemp (opt)
|
||||
- RegisterShutdown (opt)
|
||||
|
||||
# gotop
|
||||
|
||||
- Command line -P, comma separated list of plugin .so
|
||||
- gotop will look in `pwd` and then in \$XDG_CONFIG_HOME/gotop
|
||||
- When loaded, gotop will call lib#Init()
|
||||
|
||||
When exited cleanly, gotop will call all registered shutdown functions.
|
42
docs/grid-fill.md
Normal file
42
docs/grid-fill.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
T is max height in row
|
||||
S(T) is all widgets with height T
|
||||
R(T) is all widgets with height < T
|
||||
X is len(R) > 0 ? 1 : 0
|
||||
C is len(S) + X
|
||||
Make row
|
||||
Make C columns
|
||||
Place S
|
||||
Recurse with R; place result
|
||||
|
||||
|
||||
1 2 3 4 5
|
||||
cpu/2............... mem/1. 6:procs/2..........
|
||||
3:temp/1. 2:disk/2......... |..................
|
||||
|........ |................ |..................
|
||||
|........ power/2.......... |..................
|
||||
net/2............... batt.. |..................
|
||||
|
||||
1 2 3 4 5
|
||||
cpu/2............... 6:procs/2........ mem/1...
|
||||
2:disk/2............ |................ 3:temp/1
|
||||
|................... |................ |.......
|
||||
power/2............. |................ |.......
|
||||
net/2............... |................ batt
|
||||
|
||||
1 2 3 4 5
|
||||
1x2................. 3x2.............. 1x1..... 221 221
|
||||
2x2................. ||||||||||||||||| 3x1..... 21 2x1
|
||||
|||||||||||||||||||| ||||||||||||||||| ||||||||
|
||||
1x1...... 1x1...... 1x2.............. 1x1..... 1121
|
||||
1x2................. 1x2.............. |||||||| 22 22x
|
||||
1x1...... 1x4................................... 14
|
||||
|
||||
initial columns = initial row
|
||||
fill
|
||||
pattern for row
|
||||
does pattern fit columns?
|
||||
yes: place widgets
|
||||
no: new row w/ new columns; fill
|
||||
|
||||
does fit
|
||||
cw < patt_c_w
|
37
docs/releasing.md
Normal file
37
docs/releasing.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
Current steps for a release:
|
||||
|
||||
### gotop
|
||||
1. Update Version in main.go
|
||||
2. Update CHANGELOG.md
|
||||
3. Tag
|
||||
4. Push everything
|
||||
5. ./make.sh
|
||||
6. Create github release
|
||||
|
||||
### Homebrew
|
||||
1. Change homebrew-gotop
|
||||
```
|
||||
curl --output - -L https://github.com/xxxserxxx/gotop/releases/download/v3.3.2/gotop_3.3.2_linux_amd64.tgz | sha256sum
|
||||
curl --output - -L https://github.com/xxxserxxx/gotop/releases/download/v3.3.2/gotop_3.3.2_darwin_amd64.tgz | sha256sum
|
||||
```
|
||||
|
||||
### AUR
|
||||
1. Update aur/PKGBUILD
|
||||
2. namcap PKGBUILD
|
||||
3. makepkg
|
||||
4. makepkg -g
|
||||
5. makepkg --printsrcinfo \> .SRCINFO
|
||||
6. Commit everything
|
||||
7. push
|
||||
```
|
||||
curl -L https://github.com/xxxserxxx/gotop/archive/v3.3.2.tar.gz | sha256sum
|
||||
```
|
||||
|
||||
### AUR-BIN
|
||||
1. Update aur-bin/PKGBUILD
|
||||
2. namcap PKGBUILD
|
||||
3. makepkg
|
||||
4. makepkg -g
|
||||
5. makepkg --printsrcinfo \> .SRCINFO
|
||||
6. Commit everything
|
||||
7. push aur-bin
|
2
go.mod
2
go.mod
|
@ -13,7 +13,7 @@ require (
|
|||
github.com/mailru/easyjson v0.7.1 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.4
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.4.1 // indirect
|
||||
github.com/prometheus/client_golang v1.4.1
|
||||
github.com/rai-project/config v0.0.0-20190926180509-3bd01e698aad // indirect
|
||||
github.com/rai-project/logger v0.0.0-20190701163301-49978a80bf96 // indirect
|
||||
github.com/rai-project/nvidia-smi v0.0.0-20190730061239-864eb441c9ae
|
||||
|
|
87
go.sum
87
go.sum
|
@ -1,24 +1,18 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/GeertJohan/go-sourcepath v0.0.0-20150925135350-83e8b8723a9b h1:D4H5C4VvURnduTQydyEhA6OWnNcZTLUlNX4YBw5yelY=
|
||||
github.com/GeertJohan/go-sourcepath v0.0.0-20150925135350-83e8b8723a9b/go.mod h1:X/dh6iyBHZUR+NSNoO9isIl7cRw4n09jwjK5tfr+Rno=
|
||||
github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0=
|
||||
github.com/GeertJohan/go.rice v0.0.0-20170420135705-c02ca9a983da/go.mod h1:DgrzXonpdQbfN3uYaGz1EG4Sbhyum/MMIn6Cphlh2bw=
|
||||
github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ=
|
||||
github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0=
|
||||
github.com/NVIDIA/gpu-monitoring-tools v0.0.0-20200116003318-021662a21098 h1:9qTpKR5TnUxu+ViqhxkpANee27meaoHYwV0f1SnRqgI=
|
||||
github.com/NVIDIA/gpu-monitoring-tools v0.0.0-20200116003318-021662a21098/go.mod h1:nMOvShGpWaf0bXwXmeu4k+O4uziuaEI8pWzIj3BUrOA=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292 h1:tuQ7w+my8a8mkwN7x2TSd7OzTjkZ7rAeSyH4xncuAMI=
|
||||
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292/go.mod h1:KYCjqMOeHpNuTOiFQU6WEcTG7poCJrUs0YgyHNtn1no=
|
||||
github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
|
@ -29,38 +23,25 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
|
|||
github.com/cjbassi/drawille-go v0.0.0-20190126131713-27dc511fe6fd h1:XtfPmj9tQRilnrEmI1HjQhxXWRhEM+m8CACtaMJE/kM=
|
||||
github.com/cjbassi/drawille-go v0.0.0-20190126131713-27dc511fe6fd/go.mod h1:vjcQJUZJYD3MeVGhtZXSMnCHfUNZxsyYzJt90eCYxK4=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.8+incompatible h1:uDjs0KvLk1mjTf7Ykd42tRsm9EkjCQX37DAmNwb4Kxs=
|
||||
github.com/coreos/etcd v3.3.8+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/daaku/go.zipexe v0.0.0-20150329023125-a5fe2436ffcb/go.mod h1:U0vRfAucUOohvdCxt5MWLF+TePIL0xbCkbKIiV8TQCE=
|
||||
github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
|
||||
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/distatus/battery v0.9.0 h1:8NS5o00/j3Oh2xgocA6pQROTp5guoR+s8CZlWzHC4QM=
|
||||
github.com/distatus/battery v0.9.0/go.mod h1:gGO7GxHTi1zlRT+cAj8uGG0/8HFiqAeH0TJvoipnuPs=
|
||||
github.com/docopt/docopt.go v0.0.0-20180111231733-ee0de3bc6815 h1:HMAfwOa33y82IaQEKQDfUCiwNlxtM1iw7HLM9ru0RNc=
|
||||
github.com/docopt/docopt.go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:l7JNRynTRuqe45tpIyItHNqZWTxywYjp87MWTOnU5cg=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
|
||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/structs v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU=
|
||||
github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gizak/termui/v3 v3.0.0 h1:NYTUG6ig/sJK05O5FyhWemwlVPO8ilNpvS/PgRtrKAE=
|
||||
github.com/gizak/termui/v3 v3.0.0/go.mod h1:uinu2dMdtMI+FTIdEFUJQT5y+KShnhQRshvPblXq3lY=
|
||||
|
@ -68,84 +49,58 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
|
|||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5 h1:2+KSC78XiO6Qy0hIjfc1OD9H+hsaJdJlb8Kqsd41CTE=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno=
|
||||
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
|
||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||
github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
|
||||
github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40=
|
||||
github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
|
||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
|
||||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
||||
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mitchellh/go-homedir v0.0.0-20180523094522-3864e76763d9 h1:Y94YB7jrsihrbGSqRNMwRWJ2/dCxr0hdC2oPRohkx0A=
|
||||
github.com/mitchellh/go-homedir v0.0.0-20180523094522-3864e76763d9/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
|
||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20180511142126-bb74f1db0675 h1:/rdJjIiKG5rRdwG5yxHmSE/7ZREjpyC0kL7GxGT/qJw=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20180511142126-bb74f1db0675/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
|
@ -158,16 +113,12 @@ github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE
|
|||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE=
|
||||
github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||
|
@ -187,70 +138,43 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R
|
|||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/rai-project/config v0.0.0-20190926180509-3bd01e698aad h1:o0056EwcQBeyaVb2my+T0TvMR5FpEY0CGNgWkbj/xEo=
|
||||
github.com/rai-project/config v0.0.0-20190926180509-3bd01e698aad/go.mod h1:NGYIJHnNhNRYvFYWqSCbPqsnwJ6uLC4q2eddpInHgVk=
|
||||
github.com/rai-project/godotenv v0.0.0-20180619160704-a501614c3b8d h1:reVy+ViZcrx1ILo+L8wa3dGf6hSd4qlY62VqxZxEgWs=
|
||||
github.com/rai-project/godotenv v0.0.0-20180619160704-a501614c3b8d/go.mod h1:91keR8FKb9xXErPghO6kMay+2MQb4g+gIZey/W/vv8w=
|
||||
github.com/rai-project/logger v0.0.0-20190701163301-49978a80bf96 h1:GeXSVSRfXOBN5XHNA+wq5G+sfq99mhpwn6U5kcGwSeg=
|
||||
github.com/rai-project/logger v0.0.0-20190701163301-49978a80bf96/go.mod h1:aFDuHWECvho4yTAOeAgPjuLIeGiYrURMS16V//PDmi8=
|
||||
github.com/rai-project/nvidia-smi v0.0.0-20190730061239-864eb441c9ae h1:u1iLjKPj9yLc5ke1yLjDdFv5nzY7Z99TmVrB0OGoQv4=
|
||||
github.com/rai-project/nvidia-smi v0.0.0-20190730061239-864eb441c9ae/go.mod h1:4LLEYSw0LpRcuOwqSpyeMextz9hqvPE4TU6IGmkT2mA=
|
||||
github.com/rai-project/tegra v0.0.0-20181119122707-1d9901ca382b h1:Km/sSU51n795dKGvpQyiuqogC52weyjcEWBdOhtXehg=
|
||||
github.com/rai-project/tegra v0.0.0-20181119122707-1d9901ca382b/go.mod h1:Fj5aBtW50UAsFCeS9X/t0eoGJvMQAW4w4PDAuRtZLMc=
|
||||
github.com/rai-project/utils v0.0.0-20180619204045-c582bb171808 h1:cHOS6oMEt8wi93zm5V7cHVnWgOhaAUCpjRDEZHBsckg=
|
||||
github.com/rai-project/utils v0.0.0-20180619204045-c582bb171808/go.mod h1:I/Ti6TSU785mVLG5ybjSjFOnJI0u6IRjRVosnGbrFfg=
|
||||
github.com/rai-project/vipertags v0.0.0-20180619160704-1b2055ebed22 h1:2k8OIRLrxtKwVZ5k+Xj6OoR0ayZpwZ8QppkvU/kMqUo=
|
||||
github.com/rai-project/vipertags v0.0.0-20180619160704-1b2055ebed22/go.mod h1:+2KFcVdODWrMQkdYtv7MrXCTpW2RNKXZzO/RsvEQnWc=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/shirou/gopsutil v2.18.11+incompatible h1:PMFTKnFTr/YTRW5rbLK4vWALV3a+IGXse5nvhSjztmg=
|
||||
github.com/shirou/gopsutil v2.18.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff h1:86HlEv0yBCry9syNuylzqznKXDK11p6D0DT596yNMys=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
||||
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spf13/afero v1.1.1 h1:Lt3ihYMlE+lreX1GS4Qw4ZsNpYQLxIXKBTEOXm3nt6I=
|
||||
github.com/spf13/afero v1.1.1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg=
|
||||
github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig=
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v0.0.0-20180507071007-15738813a09d h1:pIz+bbPLk78K39d3u77IlNpJvpS/f0ao8n3sdy82eCs=
|
||||
github.com/spf13/viper v0.0.0-20180507071007-15738813a09d/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
|
||||
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1 h1:UvhxfNjNqlZ/x3cDyqxMhoiUpemd3zXkVQApN6bM/lg=
|
||||
github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xordataexchange/crypt v0.0.0-20170626215501-b2862e3d0a77 h1:BUfWaGtsLex4DZgdo+vxCYR13ZKbGy3pZ0MlH6CUEPk=
|
||||
github.com/xordataexchange/crypt v0.0.0-20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 h1:Pn8fQdvx+z1avAi7fdM2kRYWQNxGlavNDSyzrQg2SsU=
|
||||
golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -259,7 +183,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -275,27 +198,19 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
|
||||
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||
|
@ -303,11 +218,9 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M=
|
||||
howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
|
||||
|
|
|
@ -31,17 +31,23 @@ var widgetNames []string = []string{"cpu", "disk", "mem", "temp", "net", "procs"
|
|||
|
||||
func Layout(wl layout, c gotop.Config) (*MyGrid, error) {
|
||||
rowDefs := wl.Rows
|
||||
uiRows := make([]ui.GridItem, 0)
|
||||
uiRows := make([][]interface{}, 0)
|
||||
numRows := countNumRows(wl.Rows)
|
||||
var uiRow ui.GridItem
|
||||
var uiRow []interface{}
|
||||
maxHeight := 0
|
||||
heights := make([]int, 0)
|
||||
var h int
|
||||
for len(rowDefs) > 0 {
|
||||
uiRow, rowDefs = processRow(c, numRows, rowDefs)
|
||||
h, uiRow, rowDefs = processRow(c, numRows, rowDefs)
|
||||
maxHeight += h
|
||||
uiRows = append(uiRows, uiRow)
|
||||
heights = append(heights, h)
|
||||
}
|
||||
rgs := make([]interface{}, 0)
|
||||
for _, ur := range uiRows {
|
||||
ur.HeightRatio = ur.HeightRatio / float64(numRows)
|
||||
rgs = append(rgs, ur)
|
||||
for i, ur := range uiRows {
|
||||
rh := float64(heights[i]) / float64(maxHeight)
|
||||
log.Printf("appending row %d with height %d", i, heights[i])
|
||||
rgs = append(rgs, ui.NewRow(rh, ur...))
|
||||
}
|
||||
grid := &MyGrid{ui.NewGrid(), nil, nil}
|
||||
grid.Set(rgs...)
|
||||
|
@ -58,15 +64,18 @@ func Layout(wl layout, c gotop.Config) (*MyGrid, error) {
|
|||
// if there's a row span widget in the row; in this case, it'll consume as many
|
||||
// rows as the largest row span object in the row, and produce an uber-row
|
||||
// containing all that stuff. It returns a slice without the consumed elements.
|
||||
func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (ui.GridItem, [][]widgetRule) {
|
||||
func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (int, []interface{}, [][]widgetRule) {
|
||||
log.Printf("got %d rows", len(rowDefs))
|
||||
|
||||
// Recursive function #3. See the comment in deepFindProc.
|
||||
if len(rowDefs) < 1 {
|
||||
return ui.GridItem{}, [][]widgetRule{}
|
||||
return 0, nil, [][]widgetRule{}
|
||||
}
|
||||
// The height of the tallest widget in this row; the number of rows that
|
||||
// will be consumed, and the overall height of the row that will be
|
||||
// produced.
|
||||
maxHeight := countMaxHeight([][]widgetRule{rowDefs[0]})
|
||||
log.Printf("maxHeight %d", maxHeight)
|
||||
var processing [][]widgetRule
|
||||
if maxHeight < len(rowDefs) {
|
||||
processing = rowDefs[0:maxHeight]
|
||||
|
@ -75,6 +84,7 @@ func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (ui.GridIte
|
|||
processing = rowDefs[0:]
|
||||
rowDefs = [][]widgetRule{}
|
||||
}
|
||||
log.Printf("consuming %d rows, %d remainder rows", len(processing), len(rowDefs))
|
||||
var colWeights []float64
|
||||
var columns [][]interface{}
|
||||
numCols := len(processing[0])
|
||||
|
@ -86,9 +96,10 @@ func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (ui.GridIte
|
|||
columns = append(columns, make([]interface{}, 0))
|
||||
}
|
||||
colHeights := make([]int, numCols)
|
||||
outer:
|
||||
for i, row := range processing {
|
||||
// A definition may fill up the columns before all rows are consumed,
|
||||
// e.g. wid1/2 wid2/2. This block checks for that and, if it occurs,
|
||||
// e.g. cpu/2 net/2. This block checks for that and, if it occurs,
|
||||
// prepends the remaining rows to the "remainder" return value.
|
||||
full := true
|
||||
for _, ch := range colHeights {
|
||||
|
@ -99,18 +110,28 @@ func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (ui.GridIte
|
|||
}
|
||||
if full {
|
||||
rowDefs = append(processing[i:], rowDefs...)
|
||||
log.Printf("prepended early consumption; remainder now %d rows", len(rowDefs))
|
||||
break
|
||||
}
|
||||
// Not all rows have been consumed, so go ahead and place the row's widgets in columns
|
||||
for _, wid := range row {
|
||||
for j, ch := range colHeights {
|
||||
if ch+wid.Height <= maxHeight {
|
||||
widget := makeWidget(c, wid)
|
||||
columns[j] = append(columns[j], ui.NewRow(float64(wid.Height)/float64(maxHeight), widget))
|
||||
colHeights[j] += wid.Height
|
||||
// Not all rows have been consumed, so go ahead and place the row's
|
||||
// widgets in columns
|
||||
for w, widg := range row {
|
||||
placed := false
|
||||
for k := w; k < len(colHeights); k++ { // there are enough columns
|
||||
ch := colHeights[k]
|
||||
if ch+widg.Height <= maxHeight {
|
||||
widget := makeWidget(c, widg)
|
||||
columns[k] = append(columns[k], ui.NewRow(float64(widg.Height)/float64(maxHeight), widget))
|
||||
colHeights[k] += widg.Height
|
||||
placed = true
|
||||
break
|
||||
}
|
||||
}
|
||||
// If all columns are full, break out, return the row, and continue processing
|
||||
if !placed {
|
||||
rowDefs = append(processing[i:], rowDefs...)
|
||||
break outer
|
||||
}
|
||||
}
|
||||
}
|
||||
var uiColumns []interface{}
|
||||
|
@ -120,11 +141,16 @@ func processRow(c gotop.Config, numRows int, rowDefs [][]widgetRule) (ui.GridIte
|
|||
}
|
||||
}
|
||||
|
||||
return ui.NewRow(1.0/float64(numRows), uiColumns...), rowDefs
|
||||
log.Printf("returning %d columns", len(uiColumns))
|
||||
return maxHeight, uiColumns, rowDefs
|
||||
}
|
||||
|
||||
type Metric interface {
|
||||
EnableMetric()
|
||||
}
|
||||
|
||||
func makeWidget(c gotop.Config, widRule widgetRule) interface{} {
|
||||
var w interface{}
|
||||
var w Metric
|
||||
switch widRule.Widget {
|
||||
case "cpu":
|
||||
cpu := widgets.NewCpuWidget(c.UpdateInterval, c.GraphHorizontalScale, c.AverageLoad, c.PercpuLoad)
|
||||
|
@ -145,7 +171,8 @@ func makeWidget(c gotop.Config, widRule widgetRule) interface{} {
|
|||
}
|
||||
w = cpu
|
||||
case "disk":
|
||||
w = widgets.NewDiskWidget()
|
||||
dw := widgets.NewDiskWidget()
|
||||
w = dw
|
||||
case "mem":
|
||||
m := widgets.NewMemWidget(c.UpdateInterval, c.GraphHorizontalScale)
|
||||
m.LineColors["Main"] = ui.Color(c.Colorscheme.MainMem)
|
||||
|
@ -185,10 +212,17 @@ func makeWidget(c gotop.Config, widRule widgetRule) interface{} {
|
|||
i++
|
||||
}
|
||||
w = b
|
||||
case "power":
|
||||
b := widgets.NewBatteryGauge()
|
||||
b.BarColor = ui.Color(c.Colorscheme.ProcCursor)
|
||||
w = b
|
||||
default:
|
||||
log.Printf("Invalid widget name %s. Must be one of %v", widRule.Widget, widgetNames)
|
||||
return ui.NewBlock()
|
||||
}
|
||||
if c.ExportPort != "" {
|
||||
w.EnableMetric()
|
||||
}
|
||||
return w
|
||||
}
|
||||
|
||||
|
@ -262,6 +296,15 @@ func deepFindProc(gs interface{}) *widgets.ProcWidget {
|
|||
}
|
||||
}
|
||||
}
|
||||
fs2, ok := gs.([][]interface{})
|
||||
if ok {
|
||||
for _, g := range fs2 {
|
||||
v := deepFindProc(g)
|
||||
if v != nil {
|
||||
return v
|
||||
}
|
||||
}
|
||||
}
|
||||
p, ok := gs.(*widgets.ProcWidget)
|
||||
if ok {
|
||||
return p
|
||||
|
|
|
@ -101,6 +101,33 @@ func TestParsing(t *testing.T) {
|
|||
assert.Equal(t, 1, l.Rows[1][0].Height)
|
||||
assert.Equal(t, 1.0, l.Rows[1][0].Weight)
|
||||
}},
|
||||
{"cpu/2 mem/1 6:procs\n3:temp/1 2:disk/2\npower\nnet procs", func(l layout) {
|
||||
assert.Equal(t, 4, len(l.Rows))
|
||||
// First row
|
||||
assert.Equal(t, 3, len(l.Rows[0]))
|
||||
assert.Equal(t, 1, l.Rows[0][0].Height)
|
||||
assert.Equal(t, 0.5, l.Rows[0][0].Weight)
|
||||
assert.Equal(t, 1, l.Rows[0][1].Height)
|
||||
assert.Equal(t, 0.25, l.Rows[0][1].Weight)
|
||||
assert.Equal(t, 6, l.Rows[0][2].Height)
|
||||
assert.Equal(t, 0.25, l.Rows[0][2].Weight)
|
||||
// Second row
|
||||
assert.Equal(t, 2, len(l.Rows[1]))
|
||||
assert.Equal(t, 3, l.Rows[1][0].Height)
|
||||
assert.Equal(t, 1/3.0, l.Rows[1][0].Weight)
|
||||
assert.Equal(t, 2, l.Rows[1][1].Height)
|
||||
assert.Equal(t, 2/3.0, l.Rows[1][1].Weight)
|
||||
// Third row
|
||||
assert.Equal(t, 1, len(l.Rows[2]))
|
||||
assert.Equal(t, 1, l.Rows[2][0].Height)
|
||||
assert.Equal(t, 1.0, l.Rows[2][0].Weight)
|
||||
// Fourth row
|
||||
assert.Equal(t, 2, len(l.Rows[3]))
|
||||
assert.Equal(t, 1, l.Rows[3][0].Height)
|
||||
assert.Equal(t, 0.5, l.Rows[3][0].Weight)
|
||||
assert.Equal(t, 1, l.Rows[3][1].Height)
|
||||
assert.Equal(t, 0.5, l.Rows[3][1].Weight)
|
||||
}},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
|
|
4
layouts/kitchensink
Normal file
4
layouts/kitchensink
Normal file
|
@ -0,0 +1,4 @@
|
|||
3:cpu/2 3:mem/1
|
||||
4:temp/1 3:disk/2
|
||||
power
|
||||
3:net 3:procs
|
4
layouts/many_columns_test
Normal file
4
layouts/many_columns_test
Normal file
|
@ -0,0 +1,4 @@
|
|||
cpu/2 mem/1 6:procs/2
|
||||
3:temp/1 2:disk/2
|
||||
power
|
||||
net procs
|
22
termui/gauge.go
Normal file
22
termui/gauge.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package termui
|
||||
|
||||
import (
|
||||
. "github.com/gizak/termui/v3"
|
||||
gizak "github.com/gizak/termui/v3/widgets"
|
||||
)
|
||||
|
||||
// LineGraph implements a line graph of data points.
|
||||
type Gauge struct {
|
||||
*gizak.Gauge
|
||||
}
|
||||
|
||||
func NewGauge() *Gauge {
|
||||
return &Gauge{
|
||||
Gauge: gizak.NewGauge(),
|
||||
}
|
||||
}
|
||||
|
||||
func (self *Gauge) Draw(buf *Buffer) {
|
||||
self.Gauge.Draw(buf)
|
||||
self.Gauge.SetRect(self.Min.X, self.Min.Y, self.Inner.Dx(), self.Inner.Dy())
|
||||
}
|
|
@ -8,6 +8,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/distatus/battery"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
ui "github.com/xxxserxxx/gotop/termui"
|
||||
)
|
||||
|
@ -15,6 +16,7 @@ import (
|
|||
type BatteryWidget struct {
|
||||
*ui.LineGraph
|
||||
updateInterval time.Duration
|
||||
metric []prometheus.Gauge
|
||||
}
|
||||
|
||||
func NewBatteryWidget(horizontalScale int) *BatteryWidget {
|
||||
|
@ -41,6 +43,25 @@ func NewBatteryWidget(horizontalScale int) *BatteryWidget {
|
|||
return self
|
||||
}
|
||||
|
||||
func (b *BatteryWidget) EnableMetric() {
|
||||
bats, err := battery.GetAll()
|
||||
if err != nil {
|
||||
log.Printf("error setting up metrics: %v", err)
|
||||
return
|
||||
}
|
||||
b.metric = make([]prometheus.Gauge, len(bats))
|
||||
for i, bat := range bats {
|
||||
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "battery",
|
||||
Name: fmt.Sprintf("%d", i),
|
||||
})
|
||||
gauge.Set(bat.Current / bat.Full)
|
||||
b.metric[i] = gauge
|
||||
prometheus.MustRegister(gauge)
|
||||
}
|
||||
}
|
||||
|
||||
func makeId(i int) string {
|
||||
return "Batt" + strconv.Itoa(i)
|
||||
}
|
||||
|
@ -74,8 +95,12 @@ func (self *BatteryWidget) update() {
|
|||
}
|
||||
for i, battery := range batteries {
|
||||
id := makeId(i)
|
||||
percentFull := math.Abs(battery.Current/battery.Full) * 100.0
|
||||
perc := battery.Current / battery.Full
|
||||
percentFull := math.Abs(perc) * 100.0
|
||||
self.Data[id] = append(self.Data[id], percentFull)
|
||||
self.Labels[id] = fmt.Sprintf("%3.0f%% %.0f/%.0f", percentFull, math.Abs(battery.Current), math.Abs(battery.Full))
|
||||
if self.metric != nil {
|
||||
self.metric[i].Set(perc)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
86
widgets/batterygauge.go
Normal file
86
widgets/batterygauge.go
Normal file
|
@ -0,0 +1,86 @@
|
|||
package widgets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"time"
|
||||
|
||||
"github.com/distatus/battery"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
. "github.com/xxxserxxx/gotop/termui"
|
||||
)
|
||||
|
||||
type BatteryGauge struct {
|
||||
*Gauge
|
||||
metric prometheus.Gauge
|
||||
}
|
||||
|
||||
func NewBatteryGauge() *BatteryGauge {
|
||||
self := &BatteryGauge{Gauge: NewGauge()}
|
||||
self.Title = " Power Level "
|
||||
|
||||
self.update()
|
||||
|
||||
go func() {
|
||||
for range time.NewTicker(time.Second).C {
|
||||
self.Lock()
|
||||
self.update()
|
||||
self.Unlock()
|
||||
}
|
||||
}()
|
||||
|
||||
return self
|
||||
}
|
||||
|
||||
func (b *BatteryGauge) EnableMetric() {
|
||||
bats, err := battery.GetAll()
|
||||
if err != nil {
|
||||
log.Printf("error setting up metrics: %v", err)
|
||||
return
|
||||
}
|
||||
mx := 0.0
|
||||
cu := 0.0
|
||||
for _, bat := range bats {
|
||||
mx += bat.Full
|
||||
cu += bat.Current
|
||||
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "battery",
|
||||
Name: "total",
|
||||
})
|
||||
gauge.Set(cu / mx)
|
||||
b.metric = gauge
|
||||
prometheus.MustRegister(gauge)
|
||||
}
|
||||
}
|
||||
|
||||
func (self *BatteryGauge) update() {
|
||||
bats, err := battery.GetAll()
|
||||
if err != nil {
|
||||
log.Printf("error setting up batteries: %v", err)
|
||||
return
|
||||
}
|
||||
mx := 0.0
|
||||
cu := 0.0
|
||||
charging := "%d%% ⚡%s"
|
||||
rate := 0.0
|
||||
for _, bat := range bats {
|
||||
mx += bat.Full
|
||||
cu += bat.Current
|
||||
if rate < bat.ChargeRate {
|
||||
rate = bat.ChargeRate
|
||||
}
|
||||
if bat.State == battery.Charging {
|
||||
charging = "%d%% 🔌%s"
|
||||
}
|
||||
}
|
||||
tn := (mx - cu) / rate
|
||||
d, _ := time.ParseDuration(fmt.Sprintf("%fh", tn))
|
||||
self.Percent = int((cu / mx) * 100.0)
|
||||
self.Label = fmt.Sprintf(charging, self.Percent, d.Truncate(time.Minute))
|
||||
if self.metric != nil {
|
||||
self.metric.Set(cu / mx)
|
||||
}
|
||||
}
|
|
@ -1,12 +1,16 @@
|
|||
package widgets
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
psCpu "github.com/shirou/gopsutil/cpu"
|
||||
"github.com/xxxserxxx/gotop/devices"
|
||||
|
||||
ui "github.com/xxxserxxx/gotop/termui"
|
||||
)
|
||||
|
||||
|
@ -18,6 +22,7 @@ type CpuWidget struct {
|
|||
updateInterval time.Duration
|
||||
formatString string
|
||||
updateLock sync.Mutex
|
||||
metric []prometheus.Gauge
|
||||
}
|
||||
|
||||
func NewCpuWidget(updateInterval time.Duration, horizontalScale int, showAverageLoad bool, showPerCpuLoad bool) *CpuWidget {
|
||||
|
@ -70,6 +75,35 @@ func NewCpuWidget(updateInterval time.Duration, horizontalScale int, showAverage
|
|||
return self
|
||||
}
|
||||
|
||||
func (self *CpuWidget) EnableMetric() {
|
||||
if self.ShowAverageLoad {
|
||||
self.metric = make([]prometheus.Gauge, 1)
|
||||
self.metric[0] = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Subsystem: "cpu",
|
||||
Name: "avg",
|
||||
})
|
||||
} else {
|
||||
ctx, ccl := context.WithTimeout(context.Background(), time.Second*5)
|
||||
defer ccl()
|
||||
percents, err := psCpu.PercentWithContext(ctx, self.updateInterval, true)
|
||||
if err != nil {
|
||||
log.Printf("error setting up metrics: %v", err)
|
||||
return
|
||||
}
|
||||
self.metric = make([]prometheus.Gauge, self.CpuCount)
|
||||
for i, perc := range percents {
|
||||
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "cpu",
|
||||
Name: fmt.Sprintf("%d", i),
|
||||
})
|
||||
gauge.Set(perc)
|
||||
prometheus.MustRegister(gauge)
|
||||
self.metric[i] = gauge
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *CpuWidget) Scale(i int) {
|
||||
b.LineGraph.HorizontalScale = i
|
||||
}
|
||||
|
@ -87,6 +121,9 @@ func (self *CpuWidget) update() {
|
|||
defer self.updateLock.Unlock()
|
||||
self.Data["AVRG"] = append(self.Data["AVRG"], percent[0])
|
||||
self.Labels["AVRG"] = fmt.Sprintf("%3.0f%%", percent[0])
|
||||
if self.metric != nil {
|
||||
self.metric[0].Set(percent[0])
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
@ -108,6 +145,13 @@ func (self *CpuWidget) update() {
|
|||
key := fmt.Sprintf(self.formatString, i)
|
||||
self.Data[key] = append(self.Data[key], percent)
|
||||
self.Labels[key] = fmt.Sprintf("%3.0f%%", percent)
|
||||
if self.metric != nil {
|
||||
if self.metric[i] == nil {
|
||||
log.Printf("ERROR: not enough metrics %d", i)
|
||||
} else {
|
||||
self.metric[i].Set(percent)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
psDisk "github.com/shirou/gopsutil/disk"
|
||||
|
||||
ui "github.com/xxxserxxx/gotop/termui"
|
||||
|
@ -28,6 +29,7 @@ type DiskWidget struct {
|
|||
*ui.Table
|
||||
updateInterval time.Duration
|
||||
Partitions map[string]*Partition
|
||||
metric map[string]prometheus.Gauge
|
||||
}
|
||||
|
||||
func NewDiskWidget() *DiskWidget {
|
||||
|
@ -60,6 +62,21 @@ func NewDiskWidget() *DiskWidget {
|
|||
return self
|
||||
}
|
||||
|
||||
func (self *DiskWidget) EnableMetric() {
|
||||
self.metric = make(map[string]prometheus.Gauge)
|
||||
for key, part := range self.Partitions {
|
||||
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "disk",
|
||||
Name: strings.ReplaceAll(key, "/", ":"),
|
||||
//Name: strings.Replace(strings.Replace(part.Device, "/dev/", "", -1), "mapper/", "", -1),
|
||||
})
|
||||
gauge.Set(float64(part.UsedPercent) / 100.0)
|
||||
prometheus.MustRegister(gauge)
|
||||
self.metric[key] = gauge
|
||||
}
|
||||
}
|
||||
|
||||
func (self *DiskWidget) update() {
|
||||
partitions, err := psDisk.Partitions(false)
|
||||
if err != nil {
|
||||
|
@ -158,5 +175,12 @@ func (self *DiskWidget) update() {
|
|||
self.Rows[i][3] = partition.Free
|
||||
self.Rows[i][4] = partition.BytesReadRecently
|
||||
self.Rows[i][5] = partition.BytesWrittenRecently
|
||||
if self.metric != nil {
|
||||
if self.metric[key] == nil {
|
||||
log.Printf("ERROR: missing metric %s", key)
|
||||
} else {
|
||||
self.metric[key].Set(float64(partition.UsedPercent) / 100.0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
psMem "github.com/shirou/gopsutil/mem"
|
||||
|
||||
ui "github.com/xxxserxxx/gotop/termui"
|
||||
|
@ -14,6 +15,8 @@ import (
|
|||
type MemWidget struct {
|
||||
*ui.LineGraph
|
||||
updateInterval time.Duration
|
||||
mainMetric prometheus.Gauge
|
||||
swapMetric prometheus.Gauge
|
||||
}
|
||||
|
||||
type MemoryInfo struct {
|
||||
|
@ -45,6 +48,9 @@ func (self *MemWidget) updateMainMemory() {
|
|||
Used: mainMemory.Used,
|
||||
UsedPercent: mainMemory.UsedPercent,
|
||||
})
|
||||
if self.mainMetric != nil {
|
||||
self.mainMetric.Set(mainMemory.UsedPercent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,6 +79,30 @@ func NewMemWidget(updateInterval time.Duration, horizontalScale int) *MemWidget
|
|||
return self
|
||||
}
|
||||
|
||||
func (b *MemWidget) EnableMetric() {
|
||||
b.mainMetric = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "memory",
|
||||
Name: "main",
|
||||
})
|
||||
mainMemory, err := psMem.VirtualMemory()
|
||||
if err == nil {
|
||||
b.mainMetric.Set(mainMemory.UsedPercent)
|
||||
}
|
||||
prometheus.MustRegister(b.mainMetric)
|
||||
|
||||
b.swapMetric = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "memory",
|
||||
Name: "swap",
|
||||
})
|
||||
swapMemory, err := psMem.SwapMemory()
|
||||
if err == nil {
|
||||
b.swapMetric.Set(swapMemory.UsedPercent)
|
||||
}
|
||||
prometheus.MustRegister(b.swapMetric)
|
||||
}
|
||||
|
||||
func (b *MemWidget) Scale(i int) {
|
||||
b.LineGraph.HorizontalScale = i
|
||||
}
|
||||
|
|
|
@ -60,5 +60,8 @@ func (self *MemWidget) updateSwapMemory() {
|
|||
Used: swapMemory.Used,
|
||||
UsedPercent: swapMemory.UsedPercent,
|
||||
})
|
||||
if self.swapMetric != nil {
|
||||
self.swapMetric.Set(swapMemory.UsedPercent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,5 +18,8 @@ func (self *MemWidget) updateSwapMemory() {
|
|||
Used: swapMemory.Used,
|
||||
UsedPercent: swapMemory.UsedPercent,
|
||||
})
|
||||
if self.swapMetric != nil {
|
||||
self.swapMetric.Set(swapMemory.UsedPercent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
psNet "github.com/shirou/gopsutil/net"
|
||||
|
||||
ui "github.com/xxxserxxx/gotop/termui"
|
||||
|
@ -25,6 +26,8 @@ type NetWidget struct {
|
|||
totalBytesRecv uint64
|
||||
totalBytesSent uint64
|
||||
NetInterface []string
|
||||
sentMetric prometheus.Counter
|
||||
recvMetric prometheus.Counter
|
||||
}
|
||||
|
||||
// TODO: state:merge #169 % option for network use (jrswab/networkPercentage)
|
||||
|
@ -59,6 +62,22 @@ func NewNetWidget(netInterface string) *NetWidget {
|
|||
return self
|
||||
}
|
||||
|
||||
func (b *NetWidget) EnableMetric() {
|
||||
b.recvMetric = prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "net",
|
||||
Name: "recv",
|
||||
})
|
||||
prometheus.MustRegister(b.recvMetric)
|
||||
|
||||
b.sentMetric = prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "net",
|
||||
Name: "sent",
|
||||
})
|
||||
prometheus.MustRegister(b.sentMetric)
|
||||
}
|
||||
|
||||
func (self *NetWidget) update() {
|
||||
interfaces, err := psNet.IOCounters(true)
|
||||
if err != nil {
|
||||
|
@ -115,6 +134,10 @@ func (self *NetWidget) update() {
|
|||
|
||||
self.Lines[0].Data = append(self.Lines[0].Data, int(recentBytesRecv))
|
||||
self.Lines[1].Data = append(self.Lines[1].Data, int(recentBytesSent))
|
||||
if self.sentMetric != nil {
|
||||
self.sentMetric.Add(float64(recentBytesSent))
|
||||
self.recvMetric.Add(float64(recentBytesRecv))
|
||||
}
|
||||
}
|
||||
|
||||
// used in later calls to update
|
||||
|
|
|
@ -100,6 +100,10 @@ func NewProcWidget() *ProcWidget {
|
|||
return self
|
||||
}
|
||||
|
||||
func (p *ProcWidget) EnableMetric() {
|
||||
// There's (currently) no metric for this
|
||||
}
|
||||
|
||||
func (self *ProcWidget) SetEditingFilter(editing bool) {
|
||||
self.entry.SetEditing(editing)
|
||||
}
|
||||
|
|
|
@ -7,16 +7,16 @@ import (
|
|||
"time"
|
||||
|
||||
ui "github.com/gizak/termui/v3"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
"github.com/xxxserxxx/gotop/utils"
|
||||
)
|
||||
|
||||
type TempScale int
|
||||
type TempScale rune
|
||||
|
||||
const (
|
||||
Celsius TempScale = 0
|
||||
Fahrenheit = 1
|
||||
Disabled = 2
|
||||
Celsius TempScale = 'C'
|
||||
Fahrenheit = 'F'
|
||||
)
|
||||
|
||||
type TempWidget struct {
|
||||
|
@ -27,6 +27,7 @@ type TempWidget struct {
|
|||
TempLowColor ui.Color
|
||||
TempHighColor ui.Color
|
||||
TempScale TempScale
|
||||
tempsMetric map[string]prometheus.Gauge
|
||||
}
|
||||
|
||||
// TODO: state:deferred 156 Added temperatures for NVidia GPUs (azak-azkaran/master). Crashes on non-nvidia machines.
|
||||
|
@ -57,6 +58,20 @@ func NewTempWidget(tempScale TempScale) *TempWidget {
|
|||
return self
|
||||
}
|
||||
|
||||
func (self *TempWidget) EnableMetric() {
|
||||
self.tempsMetric = make(map[string]prometheus.Gauge)
|
||||
for k, v := range self.Data {
|
||||
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
|
||||
Namespace: "gotop",
|
||||
Subsystem: "temp",
|
||||
Name: k,
|
||||
})
|
||||
gauge.Set(float64(v))
|
||||
prometheus.MustRegister(gauge)
|
||||
self.tempsMetric[k] = gauge
|
||||
}
|
||||
}
|
||||
|
||||
// Custom Draw method instead of inheriting from a generic Widget.
|
||||
func (self *TempWidget) Draw(buf *ui.Buffer) {
|
||||
self.Block.Draw(buf)
|
||||
|
@ -86,19 +101,15 @@ func (self *TempWidget) Draw(buf *ui.Buffer) {
|
|||
)
|
||||
|
||||
// TODO: state:merge #184 or #177 degree symbol (BartWillems/master, fleaz/master)
|
||||
switch self.TempScale {
|
||||
case Fahrenheit:
|
||||
buf.SetString(
|
||||
fmt.Sprintf("%3dF", self.Data[key]),
|
||||
ui.NewStyle(fg),
|
||||
image.Pt(self.Inner.Max.X-4, self.Inner.Min.Y+y),
|
||||
)
|
||||
case Celsius:
|
||||
buf.SetString(
|
||||
fmt.Sprintf("%3dC", self.Data[key]),
|
||||
ui.NewStyle(fg),
|
||||
image.Pt(self.Inner.Max.X-4, self.Inner.Min.Y+y),
|
||||
)
|
||||
if self.tempsMetric != nil {
|
||||
self.tempsMetric[key].Set(float64(self.Data[key]))
|
||||
}
|
||||
temperature := fmt.Sprintf("%3d°%c", self.Data[key], self.TempScale)
|
||||
|
||||
buf.SetString(
|
||||
temperature,
|
||||
ui.NewStyle(fg),
|
||||
image.Pt(self.Inner.Max.X-(len(temperature)-1), self.Inner.Min.Y+y),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user