automation-tests/cmd/podman/registry/remote.go

58 lines
1.7 KiB
Go

package registry
import (
"os"
"path/filepath"
"strings"
"sync"
"github.com/containers/podman/v5/pkg/domain/entities"
"github.com/spf13/pflag"
)
// Value for --remote given on command line
var remoteFromCLI = struct {
Value bool
sync sync.Once
}{}
const PodmanSh = "podmansh"
// IsRemote returns true if podman was built to run remote or --remote flag given on CLI
// Use in init() functions as an initialization check
func IsRemote() bool {
// remote conflicts with podmansh in how the `-c` option gets parsed
// This is noticeable if a user with shell set to podmansh were to execute
// a command using ssh like so:
// ssh user@host id
if strings.HasSuffix(filepath.Base(os.Args[0]), PodmanSh) {
return false
}
remoteFromCLI.sync.Do(func() {
remote := false
if _, ok := os.LookupEnv("CONTAINER_HOST"); ok {
remote = true
} else if _, ok := os.LookupEnv("CONTAINER_CONNECTION"); ok {
remote = true
}
fs := pflag.NewFlagSet("remote", pflag.ContinueOnError)
fs.ParseErrorsWhitelist.UnknownFlags = true
fs.Usage = func() {}
fs.SetInterspersed(false)
fs.BoolVarP(&remoteFromCLI.Value, "remote", "r", remote, "")
connectionFlagName := "connection"
fs.StringP(connectionFlagName, "c", "", "")
contextFlagName := "context"
fs.String(contextFlagName, "", "")
hostFlagName := "host"
fs.StringP(hostFlagName, "H", "", "")
urlFlagName := "url"
fs.String(urlFlagName, "", "")
_ = fs.Parse(os.Args[parseIndex():])
// --connection or --url implies --remote
remoteFromCLI.Value = remoteFromCLI.Value || fs.Changed(connectionFlagName) || fs.Changed(urlFlagName) || fs.Changed(hostFlagName) || fs.Changed(contextFlagName)
})
return podmanOptions.EngineMode == entities.TunnelMode || remoteFromCLI.Value
}