daemon.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package server
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "runtime"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/Sirupsen/logrus"
  10. "github.com/docker/docker/api"
  11. "github.com/docker/docker/api/types"
  12. "github.com/docker/docker/autogen/dockerversion"
  13. "github.com/docker/docker/pkg/ioutils"
  14. "github.com/docker/docker/pkg/jsonmessage"
  15. "github.com/docker/docker/pkg/parsers/filters"
  16. "github.com/docker/docker/pkg/parsers/kernel"
  17. "github.com/docker/docker/pkg/version"
  18. "github.com/docker/docker/utils"
  19. )
  20. func (s *Server) getVersion(version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  21. v := &types.Version{
  22. Version: dockerversion.VERSION,
  23. ApiVersion: api.Version,
  24. GitCommit: dockerversion.GITCOMMIT,
  25. GoVersion: runtime.Version(),
  26. Os: runtime.GOOS,
  27. Arch: runtime.GOARCH,
  28. BuildTime: dockerversion.BUILDTIME,
  29. }
  30. if version.GreaterThanOrEqualTo("1.19") {
  31. v.Experimental = utils.ExperimentalBuild()
  32. }
  33. if kernelVersion, err := kernel.GetKernelVersion(); err == nil {
  34. v.KernelVersion = kernelVersion.String()
  35. }
  36. return writeJSON(w, http.StatusOK, v)
  37. }
  38. func (s *Server) getInfo(version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  39. info, err := s.daemon.SystemInfo()
  40. if err != nil {
  41. return err
  42. }
  43. return writeJSON(w, http.StatusOK, info)
  44. }
  45. func (s *Server) getEvents(version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  46. if err := parseForm(r); err != nil {
  47. return err
  48. }
  49. var since int64 = -1
  50. if r.Form.Get("since") != "" {
  51. s, err := strconv.ParseInt(r.Form.Get("since"), 10, 64)
  52. if err != nil {
  53. return err
  54. }
  55. since = s
  56. }
  57. var until int64 = -1
  58. if r.Form.Get("until") != "" {
  59. u, err := strconv.ParseInt(r.Form.Get("until"), 10, 64)
  60. if err != nil {
  61. return err
  62. }
  63. until = u
  64. }
  65. timer := time.NewTimer(0)
  66. timer.Stop()
  67. if until > 0 {
  68. dur := time.Unix(until, 0).Sub(time.Now())
  69. timer = time.NewTimer(dur)
  70. }
  71. ef, err := filters.FromParam(r.Form.Get("filters"))
  72. if err != nil {
  73. return err
  74. }
  75. isFiltered := func(field string, filter []string) bool {
  76. if len(field) == 0 {
  77. return false
  78. }
  79. if len(filter) == 0 {
  80. return false
  81. }
  82. for _, v := range filter {
  83. if v == field {
  84. return false
  85. }
  86. if strings.Contains(field, ":") {
  87. image := strings.Split(field, ":")
  88. if image[0] == v {
  89. return false
  90. }
  91. }
  92. }
  93. return true
  94. }
  95. d := s.daemon
  96. es := d.EventsService
  97. w.Header().Set("Content-Type", "application/json")
  98. outStream := ioutils.NewWriteFlusher(w)
  99. outStream.Write(nil) // make sure response is sent immediately
  100. enc := json.NewEncoder(outStream)
  101. getContainerID := func(cn string) string {
  102. c, err := d.Get(cn)
  103. if err != nil {
  104. return ""
  105. }
  106. return c.ID
  107. }
  108. sendEvent := func(ev *jsonmessage.JSONMessage) error {
  109. //incoming container filter can be name,id or partial id, convert and replace as a full container id
  110. for i, cn := range ef["container"] {
  111. ef["container"][i] = getContainerID(cn)
  112. }
  113. if isFiltered(ev.Status, ef["event"]) || (isFiltered(ev.ID, ef["image"]) &&
  114. isFiltered(ev.From, ef["image"])) || isFiltered(ev.ID, ef["container"]) {
  115. return nil
  116. }
  117. return enc.Encode(ev)
  118. }
  119. current, l := es.Subscribe()
  120. if since == -1 {
  121. current = nil
  122. }
  123. defer es.Evict(l)
  124. for _, ev := range current {
  125. if ev.Time < since {
  126. continue
  127. }
  128. if err := sendEvent(ev); err != nil {
  129. return err
  130. }
  131. }
  132. var closeNotify <-chan bool
  133. if closeNotifier, ok := w.(http.CloseNotifier); ok {
  134. closeNotify = closeNotifier.CloseNotify()
  135. }
  136. for {
  137. select {
  138. case ev := <-l:
  139. jev, ok := ev.(*jsonmessage.JSONMessage)
  140. if !ok {
  141. continue
  142. }
  143. if err := sendEvent(jev); err != nil {
  144. return err
  145. }
  146. case <-timer.C:
  147. return nil
  148. case <-closeNotify:
  149. logrus.Debug("Client disconnected, stop sending events")
  150. return nil
  151. }
  152. }
  153. }