99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	rt "runtime"
 | |
| 
 | |
| 	"github.com/containers/libpod/cmd/podman/cliconfig"
 | |
| 	"github.com/containers/libpod/cmd/podman/formats"
 | |
| 	"github.com/containers/libpod/libpod"
 | |
| 	"github.com/containers/libpod/libpod/adapter"
 | |
| 	"github.com/containers/libpod/version"
 | |
| 	"github.com/pkg/errors"
 | |
| 	"github.com/spf13/cobra"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	infoCommand cliconfig.InfoValues
 | |
| 
 | |
| 	infoDescription = "Display podman system information"
 | |
| 	_infoCommand    = &cobra.Command{
 | |
| 		Use:   "info",
 | |
| 		Long:  infoDescription,
 | |
| 		Short: `Display information pertaining to the host, current storage stats, and build of podman. Useful for the user and when reporting issues.`,
 | |
| 		RunE: func(cmd *cobra.Command, args []string) error {
 | |
| 			infoCommand.InputArgs = args
 | |
| 			infoCommand.GlobalFlags = MainGlobalOpts
 | |
| 			return infoCmd(&infoCommand)
 | |
| 		},
 | |
| 		Example: `podman info`,
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	infoCommand.Command = _infoCommand
 | |
| 	infoCommand.SetUsageTemplate(UsageTemplate())
 | |
| 	flags := infoCommand.Flags()
 | |
| 
 | |
| 	flags.BoolVarP(&infoCommand.Debug, "debug", "D", false, "Display additional debug information")
 | |
| 	flags.StringVarP(&infoCommand.Format, "format", "f", "", "Change the output format to JSON or a Go template")
 | |
| 
 | |
| }
 | |
| 
 | |
| func infoCmd(c *cliconfig.InfoValues) error {
 | |
| 	info := map[string]interface{}{}
 | |
| 	remoteClientInfo := map[string]interface{}{}
 | |
| 
 | |
| 	runtime, err := adapter.GetRuntime(&c.PodmanCommand)
 | |
| 	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 runtime.Remote {
 | |
| 		remoteClientInfo["RemoteAPI Version"] = version.RemoteAPIVersion
 | |
| 		remoteClientInfo["Podman Version"] = version.Version
 | |
| 		remoteClientInfo["OS Arch"] = fmt.Sprintf("%s/%s", rt.GOOS, rt.GOARCH)
 | |
| 		infoArr = append(infoArr, libpod.InfoData{Type: "client", Data: remoteClientInfo})
 | |
| 	}
 | |
| 
 | |
| 	if !runtime.Remote && c.Debug {
 | |
| 		debugInfo := debugInfo(c)
 | |
| 		infoArr = append(infoArr, libpod.InfoData{Type: "debug", Data: debugInfo})
 | |
| 	}
 | |
| 
 | |
| 	for _, currInfo := range infoArr {
 | |
| 		info[currInfo.Type] = currInfo.Data
 | |
| 	}
 | |
| 
 | |
| 	var out formats.Writer
 | |
| 	infoOutputFormat := c.Format
 | |
| 	switch infoOutputFormat {
 | |
| 	case formats.JSONString:
 | |
| 		out = formats.JSONStruct{Output: info}
 | |
| 	case "":
 | |
| 		out = formats.YAMLStruct{Output: info}
 | |
| 	default:
 | |
| 		out = formats.StdoutTemplate{Output: info, Template: infoOutputFormat}
 | |
| 	}
 | |
| 
 | |
| 	formats.Writer(out).Out()
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // top-level "debug" info
 | |
| func debugInfo(c *cliconfig.InfoValues) map[string]interface{} {
 | |
| 	info := map[string]interface{}{}
 | |
| 	info["compiler"] = rt.Compiler
 | |
| 	info["go version"] = rt.Version()
 | |
| 	info["podman version"] = version.Version
 | |
| 	version, _ := libpod.GetVersion()
 | |
| 	info["git commit"] = version.GitCommit
 | |
| 	return info
 | |
| }
 |