2014-08-07 23:01:55 -04:00
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"runtime"
|
2015-11-15 02:56:11 -05:00
|
|
|
"strings"
|
2015-03-10 14:25:47 -04:00
|
|
|
"time"
|
2014-08-07 23:01:55 -04:00
|
|
|
|
2015-03-26 18:22:04 -04:00
|
|
|
"github.com/Sirupsen/logrus"
|
2015-04-10 13:26:30 -04:00
|
|
|
"github.com/docker/docker/api/types"
|
2015-11-09 13:32:46 -05:00
|
|
|
"github.com/docker/docker/dockerversion"
|
2015-03-29 17:17:23 -04:00
|
|
|
"github.com/docker/docker/pkg/fileutils"
|
2014-08-07 23:01:55 -04:00
|
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
|
|
"github.com/docker/docker/pkg/parsers/operatingsystem"
|
2015-11-14 17:03:02 -05:00
|
|
|
"github.com/docker/docker/pkg/platform"
|
2015-08-06 07:54:48 -04:00
|
|
|
"github.com/docker/docker/pkg/sysinfo"
|
2014-10-24 18:48:23 -04:00
|
|
|
"github.com/docker/docker/pkg/system"
|
2014-08-07 23:01:55 -04:00
|
|
|
"github.com/docker/docker/registry"
|
|
|
|
"github.com/docker/docker/utils"
|
2015-10-23 02:08:26 -04:00
|
|
|
"github.com/docker/docker/volume/drivers"
|
2014-08-07 23:01:55 -04:00
|
|
|
)
|
|
|
|
|
2015-07-30 17:01:53 -04:00
|
|
|
// SystemInfo returns information about the host server the daemon is running on.
|
2015-09-29 13:51:40 -04:00
|
|
|
func (daemon *Daemon) SystemInfo() (*types.Info, error) {
|
2014-08-07 23:01:55 -04:00
|
|
|
kernelVersion := "<unknown>"
|
|
|
|
if kv, err := kernel.GetKernelVersion(); err == nil {
|
|
|
|
kernelVersion = kv.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
operatingSystem := "<unknown>"
|
|
|
|
if s, err := operatingsystem.GetOperatingSystem(); err == nil {
|
|
|
|
operatingSystem = s
|
|
|
|
}
|
2015-04-27 11:38:01 -04:00
|
|
|
|
|
|
|
// Don't do containerized check on Windows
|
|
|
|
if runtime.GOOS != "windows" {
|
|
|
|
if inContainer, err := operatingsystem.IsContainerized(); err != nil {
|
|
|
|
logrus.Errorf("Could not determine if daemon is containerized: %v", err)
|
|
|
|
operatingSystem += " (error determining if containerized)"
|
|
|
|
} else if inContainer {
|
|
|
|
operatingSystem += " (containerized)"
|
|
|
|
}
|
2014-08-07 23:01:55 -04:00
|
|
|
}
|
|
|
|
|
2014-10-24 18:48:23 -04:00
|
|
|
meminfo, err := system.ReadMemInfo()
|
|
|
|
if err != nil {
|
2015-03-26 18:22:04 -04:00
|
|
|
logrus.Errorf("Could not read system memory info: %v", err)
|
2014-10-24 18:48:23 -04:00
|
|
|
}
|
|
|
|
|
2015-07-30 17:01:53 -04:00
|
|
|
// 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)
|
2014-08-07 23:01:55 -04:00
|
|
|
initPath := utils.DockerInitPath("")
|
2015-10-09 02:57:47 -04:00
|
|
|
sysInfo := sysinfo.New(true)
|
2015-08-06 07:54:48 -04:00
|
|
|
|
2015-04-10 13:26:30 -04:00
|
|
|
v := &types.Info{
|
|
|
|
ID: daemon.ID,
|
2015-09-29 13:51:40 -04:00
|
|
|
Containers: len(daemon.List()),
|
2015-11-18 17:20:54 -05:00
|
|
|
Images: len(daemon.imageStore.Map()),
|
2015-09-29 13:51:40 -04:00
|
|
|
Driver: daemon.GraphDriver().String(),
|
|
|
|
DriverStatus: daemon.GraphDriver().Status(),
|
2015-10-23 02:08:26 -04:00
|
|
|
Plugins: daemon.showPluginsInfo(),
|
2015-08-06 07:54:48 -04:00
|
|
|
IPv4Forwarding: !sysInfo.IPv4ForwardingDisabled,
|
|
|
|
BridgeNfIptables: !sysInfo.BridgeNfCallIptablesDisabled,
|
2015-07-23 05:40:54 -04:00
|
|
|
BridgeNfIP6tables: !sysInfo.BridgeNfCallIP6tablesDisabled,
|
2015-04-10 13:26:30 -04:00
|
|
|
Debug: os.Getenv("DEBUG") != "",
|
|
|
|
NFd: fileutils.GetTotalUsedFds(),
|
|
|
|
NGoroutines: runtime.NumGoroutine(),
|
|
|
|
SystemTime: time.Now().Format(time.RFC3339Nano),
|
2015-09-29 13:51:40 -04:00
|
|
|
ExecutionDriver: daemon.ExecutionDriver().Name(),
|
2015-04-10 13:26:30 -04:00
|
|
|
LoggingDriver: daemon.defaultLogConfig.Type,
|
|
|
|
NEventsListener: daemon.EventsService.SubscribersCount(),
|
|
|
|
KernelVersion: kernelVersion,
|
|
|
|
OperatingSystem: operatingSystem,
|
2015-07-21 15:40:36 -04:00
|
|
|
IndexServerAddress: registry.IndexServer,
|
2015-11-14 17:03:02 -05:00
|
|
|
OSType: platform.OSType,
|
|
|
|
Architecture: platform.Architecture,
|
2015-04-10 13:26:30 -04:00
|
|
|
RegistryConfig: daemon.RegistryService.Config,
|
2015-11-09 13:32:46 -05:00
|
|
|
InitSha1: dockerversion.InitSHA1,
|
2015-04-10 13:26:30 -04:00
|
|
|
InitPath: initPath,
|
|
|
|
NCPU: runtime.NumCPU(),
|
|
|
|
MemTotal: meminfo.MemTotal,
|
2015-07-30 17:01:53 -04:00
|
|
|
DockerRootDir: daemon.config().Root,
|
|
|
|
Labels: daemon.config().Labels,
|
2015-05-19 18:09:58 -04:00
|
|
|
ExperimentalBuild: utils.ExperimentalBuild(),
|
2015-11-09 13:32:46 -05:00
|
|
|
ServerVersion: dockerversion.Version,
|
2015-09-10 19:12:00 -04:00
|
|
|
ClusterStore: daemon.config().ClusterStore,
|
2015-10-25 20:12:22 -04:00
|
|
|
ClusterAdvertise: daemon.config().ClusterAdvertise,
|
2015-11-15 02:56:11 -05:00
|
|
|
HTTPProxy: getProxyEnv("http_proxy"),
|
|
|
|
HTTPSProxy: getProxyEnv("https_proxy"),
|
|
|
|
NoProxy: getProxyEnv("no_proxy"),
|
2015-04-10 13:26:30 -04:00
|
|
|
}
|
|
|
|
|
2015-07-09 19:37:54 -04:00
|
|
|
// TODO Windows. Refactor this more once sysinfo is refactored into
|
|
|
|
// platform specific code. On Windows, sysinfo.cgroupMemInfo and
|
|
|
|
// sysinfo.cgroupCpuInfo will be nil otherwise and cause a SIGSEGV if
|
|
|
|
// an attempt is made to access through them.
|
|
|
|
if runtime.GOOS != "windows" {
|
2015-08-06 07:54:48 -04:00
|
|
|
v.MemoryLimit = sysInfo.MemoryLimit
|
|
|
|
v.SwapLimit = sysInfo.SwapLimit
|
|
|
|
v.OomKillDisable = sysInfo.OomKillDisable
|
2015-07-23 05:40:54 -04:00
|
|
|
v.CPUCfsPeriod = sysInfo.CPUCfsPeriod
|
|
|
|
v.CPUCfsQuota = sysInfo.CPUCfsQuota
|
2015-10-09 03:02:04 -04:00
|
|
|
v.CPUShares = sysInfo.CPUShares
|
|
|
|
v.CPUSet = sysInfo.Cpuset
|
2015-07-09 19:37:54 -04:00
|
|
|
}
|
|
|
|
|
2014-11-17 14:23:41 -05:00
|
|
|
if hostname, err := os.Hostname(); err == nil {
|
2015-04-10 13:26:30 -04:00
|
|
|
v.Name = hostname
|
2014-11-17 14:23:41 -05:00
|
|
|
}
|
2015-04-10 13:26:30 -04:00
|
|
|
|
|
|
|
return v, nil
|
2014-08-07 23:01:55 -04:00
|
|
|
}
|
2015-10-23 02:08:26 -04:00
|
|
|
|
|
|
|
func (daemon *Daemon) showPluginsInfo() types.PluginsInfo {
|
|
|
|
var pluginsInfo types.PluginsInfo
|
|
|
|
|
|
|
|
pluginsInfo.Volume = volumedrivers.GetDriverList()
|
|
|
|
|
|
|
|
networkDriverList := daemon.GetNetworkDriverList()
|
|
|
|
for nd := range networkDriverList {
|
|
|
|
pluginsInfo.Network = append(pluginsInfo.Network, nd)
|
|
|
|
}
|
|
|
|
|
|
|
|
return pluginsInfo
|
|
|
|
}
|
2015-11-15 02:56:11 -05:00
|
|
|
|
|
|
|
// The uppercase and the lowercase are available for the proxy settings.
|
|
|
|
// See the Go specification for details on these variables. https://golang.org/pkg/net/http/
|
|
|
|
func getProxyEnv(key string) string {
|
|
|
|
proxyValue := os.Getenv(strings.ToUpper(key))
|
|
|
|
if proxyValue == "" {
|
|
|
|
return os.Getenv(strings.ToLower(key))
|
|
|
|
}
|
|
|
|
return proxyValue
|
|
|
|
}
|