diff --git a/.changes/unreleased/Changed-20250321-090849.yaml b/.changes/unreleased/Changed-20250321-090849.yaml new file mode 100644 index 0000000..2d66733 --- /dev/null +++ b/.changes/unreleased/Changed-20250321-090849.yaml @@ -0,0 +1,3 @@ +kind: Changed +body: 'Commands: `host` can now be `localhost` or `127.0.0.1` to run commands locally' +time: 2025-03-21T09:08:49.871021144-05:00 diff --git a/pkg/backy/backy.go b/pkg/backy/backy.go index fc9d93b..14b9618 100644 --- a/pkg/backy/backy.go +++ b/pkg/backy/backy.go @@ -61,7 +61,8 @@ func (command *Command) RunCmd(cmdCtxLogger zerolog.Logger, opts *ConfigOpts) ([ } } - if command.Host != nil { + if !IsHostLocal(command.Host) { + outputArr, errSSH = command.RunCmdSSH(cmdCtxLogger, opts) if errSSH != nil { return outputArr, errSSH @@ -492,11 +493,10 @@ func (cmd *Command) GenerateLogger(opts *ConfigOpts) zerolog.Logger { Str("Backy-cmd", cmd.Name).Str("Host", "local machine"). Logger() - if cmd.Host != nil { + if !IsHostLocal(cmd.Host) { cmdLogger = opts.Logger.With(). - Str("Backy-cmd", cmd.Name).Str("Host", *cmd.Host). + Str("Backy-cmd", cmd.Name).Str("Host", cmd.Host). Logger() - } return cmdLogger } @@ -508,7 +508,7 @@ func (opts *ConfigOpts) ExecCmdsSSH(cmdList []string, hostsList []string) { for _, c := range cmdList { cmd := opts.Cmds[c] cmd.RemoteHost = host - cmd.Host = &host.Host + cmd.Host = host.Host opts.Logger.Info().Str("host", h).Str("cmd", c).Send() _, err := cmd.RunCmdSSH(cmd.GenerateLogger(opts), opts) if err != nil { @@ -541,6 +541,7 @@ func (c *Command) GetVariablesFromConf(opts *ConfigOpts) { c.ScriptEnvFile = replaceVarInString(opts.Vars, c.ScriptEnvFile, opts.Logger) c.Name = replaceVarInString(opts.Vars, c.Name, opts.Logger) c.OutputFile = replaceVarInString(opts.Vars, c.OutputFile, opts.Logger) + c.Host = replaceVarInString(opts.Vars, c.Host, opts.Logger) } // func executeUserCommands() []string { diff --git a/pkg/backy/config.go b/pkg/backy/config.go index 4a4af03..bdefa64 100644 --- a/pkg/backy/config.go +++ b/pkg/backy/config.go @@ -527,13 +527,13 @@ func processCmds(opts *ConfigOpts) error { } } - // resolve hosts - if cmd.Host != nil { - cmdHost := replaceVarInString(opts.Vars, *cmd.Host, opts.Logger) - if cmdHost != *cmd.Host { - cmd.Host = &cmdHost + if !IsHostLocal(cmd.Host) { + + cmdHost := replaceVarInString(opts.Vars, cmd.Host, opts.Logger) + if cmdHost != cmd.Host { + cmd.Host = cmdHost } - host, hostFound := opts.Hosts[*cmd.Host] + host, hostFound := opts.Hosts[cmd.Host] if hostFound { cmd.RemoteHost = host cmd.RemoteHost.Host = host.Host @@ -541,12 +541,12 @@ func processCmds(opts *ConfigOpts) error { cmd.RemoteHost.HostName = host.HostName } } else { - opts.Logger.Info().Msgf("adding host %s to host list", *cmd.Host) + opts.Logger.Info().Msgf("adding host %s to host list", cmd.Host) if opts.Hosts == nil { opts.Hosts = make(map[string]*Host) } - opts.Hosts[*cmd.Host] = &Host{Host: *cmd.Host} - cmd.RemoteHost = &Host{Host: *cmd.Host} + opts.Hosts[cmd.Host] = &Host{Host: cmd.Host} + cmd.RemoteHost = &Host{Host: cmd.Host} } } else { @@ -607,8 +607,10 @@ func processCmds(opts *ConfigOpts) error { opts.Logger.Debug().Msg("changing password for user: " + cmd.Username) cmd.UserPassword = getExternalConfigDirectiveValue(cmd.UserPassword, opts) } - if cmd.Host != nil { - host, ok := opts.Hosts[*cmd.Host] + + if !IsHostLocal(cmd.Host) { + + host, ok := opts.Hosts[cmd.Host] if ok { cmd.userMan, err = usermanager.NewUserManager(host.OS) } @@ -677,7 +679,9 @@ func processHooks(cmd *Command, hooks []string, opts *ConfigOpts, hookType strin } func detectOSType(cmd *Command, opts *ConfigOpts) error { - if cmd.Host == nil { + + if IsHostLocal(cmd.Host) { + if runtime.GOOS == "linux" { cmd.OS = "linux" opts.Logger.Info().Msg("Unix/Linux type OS detected") @@ -686,7 +690,7 @@ func detectOSType(cmd *Command, opts *ConfigOpts) error { return fmt.Errorf("using an os that is not yet supported for user commands") } - host, ok := opts.Hosts[*cmd.Host] + host, ok := opts.Hosts[cmd.Host] if ok { if host.OS != "" { return nil diff --git a/pkg/backy/list.go b/pkg/backy/list.go index 06226db..f224f93 100644 --- a/pkg/backy/list.go +++ b/pkg/backy/list.go @@ -46,9 +46,9 @@ func (opts *ConfigOpts) ListCommand(cmd string) { } // is it remote or local - if cmdInfo.Host != nil { + if !IsHostLocal(cmdInfo.Host) { println() - print("Host: ", *cmdInfo.Host) + print("Host: ", cmdInfo.Host) println() } else { diff --git a/pkg/backy/ssh.go b/pkg/backy/ssh.go index 29fcb3c..86e10b8 100644 --- a/pkg/backy/ssh.go +++ b/pkg/backy/ssh.go @@ -441,8 +441,8 @@ func (command *Command) RunCmdSSH(cmdCtxLogger zerolog.Logger, opts *ConfigOpts) cmdCtxLogger.Info(). Str("Command", command.Name). - Str("Host", *command.Host). - Msgf("Running %s on host %s", getCommandTypeAndSetCommandInfoLabel(command.Type), *command.Host) + Str("Host", command.Host). + Msgf("Running %s on host %s", getCommandTypeAndSetCommandInfoLabel(command.Type), command.Host) // cmdCtxLogger.Debug().Str("cmd", command.Cmd).Strs("args", command.Args).Send() @@ -811,3 +811,8 @@ func CheckIfHostHasHostName(host string) (bool, string) { println(HostName) return HostName != "", HostName } + +func IsHostLocal(host string) bool { + host = strings.ToLower(host) + return host == "127.0.0.1" || host == "localhost" || host == "" +} diff --git a/pkg/backy/types.go b/pkg/backy/types.go index 2ed4491..1cf4245 100644 --- a/pkg/backy/types.go +++ b/pkg/backy/types.go @@ -56,7 +56,7 @@ type ( // See CommandType enum further down the page for acceptable values Type CommandType `yaml:"type,omitempty"` - Host *string `yaml:"host,omitempty"` + Host string `yaml:"host,omitempty"` Hooks *Hooks `yaml:"hooks,omitempty"`