info.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package daemon
  2. import (
  3. "os"
  4. "runtime"
  5. "github.com/docker/docker/dockerversion"
  6. "github.com/docker/docker/engine"
  7. "github.com/docker/docker/pkg/parsers/kernel"
  8. "github.com/docker/docker/pkg/parsers/operatingsystem"
  9. "github.com/docker/docker/registry"
  10. "github.com/docker/docker/utils"
  11. )
  12. func (daemon *Daemon) CmdInfo(job *engine.Job) engine.Status {
  13. images, _ := daemon.Graph().Map()
  14. var imgcount int
  15. if images == nil {
  16. imgcount = 0
  17. } else {
  18. imgcount = len(images)
  19. }
  20. kernelVersion := "<unknown>"
  21. if kv, err := kernel.GetKernelVersion(); err == nil {
  22. kernelVersion = kv.String()
  23. }
  24. operatingSystem := "<unknown>"
  25. if s, err := operatingsystem.GetOperatingSystem(); err == nil {
  26. operatingSystem = s
  27. }
  28. if inContainer, err := operatingsystem.IsContainerized(); err != nil {
  29. utils.Errorf("Could not determine if daemon is containerized: %v", err)
  30. operatingSystem += " (error determining if containerized)"
  31. } else if inContainer {
  32. operatingSystem += " (containerized)"
  33. }
  34. // if we still have the original dockerinit binary from before we copied it locally, let's return the path to that, since that's more intuitive (the copied path is trivial to derive by hand given VERSION)
  35. initPath := utils.DockerInitPath("")
  36. if initPath == "" {
  37. // if that fails, we'll just return the path from the daemon
  38. initPath = daemon.SystemInitPath()
  39. }
  40. cjob := job.Eng.Job("subscribers_count")
  41. env, _ := cjob.Stdout.AddEnv()
  42. if err := cjob.Run(); err != nil {
  43. return job.Error(err)
  44. }
  45. v := &engine.Env{}
  46. v.SetInt("Containers", len(daemon.List()))
  47. v.SetInt("Images", imgcount)
  48. v.Set("Driver", daemon.GraphDriver().String())
  49. v.SetJson("DriverStatus", daemon.GraphDriver().Status())
  50. v.SetBool("MemoryLimit", daemon.SystemConfig().MemoryLimit)
  51. v.SetBool("SwapLimit", daemon.SystemConfig().SwapLimit)
  52. v.SetBool("IPv4Forwarding", !daemon.SystemConfig().IPv4ForwardingDisabled)
  53. v.SetBool("Debug", os.Getenv("DEBUG") != "")
  54. v.SetInt("NFd", utils.GetTotalUsedFds())
  55. v.SetInt("NGoroutines", runtime.NumGoroutine())
  56. v.Set("ExecutionDriver", daemon.ExecutionDriver().Name())
  57. v.SetInt("NEventsListener", env.GetInt("count"))
  58. v.Set("KernelVersion", kernelVersion)
  59. v.Set("OperatingSystem", operatingSystem)
  60. v.Set("IndexServerAddress", registry.IndexServerAddress())
  61. v.Set("InitSha1", dockerversion.INITSHA1)
  62. v.Set("InitPath", initPath)
  63. if _, err := v.WriteTo(job.Stdout); err != nil {
  64. return job.Error(err)
  65. }
  66. return engine.StatusOK
  67. }