mirror of
https://github.com/containers/podman.git
synced 2025-06-20 00:51:16 +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
|
ConnectionName string
|
||||||
RemoteConfigFilePath string
|
RemoteConfigFilePath string
|
||||||
Port int
|
Port int
|
||||||
|
IdentityFile string
|
||||||
|
IgnoreHosts bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type AttachValues struct {
|
type AttachValues struct {
|
||||||
|
@ -3,9 +3,11 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/pkg/errors"
|
"os"
|
||||||
"os/user"
|
"os/user"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -13,14 +15,32 @@ const remote = true
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var username string
|
var username string
|
||||||
|
if username = os.Getenv("PODMAN_USER"); username == "" {
|
||||||
if curruser, err := user.Current(); err == nil {
|
if curruser, err := user.Current(); err == nil {
|
||||||
username = curruser.Username
|
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.ConnectionName, "connection", "", "remote connection name")
|
||||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteConfigFilePath, "remote-config-path", "", "alternate path for configuration file")
|
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().StringVar(&MainGlobalOpts.RemoteUserName, "username", username, "username on the remote host")
|
||||||
rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", 22, "port on remote host")
|
rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", port, "port on remote host")
|
||||||
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteHost, "remote-host", "", "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?
|
// 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.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")
|
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"`
|
Username string `toml:"username"`
|
||||||
IsDefault bool `toml:"default"`
|
IsDefault bool `toml:"default"`
|
||||||
Port int `toml:"port"`
|
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
|
// GetConfigFilePath is a simple helper to export the configuration file's
|
||||||
|
@ -143,7 +143,7 @@ func TestRemoteConfig_GetDefault(t *testing.T) {
|
|||||||
wantErr bool
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
// A good toml should return the connection that is marked isDefault
|
// 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
|
// If nothing is marked as isDefault and there is more than one connection, error should occur
|
||||||
{"nodefault", fields{Connections: noDefault}, nil, true},
|
{"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
|
// 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
|
wantErr bool
|
||||||
}{
|
}{
|
||||||
// Good connection
|
// 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
|
// 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
|
// Getting an unknown connection should result in error
|
||||||
{"noexist", fields{Connections: makeGoodResult().Connections}, args{name: "foobar"}, nil, true},
|
{"noexist", fields{Connections: makeGoodResult().Connections}, args{name: "foobar"}, nil, true},
|
||||||
// Getting a connection when there are none should result in an error
|
// Getting a connection when there are none should result in an error
|
||||||
|
@ -25,6 +25,12 @@ of the user's remote connections.
|
|||||||
**port** = int
|
**port** = int
|
||||||
Use an alternative port for the ssh connections. The default port is 22.
|
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
|
## EXAMPLE
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
|
|||||||
if len(r.cmd.RemoteUserName) < 1 {
|
if len(r.cmd.RemoteUserName) < 1 {
|
||||||
return nil, errors.New("you must provide a username when providing a remote host name")
|
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)
|
remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel)
|
||||||
// if the user has a config file with connections in it
|
// if the user has a config file with connections in it
|
||||||
} else if len(remoteConfigConnections.Connections) > 0 {
|
} else if len(remoteConfigConnections.Connections) > 0 {
|
||||||
|
@ -14,7 +14,14 @@ func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLev
|
|||||||
if port == 0 {
|
if port == 0 {
|
||||||
port = 22
|
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(
|
return fmt.Sprintf(
|
||||||
`ssh -p %d -T %s@%s -- /usr/bin/varlink -A \'/usr/bin/podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`,
|
`ssh -p %d -T%s %s@%s -- varlink -A \'podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`,
|
||||||
port, remoteConn.Username, remoteConn.Destination, logLevel)
|
port, options, remoteConn.Username, remoteConn.Destination, logLevel)
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLevel string) string {
|
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(
|
return fmt.Sprintf(
|
||||||
`ssh -T %s@%s -- /usr/bin/varlink -A '/usr/bin/podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`,
|
`ssh -p %d -T%s %s@%s -- varlink -A 'podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`,
|
||||||
remoteConn.Username, remoteConn.Destination, logLevel)
|
port, options, remoteConn.Username, remoteConn.Destination, logLevel)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user