2014-08-08 07:01:55 +04:00
package daemon
import (
"os"
"runtime"
2015-03-10 21:25:47 +03:00
"time"
2014-08-08 07:01:55 +04:00
2015-03-27 01:22:04 +03:00
"github.com/Sirupsen/logrus"
2015-04-10 20:26:30 +03:00
"github.com/docker/docker/api/types"
2015-02-05 00:22:38 +03:00
"github.com/docker/docker/autogen/dockerversion"
2015-03-30 00:17:23 +03:00
"github.com/docker/docker/pkg/fileutils"
2014-08-08 07:01:55 +04:00
"github.com/docker/docker/pkg/parsers/kernel"
"github.com/docker/docker/pkg/parsers/operatingsystem"
2014-10-25 02:48:23 +04:00
"github.com/docker/docker/pkg/system"
2014-08-08 07:01:55 +04:00
"github.com/docker/docker/registry"
"github.com/docker/docker/utils"
)
2015-04-10 20:26:30 +03:00
func ( daemon * Daemon ) SystemInfo ( ) ( * types . Info , error ) {
2014-08-08 07:01:55 +04:00
images , _ := daemon . Graph ( ) . Map ( )
var imgcount int
if images == nil {
imgcount = 0
} else {
imgcount = len ( images )
}
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 18:38:01 +03: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 07:01:55 +04:00
}
2014-10-25 02:48:23 +04:00
meminfo , err := system . ReadMemInfo ( )
if err != nil {
2015-03-27 01:22:04 +03:00
logrus . Errorf ( "Could not read system memory info: %v" , err )
2014-10-25 02:48:23 +04:00
}
2014-08-08 07:01:55 +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)
initPath := utils . DockerInitPath ( "" )
if initPath == "" {
// if that fails, we'll just return the path from the daemon
initPath = daemon . SystemInitPath ( )
}
2015-04-10 20:26:30 +03:00
v := & types . Info {
ID : daemon . ID ,
Containers : len ( daemon . List ( ) ) ,
Images : imgcount ,
Driver : daemon . GraphDriver ( ) . String ( ) ,
DriverStatus : daemon . GraphDriver ( ) . Status ( ) ,
IPv4Forwarding : ! daemon . SystemConfig ( ) . IPv4ForwardingDisabled ,
2015-06-17 04:19:11 +03:00
BridgeNfIptables : ! daemon . SystemConfig ( ) . BridgeNfCallIptablesDisabled ,
BridgeNfIp6tables : ! daemon . SystemConfig ( ) . BridgeNfCallIp6tablesDisabled ,
2015-04-10 20:26:30 +03:00
Debug : os . Getenv ( "DEBUG" ) != "" ,
NFd : fileutils . GetTotalUsedFds ( ) ,
NGoroutines : runtime . NumGoroutine ( ) ,
SystemTime : time . Now ( ) . Format ( time . RFC3339Nano ) ,
ExecutionDriver : daemon . ExecutionDriver ( ) . Name ( ) ,
LoggingDriver : daemon . defaultLogConfig . Type ,
NEventsListener : daemon . EventsService . SubscribersCount ( ) ,
KernelVersion : kernelVersion ,
OperatingSystem : operatingSystem ,
IndexServerAddress : registry . IndexServerAddress ( ) ,
RegistryConfig : daemon . RegistryService . Config ,
InitSha1 : dockerversion . INITSHA1 ,
InitPath : initPath ,
NCPU : runtime . NumCPU ( ) ,
MemTotal : meminfo . MemTotal ,
DockerRootDir : daemon . Config ( ) . Root ,
Labels : daemon . Config ( ) . Labels ,
2015-05-20 01:09:58 +03:00
ExperimentalBuild : utils . ExperimentalBuild ( ) ,
2015-04-10 20:26:30 +03:00
}
2015-07-10 02:37:54 +03: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" {
v . MemoryLimit = daemon . SystemConfig ( ) . MemoryLimit
v . SwapLimit = daemon . SystemConfig ( ) . SwapLimit
v . OomKillDisable = daemon . SystemConfig ( ) . OomKillDisable
v . CpuCfsPeriod = daemon . SystemConfig ( ) . CpuCfsPeriod
v . CpuCfsQuota = daemon . SystemConfig ( ) . CpuCfsQuota
}
2015-03-26 04:40:23 +03:00
if httpProxy := os . Getenv ( "http_proxy" ) ; httpProxy != "" {
2015-04-10 20:26:30 +03:00
v . HttpProxy = httpProxy
2015-03-03 06:15:17 +03:00
}
2015-03-26 04:40:23 +03:00
if httpsProxy := os . Getenv ( "https_proxy" ) ; httpsProxy != "" {
2015-04-10 20:26:30 +03:00
v . HttpsProxy = httpsProxy
2015-03-03 06:15:17 +03:00
}
2015-03-26 04:40:23 +03:00
if noProxy := os . Getenv ( "no_proxy" ) ; noProxy != "" {
2015-04-10 20:26:30 +03:00
v . NoProxy = noProxy
2015-03-03 06:15:17 +03:00
}
2014-11-17 22:23:41 +03:00
if hostname , err := os . Hostname ( ) ; err == nil {
2015-04-10 20:26:30 +03:00
v . Name = hostname
2014-11-17 22:23:41 +03:00
}
2015-04-10 20:26:30 +03:00
return v , nil
2014-08-08 07:01:55 +04:00
}