spiegel_podman/cmd/podman/system/info.go
Paul Holzinger 34de0feda5
cmd/podman: refactor Context handling
The PodmanOptionsKey is never used anywhere so it is pointless to add
this. Second having several functions to return the same context makes
no sense so fold them all into one. Lastly create the context once and
always return the same one instead of having to nil check each time.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
2025-02-12 14:01:10 +01:00

120 lines
3 KiB
Go

package system
import (
"fmt"
"os"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report"
"github.com/containers/podman/v5/cmd/podman/common"
"github.com/containers/podman/v5/cmd/podman/registry"
"github.com/containers/podman/v5/cmd/podman/validate"
"github.com/containers/podman/v5/libpod/define"
"github.com/spf13/cobra"
"sigs.k8s.io/yaml"
)
var (
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 [options]",
Args: validate.NoArgs,
Long: infoDescription,
Short: "Display podman system information",
RunE: info,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman info`,
}
systemInfoCommand = &cobra.Command{
Args: infoCommand.Args,
Use: infoCommand.Use,
Short: infoCommand.Short,
Long: infoCommand.Long,
RunE: infoCommand.RunE,
ValidArgsFunction: infoCommand.ValidArgsFunction,
Example: `podman system info`,
}
)
var (
inFormat string
debug bool
)
type infoReport struct {
define.Info
Client *define.Version `json:",omitempty" yaml:",omitempty"`
}
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: infoCommand,
})
infoFlags(infoCommand)
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: systemInfoCommand,
Parent: systemCmd,
})
infoFlags(systemInfoCommand)
}
func infoFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&debug, "debug", "D", false, "Display additional debug information")
_ = flags.MarkHidden("debug") // It's a NOP since Podman version 2.0
formatFlagName := "format"
flags.StringVarP(&inFormat, formatFlagName, "f", "", "Change the output format to JSON or a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteFormat(&define.Info{}))
}
func info(cmd *cobra.Command, args []string) error {
info, err := registry.ContainerEngine().Info(registry.Context())
if err != nil {
return err
}
remote := registry.IsRemote()
info.Host.ServiceIsRemote = remote
infoReport := infoReport{
Info: *info,
}
if remote {
clientVers, _ := define.GetVersion()
infoReport.Client = &clientVers
}
switch {
case report.IsJSON(inFormat):
b, err := json.MarshalIndent(infoReport, "", " ")
if err != nil {
return err
}
fmt.Println(string(b))
case cmd.Flags().Changed("format"):
rpt := report.New(os.Stdout, cmd.Name())
defer rpt.Flush()
// Use OriginUnknown so it does not add an extra range since it
// will only be called for a single element and not a slice.
rpt, err = rpt.Parse(report.OriginUnknown, inFormat)
if err != nil {
return err
}
return rpt.Execute(infoReport)
default:
b, err := yaml.Marshal(infoReport)
if err != nil {
return err
}
fmt.Println(string(b))
}
return nil
}