docker.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package widget
  2. import (
  3. "context"
  4. "golang.org/x/text/cases"
  5. "golang.org/x/text/language"
  6. "html/template"
  7. "strings"
  8. "time"
  9. "github.com/glanceapp/glance/internal/assets"
  10. "github.com/glanceapp/glance/internal/feed"
  11. )
  12. const (
  13. defaultDockerHost = "unix:///var/run/docker.sock"
  14. dockerGlanceEnable = "glance.enable"
  15. dockerGlanceTitle = "glance.title"
  16. dockerGlanceUrl = "glance.url"
  17. dockerGlanceIconUrl = "glance.iconUrl"
  18. )
  19. type containerData struct {
  20. Id string
  21. Image string
  22. URL string
  23. Title string
  24. Icon CustomIcon
  25. StatusShort string
  26. StatusFull string
  27. StatusStyle string
  28. }
  29. type Docker struct {
  30. widgetBase `yaml:",inline"`
  31. HostURL string `yaml:"host-url"`
  32. Containers []containerData `yaml:"-"`
  33. }
  34. func (widget *Docker) Initialize() error {
  35. widget.withTitle("Docker").withCacheDuration(1 * time.Minute)
  36. return nil
  37. }
  38. func (widget *Docker) Update(_ context.Context) {
  39. if widget.HostURL == "" {
  40. widget.HostURL = defaultDockerHost
  41. }
  42. containers, err := feed.FetchDockerContainers(widget.HostURL)
  43. if !widget.canContinueUpdateAfterHandlingErr(err) {
  44. return
  45. }
  46. var items []containerData
  47. for _, c := range containers {
  48. isGlanceEnabled := getLabelValue(c.Labels, dockerGlanceEnable, "true")
  49. if isGlanceEnabled != "true" {
  50. continue
  51. }
  52. var item containerData
  53. item.Id = c.Id
  54. item.Image = c.Image
  55. item.Title = getLabelValue(c.Labels, dockerGlanceTitle, strings.Join(c.Names, ""))
  56. item.URL = getLabelValue(c.Labels, dockerGlanceUrl, "")
  57. _ = item.Icon.FromURL(getLabelValue(c.Labels, dockerGlanceIconUrl, "si:docker"))
  58. switch c.State {
  59. case "paused":
  60. case "starting":
  61. case "unhealthy":
  62. item.StatusStyle = "warning"
  63. break
  64. case "stopped":
  65. case "dead":
  66. case "exited":
  67. item.StatusStyle = "error"
  68. break
  69. default:
  70. item.StatusStyle = "success"
  71. }
  72. item.StatusFull = c.Status
  73. item.StatusShort = cases.Title(language.English, cases.Compact).String(c.State)
  74. items = append(items, item)
  75. }
  76. widget.Containers = items
  77. }
  78. func (widget *Docker) Render() template.HTML {
  79. return widget.render(widget, assets.DockerTemplate)
  80. }
  81. // getLabelValue get string value associated to a label.
  82. func getLabelValue(labels map[string]string, labelName, defaultValue string) string {
  83. if value, ok := labels[labelName]; ok && len(value) > 0 {
  84. return value
  85. }
  86. return defaultValue
  87. }