2014-08-07 23:01:55 -04:00
package daemon
import (
"os"
"runtime"
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-02-04 16:22:38 -05:00
"github.com/docker/docker/autogen/dockerversion"
2014-08-07 23:01:55 -04:00
"github.com/docker/docker/engine"
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"
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-03-25 03:44:12 -04:00
func ( daemon * Daemon ) CmdInfo ( job * engine . Job ) error {
2014-08-07 23: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
}
if inContainer , err := operatingsystem . IsContainerized ( ) ; err != nil {
2015-03-26 18:22:04 -04:00
logrus . Errorf ( "Could not determine if daemon is containerized: %v" , err )
2014-08-07 23:01:55 -04:00
operatingSystem += " (error determining if containerized)"
} else if inContainer {
operatingSystem += " (containerized)"
}
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
}
2014-08-07 23: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 ( )
}
v := & engine . Env { }
2014-12-11 07:56:21 -05:00
v . SetJson ( "ID" , daemon . ID )
2014-08-07 23:01:55 -04:00
v . SetInt ( "Containers" , len ( daemon . List ( ) ) )
v . SetInt ( "Images" , imgcount )
v . Set ( "Driver" , daemon . GraphDriver ( ) . String ( ) )
v . SetJson ( "DriverStatus" , daemon . GraphDriver ( ) . Status ( ) )
v . SetBool ( "MemoryLimit" , daemon . SystemConfig ( ) . MemoryLimit )
v . SetBool ( "SwapLimit" , daemon . SystemConfig ( ) . SwapLimit )
v . SetBool ( "IPv4Forwarding" , ! daemon . SystemConfig ( ) . IPv4ForwardingDisabled )
v . SetBool ( "Debug" , os . Getenv ( "DEBUG" ) != "" )
2015-03-29 17:17:23 -04:00
v . SetInt ( "NFd" , fileutils . GetTotalUsedFds ( ) )
2014-08-07 23:01:55 -04:00
v . SetInt ( "NGoroutines" , runtime . NumGoroutine ( ) )
2015-03-10 14:25:47 -04:00
v . Set ( "SystemTime" , time . Now ( ) . Format ( time . RFC3339Nano ) )
2014-08-07 23:01:55 -04:00
v . Set ( "ExecutionDriver" , daemon . ExecutionDriver ( ) . Name ( ) )
2015-03-31 21:58:07 -04:00
v . Set ( "LoggingDriver" , daemon . defaultLogConfig . Type )
2015-04-03 18:17:49 -04:00
v . SetInt ( "NEventsListener" , daemon . EventsService . SubscribersCount ( ) )
2014-08-07 23:01:55 -04:00
v . Set ( "KernelVersion" , kernelVersion )
v . Set ( "OperatingSystem" , operatingSystem )
v . Set ( "IndexServerAddress" , registry . IndexServerAddress ( ) )
2015-03-31 19:21:37 -04:00
v . SetJson ( "RegistryConfig" , daemon . RegistryService . Config )
2014-08-07 23:01:55 -04:00
v . Set ( "InitSha1" , dockerversion . INITSHA1 )
v . Set ( "InitPath" , initPath )
2014-10-24 18:48:23 -04:00
v . SetInt ( "NCPU" , runtime . NumCPU ( ) )
v . SetInt64 ( "MemTotal" , meminfo . MemTotal )
2014-12-03 18:29:54 -05:00
v . Set ( "DockerRootDir" , daemon . Config ( ) . Root )
2015-03-25 21:40:23 -04:00
if httpProxy := os . Getenv ( "http_proxy" ) ; httpProxy != "" {
v . Set ( "HttpProxy" , httpProxy )
2015-03-02 22:15:17 -05:00
}
2015-03-25 21:40:23 -04:00
if httpsProxy := os . Getenv ( "https_proxy" ) ; httpsProxy != "" {
v . Set ( "HttpsProxy" , httpsProxy )
2015-03-02 22:15:17 -05:00
}
2015-03-25 21:40:23 -04:00
if noProxy := os . Getenv ( "no_proxy" ) ; noProxy != "" {
v . Set ( "NoProxy" , noProxy )
2015-03-02 22:15:17 -05:00
}
2014-11-17 14:23:41 -05:00
if hostname , err := os . Hostname ( ) ; err == nil {
2014-12-11 07:56:21 -05:00
v . SetJson ( "Name" , hostname )
2014-11-17 14:23:41 -05:00
}
2014-11-20 13:36:05 -05:00
v . SetList ( "Labels" , daemon . Config ( ) . Labels )
2014-08-07 23:01:55 -04:00
if _ , err := v . WriteTo ( job . Stdout ) ; err != nil {
2015-03-25 03:44:12 -04:00
return err
2014-08-07 23:01:55 -04:00
}
2015-03-25 03:44:12 -04:00
return nil
2014-08-07 23:01:55 -04:00
}