104 lines
2.9 KiB
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
|
|
}
|