X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fsync.go;h=70aaf47e4c8f5c364247fa4fe0c05e239bb5d79b;hb=a8023b74bdd3d85cb0f3a55485887d133d2c0946;hp=238ed62ae5e50f5f3516847817363a3bf894f8b7;hpb=97641dde0b55b588bfd27817a6a9deac3b337513;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/sync.go b/cmd/safcm/sync.go index 238ed62..70aaf47 100644 --- a/cmd/safcm/sync.go +++ b/cmd/safcm/sync.go @@ -76,6 +76,8 @@ func MainSync(args []string) error { "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:]) @@ -110,6 +112,7 @@ func MainSync(args []string) error { cfg.DryRun = *optionDryRun cfg.Quiet = *optionQuiet cfg.LogLevel = level + cfg.SshConfig = *optionSshConfig toSync, err := hostsToSync(names, allHosts, allGroups) if err != nil { @@ -119,7 +122,8 @@ func MainSync(args []string) error { 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 @@ -223,10 +227,7 @@ func MainSync(args []string) error { 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 = ` @@ -244,15 +245,15 @@ are only available after the hosts were contacted. 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 } @@ -263,9 +264,9 @@ are only available after the hosts were contacted. } 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 } @@ -364,7 +365,7 @@ func (s *Sync) Host(wg *sync.WaitGroup) error { }() // 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 }