"hide successful, non-trigger commands with no output from host changes listing")
optionLog := flag.String("log", "info", "set log `level`; "+
"levels: error, info, verbose, debug, debug2, debug3")
+ optionSshConfig := flag.String("sshconfig", "",
+ "`path` to ssh configuration file; used for tests")
flag.CommandLine.Parse(args[2:])
cfg.DryRun = *optionDryRun
cfg.Quiet = *optionQuiet
cfg.LogLevel = level
+ cfg.SshConfig = *optionSshConfig
toSync, err := hostsToSync(names, allHosts, allGroups)
if err != nil {
return fmt.Errorf("no hosts found")
}
- isTTY := term.IsTerminal(int(os.Stdout.Fd()))
+ isTTY := term.IsTerminal(int(os.Stdout.Fd())) &&
+ term.IsTerminal(int(os.Stderr.Fd()))
done := make(chan bool)
// Collect events from all hosts and print them
func hostsToSync(names []string, allHosts *config.Hosts,
allGroups map[string][]string) ([]*config.Host, error) {
- detectedMap := make(map[string]bool)
- for _, x := range config.TransitivelyDetectedGroups(allGroups) {
- detectedMap[x] = true
- }
+ detectedMap := config.TransitivelyDetectedGroups(allGroups)
const detectedErr = `
nameMap[x] = true
}
nameMatched := make(map[string]bool)
- // To detect typos we must check all given names but only want to add
- // each match once
- hostMatched := make(map[string]bool)
+ // To detect typos we must check all given names but one host can be
+ // matched by multiple names (e.g. two groups with overlapping hosts)
+ hostAdded := make(map[string]bool)
var res []*config.Host
for _, host := range allHosts.List {
if nameMap[host.Name] {
res = append(res, host)
- hostMatched[host.Name] = true
+ hostAdded[host.Name] = true
nameMatched[host.Name] = true
}
}
for _, x := range groups {
if nameMap[x] {
- if !hostMatched[host.Name] {
+ if !hostAdded[host.Name] {
res = append(res, host)
- hostMatched[host.Name] = true
+ hostAdded[host.Name] = true
}
nameMatched[x] = true
}
}()
// Connect to remote host
- err := conn.DialSSH(s.host.SshUser, s.host.Name)
+ err := conn.DialSSH(s.host.SshUser, s.host.Name, s.config.SshConfig)
if err != nil {
return err
}