diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/kpod/info.go | 148 |
1 files changed, 16 insertions, 132 deletions
diff --git a/cmd/kpod/info.go b/cmd/kpod/info.go index 0b8ae75b4..c491b4585 100644 --- a/cmd/kpod/info.go +++ b/cmd/kpod/info.go @@ -1,15 +1,11 @@ package main import ( - "bytes" - "fmt" - "io/ioutil" - "os" "runtime" - "github.com/docker/docker/pkg/system" "github.com/pkg/errors" "github.com/projectatomic/libpod/cmd/kpod/formats" + "github.com/projectatomic/libpod/libpod" "github.com/urfave/cli" ) @@ -41,22 +37,24 @@ func infoCmd(c *cli.Context) error { } info := map[string]interface{}{} - infoGivers := []infoGiverFunc{ - storeInfo, - hostInfo, + runtime, err := getRuntime(c) + if err != nil { + return errors.Wrapf(err, "could not get runtime") + } + defer runtime.Shutdown(false) + + infoArr, err := runtime.Info() + if err != nil { + return errors.Wrapf(err, "error getting info") } if c.Bool("debug") { - infoGivers = append(infoGivers, debugInfo) + debugInfo := debugInfo(c) + infoArr = append(infoArr, libpod.InfoData{Type: "debug", Data: debugInfo}) } - for _, giver := range infoGivers { - thisName, thisInfo, err := giver(c) - if err != nil { - info[thisName] = infoErr(err) - continue - } - info[thisName] = thisInfo + for _, currInfo := range infoArr { + info[currInfo.Type] = currInfo.Data } var out formats.Writer @@ -75,126 +73,12 @@ func infoCmd(c *cli.Context) error { return nil } -func infoErr(err error) map[string]interface{} { - return map[string]interface{}{ - "error": err.Error(), - } -} - -type infoGiverFunc func(c *cli.Context) (name string, info map[string]interface{}, err error) - // top-level "debug" info -func debugInfo(c *cli.Context) (string, map[string]interface{}, error) { +func debugInfo(c *cli.Context) map[string]interface{} { info := map[string]interface{}{} info["compiler"] = runtime.Compiler info["go version"] = runtime.Version() info["kpod version"] = c.App.Version info["git commit"] = gitCommit - return "debug", info, nil -} - -// top-level "host" info -func hostInfo(c *cli.Context) (string, map[string]interface{}, error) { - // lets say OS, arch, number of cpus, amount of memory, maybe os distribution/version, hostname, kernel version, uptime - info := map[string]interface{}{} - info["os"] = runtime.GOOS - info["arch"] = runtime.GOARCH - info["cpus"] = runtime.NumCPU() - mi, err := system.ReadMemInfo() - if err != nil { - info["meminfo"] = infoErr(err) - } else { - // TODO this might be a place for github.com/dustin/go-humanize - info["MemTotal"] = mi.MemTotal - info["MemFree"] = mi.MemFree - info["SwapTotal"] = mi.SwapTotal - info["SwapFree"] = mi.SwapFree - } - if kv, err := readKernelVersion(); err != nil { - info["kernel"] = infoErr(err) - } else { - info["kernel"] = kv - } - - if up, err := readUptime(); err != nil { - info["uptime"] = infoErr(err) - } else { - info["uptime"] = up - } - if host, err := os.Hostname(); err != nil { - info["hostname"] = infoErr(err) - } else { - info["hostname"] = host - } - return "host", info, nil -} - -// top-level "store" info -func storeInfo(c *cli.Context) (string, map[string]interface{}, error) { - storeStr := "store" - config, err := getConfig(c) - if err != nil { - return storeStr, nil, errors.Wrapf(err, "Could not get config") - } - store, err := getStore(config) - if err != nil { - return storeStr, nil, err - } - - // lets say storage driver in use, number of images, number of containers - info := map[string]interface{}{} - info["GraphRoot"] = store.GraphRoot() - info["RunRoot"] = store.RunRoot() - info["GraphDriverName"] = store.GraphDriverName() - info["GraphOptions"] = store.GraphOptions() - statusPairs, err := store.Status() - if err != nil { - return storeStr, nil, err - } - status := map[string]string{} - for _, pair := range statusPairs { - status[pair[0]] = pair[1] - } - info["GraphStatus"] = status - images, err := store.Images() - if err != nil { - info["ImageStore"] = infoErr(err) - } else { - info["ImageStore"] = map[string]interface{}{ - "number": len(images), - } - } - containers, err := store.Containers() - if err != nil { - info["ContainerStore"] = infoErr(err) - } else { - info["ContainerStore"] = map[string]interface{}{ - "number": len(containers), - } - } - return storeStr, info, nil -} - -func readKernelVersion() (string, error) { - buf, err := ioutil.ReadFile("/proc/version") - if err != nil { - return "", err - } - f := bytes.Fields(buf) - if len(f) < 2 { - return string(bytes.TrimSpace(buf)), nil - } - return string(f[2]), nil -} - -func readUptime() (string, error) { - buf, err := ioutil.ReadFile("/proc/uptime") - if err != nil { - return "", err - } - f := bytes.Fields(buf) - if len(f) < 1 { - return "", fmt.Errorf("invalid uptime") - } - return string(f[0]), nil + return info } |