make remote commands run and not fail if an SSH session failed to be created

This commit is contained in:
2023-07-20 21:20:16 -05:00
parent e353ed0225
commit 7224661c71
4 changed files with 38 additions and 6 deletions

View File

@ -64,9 +64,20 @@ func (command *Command) RunCmd(log zerolog.Logger, backyConf *ConfigFile, opts *
}
}
commandSession, err := command.RemoteHost.SshClient.NewSession()
// Retry connecting to host; if that fails, error. If it does not fail, try to create new session
if err != nil {
return nil, err
connErr := command.RemoteHost.ConnectToSSHHost(opts, backyConf)
if connErr != nil {
return nil, fmt.Errorf("error creating session: %v, and error creating new connection to host: %v", err, connErr)
}
commandSession, err = command.RemoteHost.SshClient.NewSession()
if err != nil {
return nil, fmt.Errorf("error creating session: %v", err)
}
}
defer commandSession.Close()
injectEnvIntoSSH(envVars, commandSession, opts, log)
@ -390,15 +401,12 @@ func (config *ConfigFile) RunListConfig(cron string, opts *ConfigOpts) {
listChan := make(chan *CmdList, configListsLen)
results := make(chan string)
// This starts up 3 workers, initially blocked
// This starts up list workers, initially blocked
// because there are no jobs yet.
for w := 1; w <= configListsLen; w++ {
go cmdListWorker(mTemps, listChan, config, results, opts)
}
// Here we send 5 `jobs` and then `close` that
// channel to indicate that's all the work we have.
// configChan <- config.Cmds
for listName, cmdConfig := range config.CmdConfigLists {
if cmdConfig.Name == "" {
cmdConfig.Name = listName
@ -438,6 +446,7 @@ func (config *ConfigFile) ExecuteCmds(opts *ConfigOpts) {
func (c *ConfigFile) closeHostConnections() {
for _, host := range c.Hosts {
c.Logger.Info().Str("server", host.HostName)
if host.isProxyHost {
continue
}
@ -445,6 +454,7 @@ func (c *ConfigFile) closeHostConnections() {
if _, err := host.SshClient.NewSession(); err == nil {
c.Logger.Info().Msgf("Closing host connection %s", host.HostName)
host.SshClient.Close()
host.SshClient = nil
}
}
for _, proxyHost := range host.ProxyHost {
@ -455,6 +465,7 @@ func (c *ConfigFile) closeHostConnections() {
if _, err := host.SshClient.NewSession(); err == nil {
c.Logger.Info().Msgf("Closing connection to proxy host %s", host.HostName)
host.SshClient.Close()
host.SshClient = nil
}
}
}
@ -464,6 +475,7 @@ func (c *ConfigFile) closeHostConnections() {
if _, err := host.SshClient.NewSession(); err == nil {
c.Logger.Info().Msgf("Closing proxy host connection %s", host.HostName)
host.SshClient.Close()
host.SshClient = nil
}
}
}

View File

@ -117,6 +117,7 @@ func (remoteConfig *Host) ConnectToSSHHost(opts *ConfigOpts, config *ConfigFile)
if connectErr != nil {
return connectErr
}
config.Hosts[remoteConfig.Host] = remoteConfig
return nil
}
@ -134,6 +135,7 @@ func (remoteHost *Host) GetSshUserFromConfig() {
}
remoteHost.ClientConfig.User = remoteHost.User
}
func (remoteHost *Host) GetAuthMethods(opts *ConfigOpts) error {
var signer ssh.Signer
var err error
@ -265,6 +267,7 @@ func (remoteHost *Host) ConnectThroughBastion(log zerolog.Logger) (*ssh.Client,
}
func GetKnownHosts(khPath string) (string, error) {
if TS(khPath) != "" {
return resolveDir(khPath)
}
@ -272,6 +275,7 @@ func GetKnownHosts(khPath string) (string, error) {
}
func GetPrivateKeyPassword(key string, opts *ConfigOpts, log zerolog.Logger) (string, error) {
var prKeyPassword string
if strings.HasPrefix(key, "file:") {
privKeyPassFilePath := strings.TrimPrefix(key, "file:")
@ -298,6 +302,7 @@ func GetPrivateKeyPassword(key string, opts *ConfigOpts, log zerolog.Logger) (st
}
func GetPassword(pass string, opts *ConfigOpts, log zerolog.Logger) (string, error) {
pass = strings.TrimSpace(pass)
if pass == "" {
return "", nil
@ -329,6 +334,7 @@ func GetPassword(pass string, opts *ConfigOpts, log zerolog.Logger) (string, err
}
func (remoteConfig *Host) GetProxyJumpFromConfig(hosts map[string]*Host) error {
proxyJump, _ := remoteConfig.SSHConfigFile.SshConfigFile.Get(remoteConfig.Host, "ProxyJump")
if proxyJump == "" {
proxyJump = remoteConfig.SSHConfigFile.DefaultUserSettings.Get(remoteConfig.Host, "ProxyJump")
@ -354,6 +360,7 @@ func (remoteConfig *Host) GetProxyJumpFromConfig(hosts map[string]*Host) error {
}
func (remoteConfig *Host) GetProxyJumpConfig(hosts map[string]*Host, opts *ConfigOpts) error {
if TS(remoteConfig.ConfigFilePath) == "" {
remoteConfig.useDefaultConfig = true
}