123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package widget
- import (
- "context"
- "golang.org/x/text/cases"
- "golang.org/x/text/language"
- "html/template"
- "strings"
- "time"
- "github.com/glanceapp/glance/internal/assets"
- "github.com/glanceapp/glance/internal/feed"
- )
- const (
- defaultDockerHost = "unix:///var/run/docker.sock"
- dockerGlanceEnable = "glance.enable"
- dockerGlanceTitle = "glance.title"
- dockerGlanceUrl = "glance.url"
- dockerGlanceIconUrl = "glance.iconUrl"
- )
- type containerData struct {
- Id string
- Image string
- URL string
- Title string
- Icon CustomIcon
- StatusShort string
- StatusFull string
- StatusStyle string
- }
- type Docker struct {
- widgetBase `yaml:",inline"`
- HostURL string `yaml:"host-url"`
- Containers []containerData `yaml:"-"`
- }
- func (widget *Docker) Initialize() error {
- widget.withTitle("Docker").withCacheDuration(1 * time.Minute)
- return nil
- }
- func (widget *Docker) Update(_ context.Context) {
- if widget.HostURL == "" {
- widget.HostURL = defaultDockerHost
- }
- containers, err := feed.FetchDockerContainers(widget.HostURL)
- if !widget.canContinueUpdateAfterHandlingErr(err) {
- return
- }
- var items []containerData
- for _, c := range containers {
- isGlanceEnabled := getLabelValue(c.Labels, dockerGlanceEnable, "true")
- if isGlanceEnabled != "true" {
- continue
- }
- var item containerData
- item.Id = c.Id
- item.Image = c.Image
- item.Title = getLabelValue(c.Labels, dockerGlanceTitle, strings.Join(c.Names, ""))
- item.URL = getLabelValue(c.Labels, dockerGlanceUrl, "")
- _ = item.Icon.FromURL(getLabelValue(c.Labels, dockerGlanceIconUrl, "si:docker"))
- switch c.State {
- case "paused":
- case "starting":
- case "unhealthy":
- item.StatusStyle = "warning"
- break
- case "stopped":
- case "dead":
- case "exited":
- item.StatusStyle = "error"
- break
- default:
- item.StatusStyle = "success"
- }
- item.StatusFull = c.Status
- item.StatusShort = cases.Title(language.English, cases.Compact).String(c.State)
- items = append(items, item)
- }
- widget.Containers = items
- }
- func (widget *Docker) Render() template.HTML {
- return widget.render(widget, assets.DockerTemplate)
- }
- // getLabelValue get string value associated to a label.
- func getLabelValue(labels map[string]string, labelName, defaultValue string) string {
- if value, ok := labels[labelName]; ok && len(value) > 0 {
- return value
- }
- return defaultValue
- }
|