optionDryRun := flag.Bool("n", false,
"dry-run, show diff but don't perform any changes")
+ optionQuiet := flag.Bool("q", false,
+ "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")
return err
}
cfg.DryRun = *optionDryRun
+ cfg.Quiet = *optionQuiet
cfg.LogLevel = level
toSync, err := hostsToSync(names, allHosts, allGroups)
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
+ }
+
+ const detectedErr = `
+
+Groups depending on "detected" groups cannot be used to select hosts as these
+are only available after the hosts were contacted.
+`
+
nameMap := make(map[string]bool)
for _, x := range names {
+ if detectedMap[x] {
+ return nil, fmt.Errorf(
+ "group %q depends on \"detected\" groups%s",
+ x, detectedErr)
+ }
nameMap[x] = true
}
nameMatched := make(map[string]bool)
nameMatched[host.Name] = true
}
- // TODO: don't permit groups which contain "detected" groups
- // because these are not available yet
groups, err := config.ResolveHostGroups(host.Name,
allGroups, nil)
if err != nil {
}()
// Connect to remote host
- err := conn.DialSSH(s.host.Name)
+ err := conn.DialSSH(s.host.SshUser, s.host.Name)
if err != nil {
return err
}