Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle environment variables from podman-machine #4161

Merged
merged 4 commits into from
Oct 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmd/podman/cliconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ type MainFlags struct {
ConnectionName string
RemoteConfigFilePath string
Port int
IdentityFile string
IgnoreHosts bool
}

type AttachValues struct {
Expand Down
30 changes: 25 additions & 5 deletions cmd/podman/main_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,44 @@
package main

import (
"github.com/pkg/errors"
"os"
"os/user"
"strconv"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

const remote = true

func init() {
var username string
if curruser, err := user.Current(); err == nil {
username = curruser.Username
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")
Expand Down
10 changes: 6 additions & 4 deletions cmd/podman/remoteclientconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ type RemoteConfig struct {

// RemoteConnection describes the attributes of a podman-remote endpoint
type RemoteConnection struct {
Destination string `toml:"destination"`
Username string `toml:"username"`
IsDefault bool `toml:"default"`
Port int `toml:"port"`
Destination string `toml:"destination"`
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
Expand Down
6 changes: 3 additions & 3 deletions cmd/podman/remoteclientconfig/configfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions docs/podman-remote.conf.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion pkg/adapter/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
11 changes: 9 additions & 2 deletions pkg/adapter/client_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Out of curiosity: Why enabling the quite mode only here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I didn’t have it anywhere, but got tired if the “WARNING adding host key” output on every single command

}
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`,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@afbjorklund Is there a reason for pulling the fixed paths?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pulling? I removed the hard-coded paths, that missed /usr/local/bin

port, options, remoteConn.Username, remoteConn.Destination, logLevel)
}
15 changes: 13 additions & 2 deletions pkg/adapter/client_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}