2014-08-08 03:01:55 +00:00
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"runtime"
|
2016-01-15 23:55:46 +00:00
|
|
|
"sync/atomic"
|
2015-03-10 18:25:47 +00:00
|
|
|
"time"
|
2014-08-08 03:01:55 +00:00
|
|
|
|
2015-03-26 22:22:04 +00:00
|
|
|
"github.com/Sirupsen/logrus"
|
2016-01-15 23:55:46 +00:00
|
|
|
"github.com/docker/docker/container"
|
2015-11-09 18:32:46 +00:00
|
|
|
"github.com/docker/docker/dockerversion"
|
2015-03-29 21:17:23 +00:00
|
|
|
"github.com/docker/docker/pkg/fileutils"
|
2014-08-08 03:01:55 +00:00
|
|
|
"github.com/docker/docker/pkg/parsers/kernel"
|
|
|
|
"github.com/docker/docker/pkg/parsers/operatingsystem"
|
2015-11-14 22:03:02 +00:00
|
|
|
"github.com/docker/docker/pkg/platform"
|
2015-08-06 11:54:48 +00:00
|
|
|
"github.com/docker/docker/pkg/sysinfo"
|
2014-10-24 22:48:23 +00:00
|
|
|
"github.com/docker/docker/pkg/system"
|
2014-08-08 03:01:55 +00:00
|
|
|
"github.com/docker/docker/registry"
|
|
|
|
"github.com/docker/docker/utils"
|
2015-10-23 06:08:26 +00:00
|
|
|
"github.com/docker/docker/volume/drivers"
|
2016-01-05 00:05:26 +00:00
|
|
|
"github.com/docker/engine-api/types"
|
2016-02-16 18:05:05 +00:00
|
|
|
"github.com/docker/go-connections/sockets"
|
2014-08-08 03:01:55 +00:00
|
|
|
)
|
|
|
|
|
2015-07-30 21:01:53 +00:00
|
|
|
// SystemInfo returns information about the host server the daemon is running on.
|
2015-09-29 17:51:40 +00:00
|
|
|
func (daemon *Daemon) SystemInfo() (*types.Info, error) {
|
2014-08-08 03:01:55 +00:00
|
|
|
kernelVersion := "<unknown>"
|
2016-03-11 15:08:25 +00:00
|
|
|
if kv, err := kernel.GetKernelVersion(); err != nil {
|
|
|
|
logrus.Warnf("Could not get kernel version: %v", err)
|
|
|
|
} else {
|
2014-08-08 03:01:55 +00:00
|
|
|
kernelVersion = kv.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
operatingSystem := "<unknown>"
|
2016-03-11 15:08:25 +00:00
|
|
|
if s, err := operatingsystem.GetOperatingSystem(); err != nil {
|
|
|
|
logrus.Warnf("Could not get operating system name: %v", err)
|
|
|
|
} else {
|
2014-08-08 03:01:55 +00:00
|
|
|
operatingSystem = s
|
|
|
|
}
|
2015-04-27 15:38:01 +00: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-08 03:01:55 +00:00
|
|
|
}
|
|
|
|
|
2014-10-24 22:48:23 +00:00
|
|
|
meminfo, err := system.ReadMemInfo()
|
|
|
|
if err != nil {
|
2015-03-26 22:22:04 +00:00
|
|
|
logrus.Errorf("Could not read system memory info: %v", err)
|
2016-07-12 19:30:21 +00:00
|
|
|
meminfo = &system.MemInfo{}
|
2014-10-24 22:48:23 +00:00
|
|
|
}
|
|
|
|
|
2015-10-09 06:57:47 +00:00
|
|
|
sysInfo := sysinfo.New(true)
|
2015-08-06 11:54:48 +00:00
|
|
|
|
2016-01-15 23:55:46 +00:00
|
|
|
var cRunning, cPaused, cStopped int32
|
|
|
|
daemon.containers.ApplyAll(func(c *container.Container) {
|
2015-10-27 20:12:33 +00:00
|
|
|
switch c.StateString() {
|
|
|
|
case "paused":
|
2016-01-15 23:55:46 +00:00
|
|
|
atomic.AddInt32(&cPaused, 1)
|
2015-10-27 20:12:33 +00:00
|
|
|
case "running":
|
2016-01-15 23:55:46 +00:00
|
|
|
atomic.AddInt32(&cRunning, 1)
|
2015-10-27 20:12:33 +00:00
|
|
|
default:
|
2016-01-15 23:55:46 +00:00
|
|
|
atomic.AddInt32(&cStopped, 1)
|
2015-10-27 20:12:33 +00:00
|
|
|
}
|
2016-01-15 23:55:46 +00:00
|
|
|
})
|
2015-10-27 20:12:33 +00:00
|
|
|
|
2016-03-29 04:10:37 +00:00
|
|
|
var securityOptions []string
|
|
|
|
if sysInfo.AppArmor {
|
|
|
|
securityOptions = append(securityOptions, "apparmor")
|
|
|
|
}
|
2016-07-08 22:54:48 +00:00
|
|
|
if sysInfo.Seccomp && supportsSeccomp {
|
2016-03-29 04:10:37 +00:00
|
|
|
securityOptions = append(securityOptions, "seccomp")
|
|
|
|
}
|
|
|
|
if selinuxEnabled() {
|
|
|
|
securityOptions = append(securityOptions, "selinux")
|
|
|
|
}
|
|
|
|
|
2015-04-10 17:26:30 +00:00
|
|
|
v := &types.Info{
|
|
|
|
ID: daemon.ID,
|
2016-01-15 23:55:46 +00:00
|
|
|
Containers: int(cRunning + cPaused + cStopped),
|
|
|
|
ContainersRunning: int(cRunning),
|
|
|
|
ContainersPaused: int(cPaused),
|
|
|
|
ContainersStopped: int(cStopped),
|
2015-11-18 22:20:54 +00:00
|
|
|
Images: len(daemon.imageStore.Map()),
|
2015-12-16 20:32:16 +00:00
|
|
|
Driver: daemon.GraphDriverName(),
|
|
|
|
DriverStatus: daemon.layerStore.DriverStatus(),
|
2015-10-23 06:08:26 +00:00
|
|
|
Plugins: daemon.showPluginsInfo(),
|
2015-08-06 11:54:48 +00:00
|
|
|
IPv4Forwarding: !sysInfo.IPv4ForwardingDisabled,
|
2016-02-26 18:47:43 +00:00
|
|
|
BridgeNfIptables: !sysInfo.BridgeNFCallIPTablesDisabled,
|
|
|
|
BridgeNfIP6tables: !sysInfo.BridgeNFCallIP6TablesDisabled,
|
2015-12-10 23:35:10 +00:00
|
|
|
Debug: utils.IsDebugEnabled(),
|
2015-04-10 17:26:30 +00:00
|
|
|
NFd: fileutils.GetTotalUsedFds(),
|
|
|
|
NGoroutines: runtime.NumGoroutine(),
|
|
|
|
SystemTime: time.Now().Format(time.RFC3339Nano),
|
|
|
|
LoggingDriver: daemon.defaultLogConfig.Type,
|
2016-02-18 10:10:31 +00:00
|
|
|
CgroupDriver: daemon.getCgroupDriver(),
|
2015-04-10 17:26:30 +00:00
|
|
|
NEventsListener: daemon.EventsService.SubscribersCount(),
|
|
|
|
KernelVersion: kernelVersion,
|
|
|
|
OperatingSystem: operatingSystem,
|
2015-07-21 19:40:36 +00:00
|
|
|
IndexServerAddress: registry.IndexServer,
|
2015-11-14 22:03:02 +00:00
|
|
|
OSType: platform.OSType,
|
|
|
|
Architecture: platform.Architecture,
|
2016-03-08 21:03:37 +00:00
|
|
|
RegistryConfig: daemon.RegistryService.ServiceConfig(),
|
2015-04-10 17:26:30 +00:00
|
|
|
NCPU: runtime.NumCPU(),
|
|
|
|
MemTotal: meminfo.MemTotal,
|
2015-12-03 10:46:53 +00:00
|
|
|
DockerRootDir: daemon.configStore.Root,
|
|
|
|
Labels: daemon.configStore.Labels,
|
2015-05-19 22:09:58 +00:00
|
|
|
ExperimentalBuild: utils.ExperimentalBuild(),
|
2015-11-09 18:32:46 +00:00
|
|
|
ServerVersion: dockerversion.Version,
|
2015-12-03 10:46:53 +00:00
|
|
|
ClusterStore: daemon.configStore.ClusterStore,
|
|
|
|
ClusterAdvertise: daemon.configStore.ClusterAdvertise,
|
2016-02-16 18:05:05 +00:00
|
|
|
HTTPProxy: sockets.GetProxyEnv("http_proxy"),
|
|
|
|
HTTPSProxy: sockets.GetProxyEnv("https_proxy"),
|
|
|
|
NoProxy: sockets.GetProxyEnv("no_proxy"),
|
2016-03-29 04:10:37 +00:00
|
|
|
SecurityOptions: securityOptions,
|
2015-04-10 17:26:30 +00:00
|
|
|
}
|
|
|
|
|
2015-07-09 23:37:54 +00: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 11:54:48 +00:00
|
|
|
v.MemoryLimit = sysInfo.MemoryLimit
|
|
|
|
v.SwapLimit = sysInfo.SwapLimit
|
2016-03-02 13:35:17 +00:00
|
|
|
v.KernelMemory = sysInfo.KernelMemory
|
2015-08-06 11:54:48 +00:00
|
|
|
v.OomKillDisable = sysInfo.OomKillDisable
|
2015-07-23 09:40:54 +00:00
|
|
|
v.CPUCfsPeriod = sysInfo.CPUCfsPeriod
|
|
|
|
v.CPUCfsQuota = sysInfo.CPUCfsQuota
|
2015-10-09 07:02:04 +00:00
|
|
|
v.CPUShares = sysInfo.CPUShares
|
|
|
|
v.CPUSet = sysInfo.Cpuset
|
2016-05-23 21:49:50 +00:00
|
|
|
v.Runtimes = daemon.configStore.GetAllRuntimes()
|
|
|
|
v.DefaultRuntime = daemon.configStore.GetDefaultRuntimeName()
|
2015-07-09 23:37:54 +00:00
|
|
|
}
|
|
|
|
|
2016-05-03 07:26:32 +00:00
|
|
|
hostname := ""
|
|
|
|
if hn, err := os.Hostname(); err != nil {
|
|
|
|
logrus.Warnf("Could not get hostname: %v", err)
|
|
|
|
} else {
|
|
|
|
hostname = hn
|
2014-11-17 19:23:41 +00:00
|
|
|
}
|
2016-05-03 07:26:32 +00:00
|
|
|
v.Name = hostname
|
2015-04-10 17:26:30 +00:00
|
|
|
|
|
|
|
return v, nil
|
2014-08-08 03:01:55 +00:00
|
|
|
}
|
2015-10-23 06:08:26 +00:00
|
|
|
|
2015-12-03 18:11:19 +00:00
|
|
|
// SystemVersion returns version information about the daemon.
|
|
|
|
func (daemon *Daemon) SystemVersion() types.Version {
|
|
|
|
v := types.Version{
|
|
|
|
Version: dockerversion.Version,
|
|
|
|
GitCommit: dockerversion.GitCommit,
|
|
|
|
GoVersion: runtime.Version(),
|
|
|
|
Os: runtime.GOOS,
|
|
|
|
Arch: runtime.GOARCH,
|
|
|
|
BuildTime: dockerversion.BuildTime,
|
|
|
|
Experimental: utils.ExperimentalBuild(),
|
|
|
|
}
|
|
|
|
|
2016-03-17 16:31:50 +00:00
|
|
|
kernelVersion := "<unknown>"
|
|
|
|
if kv, err := kernel.GetKernelVersion(); err != nil {
|
|
|
|
logrus.Warnf("Could not get kernel version: %v", err)
|
|
|
|
} else {
|
|
|
|
kernelVersion = kv.String()
|
2015-12-03 18:11:19 +00:00
|
|
|
}
|
2016-03-17 16:31:50 +00:00
|
|
|
v.KernelVersion = kernelVersion
|
2015-12-03 18:11:19 +00:00
|
|
|
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
|
2015-10-23 06:08:26 +00: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)
|
|
|
|
}
|
|
|
|
|
2016-01-13 00:38:18 +00:00
|
|
|
pluginsInfo.Authorization = daemon.configStore.AuthorizationPlugins
|
2015-12-29 21:10:23 +00:00
|
|
|
|
2015-10-23 06:08:26 +00:00
|
|
|
return pluginsInfo
|
|
|
|
}
|