147 lines
3.5 KiB
Go
147 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"html/template"
|
|
"os"
|
|
rt "runtime"
|
|
"strings"
|
|
|
|
"github.com/containers/buildah/pkg/formats"
|
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
|
"github.com/containers/libpod/libpod/define"
|
|
"github.com/containers/libpod/pkg/adapter"
|
|
"github.com/containers/libpod/version"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
infoCommand cliconfig.InfoValues
|
|
|
|
infoDescription = `Display information pertaining to the host, current storage stats, and build of podman.
|
|
|
|
Useful for the user and when reporting issues.
|
|
`
|
|
_infoCommand = &cobra.Command{
|
|
Use: "info",
|
|
Args: noSubArgs,
|
|
Long: infoDescription,
|
|
Short: "Display podman system information",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
infoCommand.InputArgs = args
|
|
infoCommand.GlobalFlags = MainGlobalOpts
|
|
infoCommand.Remote = remoteclient
|
|
return infoCmd(&infoCommand)
|
|
},
|
|
Example: `podman info`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
infoCommand.Command = _infoCommand
|
|
infoCommand.SetHelpTemplate(HelpTemplate())
|
|
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 {
|
|
runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get runtime")
|
|
}
|
|
defer runtime.DeferredShutdown(false)
|
|
|
|
i, err := runtime.Info()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error getting info")
|
|
}
|
|
|
|
info := infoWithExtra{Info: i}
|
|
if runtime.Remote {
|
|
endpoint, err := runtime.RemoteEndpoint()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
info.Remote = getRemote(endpoint)
|
|
}
|
|
|
|
if !runtime.Remote && c.Debug {
|
|
d, err := getDebug()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
info.Debug = d
|
|
}
|
|
|
|
var out formats.Writer
|
|
infoOutputFormat := c.Format
|
|
if strings.Join(strings.Fields(infoOutputFormat), "") == "{{json.}}" {
|
|
infoOutputFormat = formats.JSONString
|
|
}
|
|
switch infoOutputFormat {
|
|
case formats.JSONString:
|
|
out = formats.JSONStruct{Output: info}
|
|
case "":
|
|
out = formats.YAMLStruct{Output: info}
|
|
default:
|
|
tmpl, err := template.New("info").Parse(c.Format)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = tmpl.Execute(os.Stdout, info)
|
|
return err
|
|
}
|
|
|
|
return out.Out()
|
|
}
|
|
|
|
// top-level "debug" info
|
|
func getDebug() (*debugInfo, error) {
|
|
v, err := define.GetVersion()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &debugInfo{
|
|
Compiler: rt.Compiler,
|
|
GoVersion: rt.Version(),
|
|
PodmanVersion: v.Version,
|
|
GitCommit: v.GitCommit,
|
|
}, nil
|
|
}
|
|
|
|
func getRemote(endpoint *adapter.Endpoint) *remoteInfo {
|
|
return &remoteInfo{
|
|
Connection: endpoint.Connection,
|
|
ConnectionType: endpoint.Type.String(),
|
|
RemoteAPIVersion: string(version.RemoteAPIVersion),
|
|
PodmanVersion: version.Version,
|
|
OSArch: fmt.Sprintf("%s/%s", rt.GOOS, rt.GOARCH),
|
|
}
|
|
}
|
|
|
|
type infoWithExtra struct {
|
|
*define.Info
|
|
Remote *remoteInfo `json:"remote,omitempty"`
|
|
Debug *debugInfo `json:"debug,omitempty"`
|
|
}
|
|
|
|
type remoteInfo struct {
|
|
Connection string `json:"connection"`
|
|
ConnectionType string `json:"connectionType"`
|
|
RemoteAPIVersion string `json:"remoteAPIVersion"`
|
|
PodmanVersion string `json:"podmanVersion"`
|
|
OSArch string `json:"OSArch"`
|
|
}
|
|
|
|
type debugInfo struct {
|
|
Compiler string `json:"compiler"`
|
|
GoVersion string `json:"goVersion"`
|
|
PodmanVersion string `json:"podmanVersion"`
|
|
GitCommit string `json:"gitCommit"`
|
|
}
|