From 0d9b952aeab95c59b28bcea42f719d06363b45b5 Mon Sep 17 00:00:00 2001 From: baude Date: Mon, 16 Sep 2019 10:48:34 -0500 Subject: support non-standard ssh port for remote-client when using the remote client, users may need to specify a non-standard port for ssh connections. we can do so on the command line and within the remote-client configuration file. Fixes: #3987 Signed-off-by: baude --- cmd/podman/cliconfig/config.go | 1 + cmd/podman/main.go | 5 +++++ cmd/podman/main_local.go | 5 +++++ cmd/podman/main_remote.go | 10 ++++++++++ cmd/podman/remoteclientconfig/config.go | 1 + cmd/podman/remoteclientconfig/configfile_test.go | 14 +++++++++++--- 6 files changed, 33 insertions(+), 3 deletions(-) (limited to 'cmd/podman') diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go index e0ce202cc..b8796f9b3 100644 --- a/cmd/podman/cliconfig/config.go +++ b/cmd/podman/cliconfig/config.go @@ -41,6 +41,7 @@ type MainFlags struct { VarlinkAddress string ConnectionName string RemoteConfigFilePath string + Port int } type AttachValues struct { diff --git a/cmd/podman/main.go b/cmd/podman/main.go index b83ccd9a5..992dbe1d5 100644 --- a/cmd/podman/main.go +++ b/cmd/podman/main.go @@ -111,6 +111,11 @@ func before(cmd *cobra.Command, args []string) error { return err } + // check that global opts input is valid + if err := checkInput(); err != nil { + return err + } + // Set log level; if not log-level is provided, default to error logLevel := MainGlobalOpts.LogLevel if logLevel == "" { diff --git a/cmd/podman/main_local.go b/cmd/podman/main_local.go index 08d7ccaf4..917096e17 100644 --- a/cmd/podman/main_local.go +++ b/cmd/podman/main_local.go @@ -267,3 +267,8 @@ func setUMask() { // Be sure we can create directories with 0755 mode. syscall.Umask(0022) } + +// checkInput can be used to verify any of the globalopt values +func checkInput() error { + return nil +} diff --git a/cmd/podman/main_remote.go b/cmd/podman/main_remote.go index a005e925c..f617422e6 100644 --- a/cmd/podman/main_remote.go +++ b/cmd/podman/main_remote.go @@ -3,6 +3,7 @@ package main import ( + "github.com/pkg/errors" "os/user" "github.com/spf13/cobra" @@ -18,6 +19,7 @@ func init() { 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") // 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") @@ -42,3 +44,11 @@ func setRLimits() error { } func setUMask() {} + +// checkInput can be used to verify any of the globalopt values +func checkInput() error { + if MainGlobalOpts.Port < 0 || MainGlobalOpts.Port > 65536 { + return errors.Errorf("remote port must be between 0 and 65536") + } + return nil +} diff --git a/cmd/podman/remoteclientconfig/config.go b/cmd/podman/remoteclientconfig/config.go index 01f293ec3..13880a868 100644 --- a/cmd/podman/remoteclientconfig/config.go +++ b/cmd/podman/remoteclientconfig/config.go @@ -12,6 +12,7 @@ type RemoteConnection struct { Destination string `toml:"destination"` Username string `toml:"username"` IsDefault bool `toml:"default"` + Port int `toml:"port"` } // GetConfigFilePath is a simple helper to export the configuration file's diff --git a/cmd/podman/remoteclientconfig/configfile_test.go b/cmd/podman/remoteclientconfig/configfile_test.go index 66e0a4693..ea2224ea7 100644 --- a/cmd/podman/remoteclientconfig/configfile_test.go +++ b/cmd/podman/remoteclientconfig/configfile_test.go @@ -13,11 +13,13 @@ var goodConfig = ` [connections.homer] destination = "192.168.1.1" username = "myuser" +port = 22 default = true [connections.bart] destination = "foobar.com" username = "root" +port = 22 ` var noDest = ` [connections] @@ -26,9 +28,11 @@ var noDest = ` destination = "192.168.1.1" username = "myuser" default = true +port = 22 [connections.bart] username = "root" +port = 22 ` var noUser = ` @@ -36,6 +40,7 @@ var noUser = ` [connections.homer] destination = "192.168.1.1" +port = 22 ` func makeGoodResult() *RemoteConfig { @@ -44,10 +49,12 @@ func makeGoodResult() *RemoteConfig { Destination: "192.168.1.1", Username: "myuser", IsDefault: true, + Port: 22, } goodConnections["bart"] = RemoteConnection{ Destination: "foobar.com", Username: "root", + Port: 22, } var goodResult = RemoteConfig{ Connections: goodConnections, @@ -59,6 +66,7 @@ func makeNoUserResult() *RemoteConfig { var goodConnections = make(map[string]RemoteConnection) goodConnections["homer"] = RemoteConnection{ Destination: "192.168.1.1", + Port: 22, } var goodResult = RemoteConfig{ Connections: goodConnections, @@ -135,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}, false}, + {"good", fields{Connections: makeGoodResult().Connections}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, 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 @@ -175,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}, false}, + {"goodhomer", fields{Connections: makeGoodResult().Connections}, args{name: "homer"}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, false}, // Good connection - {"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false}, false}, + {"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false, 22}, 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 -- cgit v1.2.3-54-g00ecf