ArinDash/widgets/dockerlist.go

104 lines
2.9 KiB
Go

package widgets
import (
"ArinDash/apis/docker"
"ArinDash/util"
"context"
"fmt"
"sort"
"strings"
"time"
"github.com/mum4k/termdash/cell"
"github.com/mum4k/termdash/terminal/terminalapi"
"github.com/mum4k/termdash/widgetapi"
"github.com/mum4k/termdash/widgets/text"
)
type DockerListOptions struct {
}
func DockerList() DockerListOptions {
widgetOptions["DockerListOptions"] = createDockerList
return DockerListOptions{}
}
func createDockerList(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
list := util.PanicOnErrorWithResult(text.New())
go util.Periodic(ctx, 1*time.Second, func() error {
ms, err := docker.FetchDockerMetrics(ctx)
if err != nil {
return nil
}
sort.Slice(ms, func(i, j int) bool { return ms[i].CPUPercent > ms[j].CPUPercent })
if err := list.Write(fmt.Sprintf("%-30s | %-6s | %-6s | %s\n", "Name", "CPU", "MEM", "Status"), text.WriteReplace(), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := list.Write(fmt.Sprintf("───────────────────────────────┼────────┼────────┼─────────────────────\n"), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
for _, m := range ms {
status := cell.ColorWhite
if strings.Contains(m.Status, "Exited") {
status = cell.ColorRed
}
if strings.Contains(m.Status, "unhealthy") {
status = cell.ColorYellow
}
if strings.Contains(m.Status, "Restarting") {
status = cell.ColorYellow
}
if strings.Contains(m.Status, "Paused") {
status = cell.ColorBlue
}
var name string
if len(m.Name) > 30 {
name = m.Name[:27] + "..."
} else {
name = m.Name
}
if err := list.Write(fmt.Sprintf("%-30s", name), text.WriteCellOpts(cell.FgColor(status))); err != nil {
return err
}
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := writePercent(m.CPUPercent, list); err != nil {
return err
}
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := writePercent(m.MemPercent, list); err != nil {
return err
}
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := list.Write(fmt.Sprintf("%s\n", m.Status), text.WriteCellOpts(cell.FgColor(status))); err != nil {
return err
}
}
return nil
})
return list
}
func writePercent(p float64, list *text.Text) error {
color := cell.ColorWhite
if p > 75 {
color = cell.ColorRed
}
if p > 50 {
color = cell.ColorYellow
}
if err := list.Write(fmt.Sprintf("%-5.1f%%", p), text.WriteCellOpts(cell.FgColor(color))); err != nil {
return err
}
return nil
}