mirror of
https://github.com/containers/podman.git
synced 2025-06-19 16:33:24 +08:00
Merge pull request #4161 from afbjorklund/machine-env
Handle environment variables from podman-machine
This commit is contained in:
@ -42,6 +42,8 @@ type MainFlags struct {
|
||||
ConnectionName string
|
||||
RemoteConfigFilePath string
|
||||
Port int
|
||||
IdentityFile string
|
||||
IgnoreHosts bool
|
||||
}
|
||||
|
||||
type AttachValues struct {
|
||||
|
@ -3,9 +3,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
"os"
|
||||
"os/user"
|
||||
"strconv"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -13,14 +15,32 @@ const remote = true
|
||||
|
||||
func init() {
|
||||
var username string
|
||||
if username = os.Getenv("PODMAN_USER"); username == "" {
|
||||
if curruser, err := user.Current(); err == nil {
|
||||
username = curruser.Username
|
||||
}
|
||||
}
|
||||
host := os.Getenv("PODMAN_HOST")
|
||||
port := 22
|
||||
if portstr := os.Getenv("PODMAN_PORT"); portstr != "" {
|
||||
if p, err := strconv.Atoi(portstr); err == nil {
|
||||
port = p
|
||||
}
|
||||
}
|
||||
key := os.Getenv("PODMAN_IDENTITY_FILE")
|
||||
ignore := false
|
||||
if ignorestr := os.Getenv("PODMAN_IGNORE_HOSTS"); ignorestr != "" {
|
||||
if b, err := strconv.ParseBool(ignorestr); err == nil {
|
||||
ignore = b
|
||||
}
|
||||
}
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.ConnectionName, "connection", "", "remote connection name")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteConfigFilePath, "remote-config-path", "", "alternate path for configuration file")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteUserName, "username", username, "username on the remote host")
|
||||
rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", 22, "port on remote host")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteHost, "remote-host", "", "remote host")
|
||||
rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", port, "port on remote host")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteHost, "remote-host", host, "remote host")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.IdentityFile, "identity-file", key, "identity-file")
|
||||
rootCmd.PersistentFlags().BoolVar(&MainGlobalOpts.IgnoreHosts, "ignore-hosts", ignore, "ignore hosts")
|
||||
// TODO maybe we allow the altering of this for bridge connections?
|
||||
// rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.VarlinkAddress, "varlink-address", adapter.DefaultAddress, "address of the varlink socket")
|
||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.LogLevel, "log-level", "error", "Log messages above specified level: debug, info, warn, error, fatal or panic. Logged to ~/.config/containers/podman.log")
|
||||
|
@ -13,6 +13,8 @@ type RemoteConnection struct {
|
||||
Username string `toml:"username"`
|
||||
IsDefault bool `toml:"default"`
|
||||
Port int `toml:"port"`
|
||||
IdentityFile string `toml:"identity_file"`
|
||||
IgnoreHosts bool `toml:"ignore_hosts"`
|
||||
}
|
||||
|
||||
// GetConfigFilePath is a simple helper to export the configuration file's
|
||||
|
@ -143,7 +143,7 @@ func TestRemoteConfig_GetDefault(t *testing.T) {
|
||||
wantErr bool
|
||||
}{
|
||||
// A good toml should return the connection that is marked isDefault
|
||||
{"good", fields{Connections: makeGoodResult().Connections}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, false},
|
||||
{"good", fields{Connections: makeGoodResult().Connections}, &RemoteConnection{"192.168.1.1", "myuser", true, 22, "", false}, false},
|
||||
// If nothing is marked as isDefault and there is more than one connection, error should occur
|
||||
{"nodefault", fields{Connections: noDefault}, nil, true},
|
||||
// if nothing is marked as isDefault but there is only one connection, the one connection is considered the default
|
||||
@ -183,9 +183,9 @@ func TestRemoteConfig_GetRemoteConnection(t *testing.T) {
|
||||
wantErr bool
|
||||
}{
|
||||
// Good connection
|
||||
{"goodhomer", fields{Connections: makeGoodResult().Connections}, args{name: "homer"}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, false},
|
||||
{"goodhomer", fields{Connections: makeGoodResult().Connections}, args{name: "homer"}, &RemoteConnection{"192.168.1.1", "myuser", true, 22, "", false}, false},
|
||||
// Good connection
|
||||
{"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false, 22}, false},
|
||||
{"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false, 22, "", false}, false},
|
||||
// Getting an unknown connection should result in error
|
||||
{"noexist", fields{Connections: makeGoodResult().Connections}, args{name: "foobar"}, nil, true},
|
||||
// Getting a connection when there are none should result in an error
|
||||
|
@ -25,6 +25,12 @@ of the user's remote connections.
|
||||
**port** = int
|
||||
Use an alternative port for the ssh connections. The default port is 22.
|
||||
|
||||
**identity_file** = ""
|
||||
Use an alternative location for the ssh private key
|
||||
|
||||
**ignore_hosts** = bool
|
||||
Don't match the remote ssh host key with known hosts
|
||||
|
||||
|
||||
## EXAMPLE
|
||||
|
||||
|
@ -35,7 +35,7 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
|
||||
if len(r.cmd.RemoteUserName) < 1 {
|
||||
return nil, errors.New("you must provide a username when providing a remote host name")
|
||||
}
|
||||
rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port}
|
||||
rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port, r.cmd.IdentityFile, r.cmd.IgnoreHosts}
|
||||
remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel)
|
||||
// if the user has a config file with connections in it
|
||||
} else if len(remoteConfigConnections.Connections) > 0 {
|
||||
|
@ -14,7 +14,14 @@ func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLev
|
||||
if port == 0 {
|
||||
port = 22
|
||||
}
|
||||
options := ""
|
||||
if remoteConn.IdentityFile != "" {
|
||||
options += " -i " + remoteConn.IdentityFile
|
||||
}
|
||||
if remoteConn.IgnoreHosts {
|
||||
options += " -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||
}
|
||||
return fmt.Sprintf(
|
||||
`ssh -p %d -T %s@%s -- /usr/bin/varlink -A \'/usr/bin/podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`,
|
||||
port, remoteConn.Username, remoteConn.Destination, logLevel)
|
||||
`ssh -p %d -T%s %s@%s -- varlink -A \'podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`,
|
||||
port, options, remoteConn.Username, remoteConn.Destination, logLevel)
|
||||
}
|
||||
|
@ -9,7 +9,18 @@ import (
|
||||
)
|
||||
|
||||
func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLevel string) string {
|
||||
port := remoteConn.Port
|
||||
if port == 0 {
|
||||
port = 22
|
||||
}
|
||||
options := ""
|
||||
if remoteConn.IdentityFile != "" {
|
||||
options += " -i " + remoteConn.IdentityFile
|
||||
}
|
||||
if remoteConn.IgnoreHosts {
|
||||
options += " -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||
}
|
||||
return fmt.Sprintf(
|
||||
`ssh -T %s@%s -- /usr/bin/varlink -A '/usr/bin/podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`,
|
||||
remoteConn.Username, remoteConn.Destination, logLevel)
|
||||
`ssh -p %d -T%s %s@%s -- varlink -A 'podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`,
|
||||
port, options, remoteConn.Username, remoteConn.Destination, logLevel)
|
||||
}
|
||||
|
Reference in New Issue
Block a user