mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 19:13:34 +00:00
chore: make ssh+cli connections reuse one SSH connection via control socket. Fix image push
This commit is contained in:
@@ -30,7 +30,7 @@ type MachineConnection struct {
|
||||
MachineID string `yaml:"machine_id,omitempty"`
|
||||
}
|
||||
|
||||
func (c MachineConnection) String() string {
|
||||
func (c *MachineConnection) String() string {
|
||||
if c.SSH != "" {
|
||||
return "ssh://" + string(c.SSH)
|
||||
} else if c.SSHCLI != "" {
|
||||
@@ -69,36 +69,37 @@ func (c *MachineConnection) Validate() error {
|
||||
}
|
||||
|
||||
// SSHDestination represents an SSH destination string in the canonical form of "user@host:port".
|
||||
// The default user "root" and port 22 can be omitted.
|
||||
// Empty user or port components are omitted.
|
||||
type SSHDestination string
|
||||
|
||||
// NewSSHDestination constructs an SSHDestination from user, host, and port components.
|
||||
// If user is empty, it is omitted.
|
||||
// If port is 0, it is omitted.
|
||||
func NewSSHDestination(user, host string, port int) SSHDestination {
|
||||
dst := host
|
||||
if port != 0 && port != DefaultSSHPort {
|
||||
if port != 0 {
|
||||
dst = net.JoinHostPort(host, strconv.Itoa(port))
|
||||
}
|
||||
if user == "" {
|
||||
user = DefaultSSHUser
|
||||
if user != "" {
|
||||
dst = fmt.Sprintf("%s@%s", user, dst)
|
||||
}
|
||||
dst = user + "@" + dst
|
||||
|
||||
return SSHDestination(dst)
|
||||
}
|
||||
|
||||
// Parse parses the SSH destination string into user, host, and port components.
|
||||
// If user is not specified, it returns an empty string.
|
||||
// If port is not specified, it returns 0.
|
||||
func (d SSHDestination) Parse() (user string, host string, port int, err error) {
|
||||
host = string(d)
|
||||
if strings.Contains(host, "@") {
|
||||
user, host, _ = strings.Cut(host, "@")
|
||||
}
|
||||
if user == "" {
|
||||
user = DefaultSSHUser
|
||||
}
|
||||
h, p, sErr := net.SplitHostPort(host)
|
||||
if sErr == nil {
|
||||
host = h
|
||||
port, err = strconv.Atoi(p)
|
||||
}
|
||||
if port == 0 {
|
||||
port = DefaultSSHPort
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
osuser "os/user"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
@@ -13,7 +14,17 @@ import (
|
||||
)
|
||||
|
||||
func Connect(user, host string, port int, sshKeyPath string) (*ssh.Client, error) {
|
||||
// Use the current OS user if no user is specified to be make it consistent with ssh CLI behavior.
|
||||
if user == "" {
|
||||
if u, err := osuser.Current(); err == nil {
|
||||
user = u.Username
|
||||
}
|
||||
}
|
||||
if port == 0 {
|
||||
port = 22
|
||||
}
|
||||
addr := net.JoinHostPort(host, strconv.Itoa(port))
|
||||
|
||||
// Try to connect using SSH agent only.
|
||||
agentAuth, agentClose, agentErr := sshAgentAuth()
|
||||
if agentErr == nil {
|
||||
|
||||
Reference in New Issue
Block a user