aboutsummaryrefslogtreecommitdiff
path: root/cmd/podman/system
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/system')
-rw-r--r--cmd/podman/system/connection/add.go87
-rw-r--r--cmd/podman/system/dial_stdio.go2
-rw-r--r--cmd/podman/system/events.go44
-rw-r--r--cmd/podman/system/info.go14
-rw-r--r--cmd/podman/system/reset.go3
-rw-r--r--cmd/podman/system/service_abi.go4
-rw-r--r--cmd/podman/system/version.go19
7 files changed, 74 insertions, 99 deletions
diff --git a/cmd/podman/system/connection/add.go b/cmd/podman/system/connection/add.go
index 191603718..f3b61b254 100644
--- a/cmd/podman/system/connection/add.go
+++ b/cmd/podman/system/connection/add.go
@@ -1,23 +1,19 @@
package connection
import (
- "encoding/json"
"errors"
"fmt"
- "net"
"net/url"
"os"
"regexp"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/config"
+ "github.com/containers/common/pkg/ssh"
"github.com/containers/podman/v4/cmd/podman/registry"
"github.com/containers/podman/v4/cmd/podman/system"
- "github.com/containers/podman/v4/libpod/define"
- "github.com/containers/podman/v4/pkg/domain/utils"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
- "golang.org/x/crypto/ssh"
)
var (
@@ -74,6 +70,15 @@ func init() {
func add(cmd *cobra.Command, args []string) error {
// Default to ssh schema if none given
+
+ entities := &ssh.ConnectionCreateOptions{
+ Port: cOpts.Port,
+ Path: args[1],
+ Identity: cOpts.Identity,
+ Name: args[0],
+ Socket: cOpts.UDSPath,
+ Default: cOpts.Default,
+ }
dest := args[1]
if match, err := regexp.Match("^[A-Za-z][A-Za-z0-9+.-]*://", []byte(dest)); err != nil {
return fmt.Errorf("invalid destination: %w", err)
@@ -89,30 +94,20 @@ func add(cmd *cobra.Command, args []string) error {
uri.Path = cmd.Flag("socket-path").Value.String()
}
- switch uri.Scheme {
- case "ssh":
- if uri.User.Username() == "" {
- if uri.User, err = utils.GetUserInfo(uri); err != nil {
- return err
- }
- }
+ var sshMode ssh.EngineMode
+ containerConfig := registry.PodmanConfig()
- if cmd.Flags().Changed("port") {
- uri.Host = net.JoinHostPort(uri.Hostname(), cmd.Flag("port").Value.String())
- }
+ flag := containerConfig.SSHMode
- if uri.Port() == "" {
- uri.Host = net.JoinHostPort(uri.Hostname(), cmd.Flag("port").DefValue)
- }
- iden := ""
- if cmd.Flags().Changed("identity") {
- iden = cOpts.Identity
- }
- if uri.Path == "" || uri.Path == "/" {
- if uri.Path, err = getUDS(uri, iden); err != nil {
- return err
- }
- }
+ sshMode = ssh.DefineMode(flag)
+
+ if sshMode == ssh.InvalidMode {
+ return fmt.Errorf("invalid ssh mode")
+ }
+
+ switch uri.Scheme {
+ case "ssh":
+ return ssh.Create(entities, sshMode)
case "unix":
if cmd.Flags().Changed("identity") {
return errors.New("--identity option not supported for unix scheme")
@@ -176,41 +171,3 @@ func add(cmd *cobra.Command, args []string) error {
}
return cfg.Write()
}
-
-func getUDS(uri *url.URL, iden string) (string, error) {
- cfg, err := utils.ValidateAndConfigure(uri, iden)
- if err != nil {
- return "", fmt.Errorf("failed to validate: %w", err)
- }
- dial, err := ssh.Dial("tcp", uri.Host, cfg)
- if err != nil {
- return "", fmt.Errorf("failed to connect: %w", err)
- }
- defer dial.Close()
-
- session, err := dial.NewSession()
- if err != nil {
- return "", fmt.Errorf("failed to create new ssh session on %q: %w", uri.Host, err)
- }
- defer session.Close()
-
- // Override podman binary for testing etc
- podman := "podman"
- if v, found := os.LookupEnv("PODMAN_BINARY"); found {
- podman = v
- }
- infoJSON, err := utils.ExecRemoteCommand(dial, podman+" info --format=json")
- if err != nil {
- return "", err
- }
-
- var info define.Info
- if err := json.Unmarshal(infoJSON, &info); err != nil {
- return "", fmt.Errorf("failed to parse 'podman info' results: %w", err)
- }
-
- if info.Host.RemoteSocket == nil || len(info.Host.RemoteSocket.Path) == 0 {
- return "", fmt.Errorf("remote podman %q failed to report its UDS socket", uri.Host)
- }
- return info.Host.RemoteSocket.Path, nil
-}
diff --git a/cmd/podman/system/dial_stdio.go b/cmd/podman/system/dial_stdio.go
index 42ce65746..db079856c 100644
--- a/cmd/podman/system/dial_stdio.go
+++ b/cmd/podman/system/dial_stdio.go
@@ -97,7 +97,7 @@ func copier(to halfWriteCloser, from halfReadCloser, debugDescription string) er
}
}()
if _, err := io.Copy(to, from); err != nil {
- return fmt.Errorf("error while Copy (%s): %w", debugDescription, err)
+ return fmt.Errorf("while Copy (%s): %w", debugDescription, err)
}
return nil
}
diff --git a/cmd/podman/system/events.go b/cmd/podman/system/events.go
index b04668f86..290f5b0fa 100644
--- a/cmd/podman/system/events.go
+++ b/cmd/podman/system/events.go
@@ -85,7 +85,9 @@ func eventsCmd(cmd *cobra.Command, _ []string) error {
doJSON = report.IsJSON(eventFormat)
if !doJSON {
var err error
- rpt, err = report.New(os.Stdout, cmd.Name()).Parse(report.OriginUser, eventFormat)
+ // Use OriginUnknown so it does not add an extra range since it
+ // will only be called for each single element and not a slice.
+ rpt, err = report.New(os.Stdout, cmd.Name()).Parse(report.OriginUnknown, eventFormat)
if err != nil {
return err
}
@@ -97,25 +99,33 @@ func eventsCmd(cmd *cobra.Command, _ []string) error {
errChannel <- err
}()
- for event := range eventChannel {
- switch {
- case event == nil:
- // no-op
- case doJSON:
- jsonStr, err := event.ToJSONString()
- if err != nil {
- return err
+ for {
+ select {
+ case event, ok := <-eventChannel:
+ if !ok {
+ // channel was closed we can exit
+ return nil
+ }
+ switch {
+ case doJSON:
+ jsonStr, err := event.ToJSONString()
+ if err != nil {
+ return err
+ }
+ fmt.Println(jsonStr)
+ case cmd.Flags().Changed("format"):
+ if err := rpt.Execute(event); err != nil {
+ return err
+ }
+ default:
+ fmt.Println(event.ToHumanReadable(!noTrunc))
}
- fmt.Println(jsonStr)
- case cmd.Flags().Changed("format"):
- if err := rpt.Execute(event); err != nil {
+ case err := <-errChannel:
+ // only exit in case of an error,
+ // otherwise keep reading events until the event channel is closed
+ if err != nil {
return err
}
- os.Stdout.WriteString("\n")
- default:
- fmt.Println(event.ToHumanReadable(!noTrunc))
}
}
-
- return <-errChannel
}
diff --git a/cmd/podman/system/info.go b/cmd/podman/system/info.go
index f8fd946cd..9613d5e56 100644
--- a/cmd/podman/system/info.go
+++ b/cmd/podman/system/info.go
@@ -3,7 +3,6 @@ package system
import (
"fmt"
"os"
- "text/template"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report"
@@ -63,6 +62,7 @@ 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")
@@ -85,14 +85,16 @@ func info(cmd *cobra.Command, args []string) error {
}
fmt.Println(string(b))
case cmd.Flags().Changed("format"):
- // Cannot use report.New() as it enforces {{range .}} for OriginUser templates
- tmpl := template.New(cmd.Name()).Funcs(template.FuncMap(report.DefaultFuncs))
- inFormat = report.NormalizeFormat(inFormat)
- tmpl, err := tmpl.Parse(inFormat)
+ 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 tmpl.Execute(os.Stdout, info)
+ return rpt.Execute(info)
default:
b, err := yaml.Marshal(info)
if err != nil {
diff --git a/cmd/podman/system/reset.go b/cmd/podman/system/reset.go
index 20f15a34f..02c4a7b46 100644
--- a/cmd/podman/system/reset.go
+++ b/cmd/podman/system/reset.go
@@ -62,7 +62,8 @@ func reset(cmd *cobra.Command, args []string) {
- all images
- all networks
- all build cache
- - all machines`)
+ - all machines
+ - all volumes`)
if len(listCtn) > 0 {
fmt.Println(`WARNING! The following external containers will be purged:`)
diff --git a/cmd/podman/system/service_abi.go b/cmd/podman/system/service_abi.go
index 8d0240a8d..68ac8902b 100644
--- a/cmd/podman/system/service_abi.go
+++ b/cmd/podman/system/service_abi.go
@@ -105,7 +105,9 @@ func restService(flags *pflag.FlagSet, cfg *entities.PodmanConfig, opts entities
}
if err := utils.MaybeMoveToSubCgroup(); err != nil {
- return err
+ // it is a best effort operation, so just print the
+ // error for debugging purposes.
+ logrus.Debugf("Could not move to subcgroup: %v", err)
}
servicereaper.Start()
diff --git a/cmd/podman/system/version.go b/cmd/podman/system/version.go
index 7202b2c08..33ab0f757 100644
--- a/cmd/podman/system/version.go
+++ b/cmd/podman/system/version.go
@@ -4,7 +4,6 @@ import (
"fmt"
"os"
"strings"
- "text/template"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report"
@@ -12,6 +11,7 @@ import (
"github.com/containers/podman/v4/cmd/podman/registry"
"github.com/containers/podman/v4/cmd/podman/validate"
"github.com/containers/podman/v4/pkg/domain/entities"
+ "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -53,22 +53,25 @@ func version(cmd *cobra.Command, args []string) error {
}
if cmd.Flag("format").Changed {
- // Cannot use report.New() as it enforces {{range .}} for OriginUser templates
- tmpl := template.New(cmd.Name()).Funcs(template.FuncMap(report.DefaultFuncs))
+ rpt := report.New(os.Stdout, cmd.Name())
+ defer rpt.Flush()
- versionFormat = report.NormalizeFormat(versionFormat)
- tmpl, err := tmpl.Parse(versionFormat)
+ // 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, versionFormat)
if err != nil {
return err
}
- if err := tmpl.Execute(os.Stdout, versions); err != nil {
+ if err := rpt.Execute(versions); err != nil {
+ // only log at debug since we fall back to the client only template
+ logrus.Debugf("Failed to execute template: %v", err)
// On Failure, assume user is using older version of podman version --format and check client
versionFormat = strings.ReplaceAll(versionFormat, ".Server.", ".")
- tmpl, err := tmpl.Parse(versionFormat)
+ rpt, err := rpt.Parse(report.OriginUnknown, versionFormat)
if err != nil {
return err
}
- if err := tmpl.Execute(os.Stdout, versions.Client); err != nil {
+ if err := rpt.Execute(versions.Client); err != nil {
return err
}
}