func getConfig(flagset *flag.FlagSet, userCfgFile string) (*config.Config, error) { opts := globalconf.Options{EnvPrefix: "FLEET_"} if userCfgFile != "" { // Fail hard if a user-provided config is not usable fi, err := os.Stat(userCfgFile) if err != nil { log.Fatalf("Unable to use config file %s: %v", userCfgFile, err) } if fi.IsDir() { log.Fatalf("Provided config %s is a directory, not a file", userCfgFile) } log.Infof("Using provided config file %s", userCfgFile) opts.Filename = userCfgFile } else if _, err := os.Stat(DefaultConfigFile); err == nil { log.Infof("Using default config file %s", DefaultConfigFile) opts.Filename = DefaultConfigFile } else { log.Infof("No provided or default config file found - proceeding without") } gconf, err := globalconf.NewWithOptions(&opts) if err != nil { return nil, err } gconf.ParseSet("", flagset) cfg := config.Config{ Verbosity: (*flagset.Lookup("verbosity")).Value.(flag.Getter).Get().(int), EtcdServers: (*flagset.Lookup("etcd_servers")).Value.(flag.Getter).Get().(pkg.StringSlice), EtcdKeyPrefix: (*flagset.Lookup("etcd_key_prefix")).Value.(flag.Getter).Get().(string), EtcdKeyFile: (*flagset.Lookup("etcd_keyfile")).Value.(flag.Getter).Get().(string), EtcdCertFile: (*flagset.Lookup("etcd_certfile")).Value.(flag.Getter).Get().(string), EtcdCAFile: (*flagset.Lookup("etcd_cafile")).Value.(flag.Getter).Get().(string), EtcdRequestTimeout: (*flagset.Lookup("etcd_request_timeout")).Value.(flag.Getter).Get().(float64), EngineReconcileInterval: (*flagset.Lookup("engine_reconcile_interval")).Value.(flag.Getter).Get().(float64), PublicIP: (*flagset.Lookup("public_ip")).Value.(flag.Getter).Get().(string), RawMetadata: (*flagset.Lookup("metadata")).Value.(flag.Getter).Get().(string), AgentTTL: (*flagset.Lookup("agent_ttl")).Value.(flag.Getter).Get().(string), VerifyUnits: (*flagset.Lookup("verify_units")).Value.(flag.Getter).Get().(bool), TokenLimit: (*flagset.Lookup("token_limit")).Value.(flag.Getter).Get().(int), AuthorizedKeysFile: (*flagset.Lookup("authorized_keys_file")).Value.(flag.Getter).Get().(string), } if cfg.VerifyUnits { log.Error("Config option verify_units is no longer supported - ignoring") } if len(cfg.AuthorizedKeysFile) > 0 { log.Error("Config option authorized_keys_file is no longer supported - ignoring") } if cfg.Verbosity > 0 { log.EnableDebug() } return &cfg, nil }
// getTarget returns the target for the present time func getTarget(db *bolt.DB, groupID string) string { // Load the group g, err := getGroup(db, groupID) if err != nil { log.Error("Failed to load group", "error", err) return "" } // See if we have an explicit date entry d := ActiveDate(db, g, time.Now()) if d != nil { Log.Debug("Found matching Date", "day", d) return d.Target } // Otherwise, use the day schedule d2 := ActiveDay(db, g, time.Now()) if d2 != nil { Log.Debug("Found matching Day", "day", d2) return d2.Target } // Finally, check to see if the group has a default target if g.DefaultTarget != "" { return g.DefaultTarget } return "" }
func (r *RegistryMux) rpcDialerNoEngine(_ string, timeout time.Duration) (net.Conn, error) { ticker := time.Tick(dialRegistryReconnectTimeout) // Timeout re-defined to call etcd every 5secs to get the leader timeout = 5 * time.Second check := time.After(timeout) for { select { case <-check: log.Errorf("Unable to connect to engine %s\n", r.currentEngine.PublicIP) // Get the new engine leader of the cluster out of etcd lease, err := r.leaseManager.GetLease(engineLeaderKeyPath) // Key found if err == nil && lease != nil { var err error machines, err := r.etcdRegistry.Machines() if err != nil { log.Errorf("Unable to get the machines of the cluster %v\n", err) return nil, errors.New("Unable to get the machines of the cluster") } for _, s := range machines { // Update the currentEngine with the new one... otherwise wait until // there is one if s.ID == lease.MachineID() { // New leader has not gRPC capabilities enabled. if !s.Capabilities.Has(machine.CapGRPC) { log.Error("New leader engine has not gRPC enabled!") return nil, errors.New("New leader engine has not gRPC enabled!") } r.currentEngine = s log.Infof("Found a new engine to connect to: %s\n", r.currentEngine.PublicIP) // Restore initial check configuration timeout = 5 * time.Second check = time.After(timeout) } } } else { timeout = 2 * time.Second log.Errorf("Unable to get the leader engine, retrying in %v...", timeout) check = time.After(timeout) } case <-ticker: addr := fmt.Sprintf("%s:%d", r.currentEngine.PublicIP, rpcServerPort) conn, err := net.Dial("tcp", addr) if err == nil { log.Infof("Connected to engine on %s\n", r.currentEngine.PublicIP) return conn, nil } log.Errorf("Retry to connect to new engine: %+v", err) } } }