blob: 99f3e906fb110701d98dcc9b764cf8a5d356bf53 [file] [log] [blame]
package main
import (
"flag"
"fmt"
"golang.org/x/crypto/ssh"
"k8s.io/klog/v2"
"source.monogon.dev/cloud/shepherd/manager"
)
type sshConfig struct {
User string
Pass string
SSHKey manager.SSHKey
}
func (sc *sshConfig) check() error {
if sc.User == "" {
return fmt.Errorf("-ssh_user must be set")
}
if sc.Pass == "" && sc.SSHKey.KeyPersistPath == "" {
//TODO: The flag name -ssh_key_path could change, which would make this
// error very confusing.
return fmt.Errorf("-ssh_pass or -ssh_key_path must be set")
}
return nil
}
func (sc *sshConfig) RegisterFlags() {
flag.StringVar(&sc.User, "ssh_user", "", "SSH username to log into the machines")
flag.StringVar(&sc.Pass, "ssh_pass", "", "SSH password to log into the machines")
sc.SSHKey.RegisterFlags()
}
func (sc *sshConfig) NewClient() (*manager.PlainSSHClient, error) {
if err := sc.check(); err != nil {
return nil, err
}
c := manager.PlainSSHClient{
Username: sc.User,
}
switch {
case sc.Pass != "":
c.AuthMethod = ssh.Password(sc.Pass)
case sc.SSHKey.KeyPersistPath != "":
signer, err := sc.SSHKey.Signer()
if err != nil {
return nil, err
}
pubKey, err := sc.SSHKey.PublicKey()
if err != nil {
return nil, err
}
klog.Infof("Using ssh key auth with public key: %s", pubKey)
c.AuthMethod = ssh.PublicKeys(signer)
}
return &c, nil
}