]> ruderich.org/simon Gitweb - safcm/safcm.git/blobdiff - cmd/safcm/sync.go
safcm: forbid syncing groups which depend on "detected" groups
[safcm/safcm.git] / cmd / safcm / sync.go
index 09ffe854e1e7491727882f963a894ff9c801994e..7fa2c936b637c7059e5429b273f310233ee92ed4 100644 (file)
@@ -71,6 +71,8 @@ func MainSync(args []string) error {
 
        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")
 
@@ -105,6 +107,7 @@ func MainSync(args []string) error {
                return err
        }
        cfg.DryRun = *optionDryRun
+       cfg.Quiet = *optionQuiet
        cfg.LogLevel = level
 
        toSync, err := hostsToSync(names, allHosts, allGroups)
@@ -183,8 +186,24 @@ 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
+       }
+
+       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)
@@ -200,8 +219,6 @@ func hostsToSync(names []string, allHosts *config.Hosts,
                        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 {
@@ -310,7 +327,7 @@ func (s *Sync) Host(wg *sync.WaitGroup) error {
        }()
 
        // Connect to remote host
-       err := conn.DialSSH(s.host.Name)
+       err := conn.DialSSH(s.host.SshUser, s.host.Name)
        if err != nil {
                return err
        }