func main() { // Most flags are defined in the confd/config package which allows us to // override configuration settings from the command line. Parse the flags now // to make them active. flag.Parse() if printVersion { fmt.Printf("confd %s\n", Version) os.Exit(0) } if configFile == "" { if IsFileExist(defaultConfigFile) { configFile = defaultConfigFile } } // Initialize the global configuration. log.Debug("Loading confd configuration") if err := config.LoadConfig(configFile); err != nil { log.Fatal(err.Error()) } // Configure logging. While you can enable debug and verbose logging, however // if quiet is set to true then debug and verbose messages will not be printed. log.SetQuiet(config.Quiet()) log.SetVerbose(config.Verbose()) log.SetDebug(config.Debug()) log.Notice("Starting confd") // Create the storage client log.Notice("Backend set to " + config.Backend()) store, err := backends.New(config.Backend()) if err != nil { log.Fatal(err.Error()) } signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) for { runErrors := template.ProcessTemplateResources(store) // If the -onetime flag is passed on the command line we immediately exit // after processing the template config files. if onetime { if len(runErrors) > 0 { os.Exit(1) } os.Exit(0) } select { case c := <-signalChan: log.Info(fmt.Sprintf("captured %v exiting...", c)) os.Exit(0) case <-time.After(time.Duration(config.Interval()) * time.Second): // Continue processing templates. } } }
func main() { // Most flags are defined in the confd/config package which allows us to // override configuration settings from the command line. Parse the flags now // to make them active. flag.Parse() if configFile == "" { if IsFileExist(defaultConfigFile) { configFile = defaultConfigFile } } // Initialize the global configuration. log.Debug("Loading confd configuration") if err := config.LoadConfig(configFile); err != nil { log.Fatal(err.Error()) } // Configure logging. While you can enable debug and verbose logging, however // if quiet is set to true then debug and verbose messages will not be printed. log.SetQuiet(config.Quiet()) log.SetVerbose(config.Verbose()) log.SetDebug(config.Debug()) log.Notice("Starting confd") // Create the etcd client upfront and use it for the life of the process. // The etcdClient is an http.Client and designed to be reused. log.Notice("etcd nodes set to " + strings.Join(config.EtcdNodes(), ", ")) etcdClient, err := etcdutil.NewEtcdClient(config.EtcdNodes(), config.ClientCert(), config.ClientKey(), config.ClientCaKeys()) if err != nil { log.Fatal(err.Error()) } for { runErrors := template.ProcessTemplateResources(etcdClient) // If the -onetime flag is passed on the command line we immediately exit // after processing the template config files. if onetime { if len(runErrors) > 0 { os.Exit(1) } os.Exit(0) } time.Sleep(time.Duration(config.Interval()) * time.Second) } }
func main() { // Most flags are defined in the confd/config package which allows us to // override configuration settings from the command line. Parse the flags now // to make them active. flag.Parse() if configFile == "" { if IsFileExist(defaultConfigFile) { configFile = defaultConfigFile } } // Initialize the global configuration. log.Debug("Loading confd configuration") if err := config.LoadConfig(configFile); err != nil { log.Fatal(err.Error()) } // Configure logging. While you can enable debug and verbose logging, however // if quiet is set to true then debug and verbose messages will not be printed. log.SetQuiet(config.Quiet()) log.SetVerbose(config.Verbose()) log.SetDebug(config.Debug()) log.Notice("Starting confd") // Create the storage client store, err := createStoreClient(config.Backend()) if err != nil { log.Fatal(err.Error()) } for { runErrors := template.ProcessTemplateResources(store) // If the -onetime flag is passed on the command line we immediately exit // after processing the template config files. if onetime { if len(runErrors) > 0 { os.Exit(1) } os.Exit(0) } time.Sleep(time.Duration(config.Interval()) * time.Second) } }
func TestProcessTemplateResources(t *testing.T) { log.SetQuiet(true) // Setup temporary conf, config, and template directories. tempConfDir, err := createTempDirs() if err != nil { t.Errorf("Failed to create temp dirs: %s", err.Error()) } defer os.RemoveAll(tempConfDir) // Create the src template. srcTemplateFile := filepath.Join(tempConfDir, "templates", "foo.tmpl") err = ioutil.WriteFile(srcTemplateFile, []byte("foo = {{ .foo }}"), 0644) if err != nil { t.Error(err.Error()) } // Create the dest. destFile, err := ioutil.TempFile("", "") if err != nil { t.Errorf("Failed to create destFile: %s", err.Error()) } defer os.Remove(destFile.Name()) // Create the template resource configuration file. templateResourcePath := filepath.Join(tempConfDir, "conf.d", "foo.toml") templateResourceFile, err := os.Create(templateResourcePath) if err != nil { t.Errorf(err.Error()) } tmpl, err := template.New("templateResourceConfig").Parse(templateResourceConfigTmpl) if err != nil { t.Errorf("Unable to parse template resource template: %s", err.Error()) } data := make(map[string]string) data["src"] = "foo.tmpl" data["dest"] = destFile.Name() err = tmpl.Execute(templateResourceFile, data) if err != nil { t.Errorf(err.Error()) } // Load the confd configuration settings. if err := config.LoadConfig(""); err != nil { t.Errorf(err.Error()) } config.SetPrefix("") // Use the temporary tempConfDir from above. config.SetConfDir(tempConfDir) // Create the stub etcd client. c := &MockStore{} c.AddKey("/foo", "bar") // Process the test template resource. runErrors := ProcessTemplateResources(c) if len(runErrors) > 0 { for _, e := range runErrors { t.Errorf(e.Error()) } } // Verify the results. expected := "foo = bar" results, err := ioutil.ReadFile(destFile.Name()) if err != nil { t.Error(err.Error()) } if string(results) != expected { t.Errorf("Expected contents of dest == '%s', got %s", expected, string(results)) } }