package config import ( "fmt" "os" "time" "github.com/RichardKnop/machinery/v1/log" "gopkg.in/yaml.v2" ) // NewFromYaml creates a config object from YAML file func NewFromYaml(cnfPath string, keepReloading bool) (*Config, error) { cnf, err := fromFile(cnfPath) if err != nil { return nil, err } log.INFO.Printf("Successfully loaded config from file %s", cnfPath) if keepReloading { // Open a goroutine to watch remote changes forever go func() { for { // Delay after each request time.Sleep(reloadDelay) // Attempt to reload the config newCnf, newErr := fromFile(cnfPath) if newErr != nil { log.WARNING.Printf("Failed to reload config from file %s: %v", cnfPath, newErr) continue } *cnf = *newCnf // log.INFO.Printf("Successfully reloaded config from file %s", cnfPath) } }() } return cnf, nil } // ReadFromFile reads data from a file func ReadFromFile(cnfPath string) ([]byte, error) { file, err := os.Open(cnfPath) // Config file not found if err != nil { return nil, fmt.Errorf("Open file error: %s", err) } // Config file found, let's try to read it data := make([]byte, 1000) count, err := file.Read(data) if err != nil { return nil, fmt.Errorf("Read from file error: %s", err) } return data[:count], nil } func fromFile(cnfPath string) (*Config, error) { loadedCnf, cnf := new(Config), new(Config) *cnf = *defaultCnf data, err := ReadFromFile(cnfPath) if err != nil { return nil, err } if err := yaml.Unmarshal(data, cnf); err != nil { return nil, fmt.Errorf("Unmarshal YAML error: %s", err) } if err := yaml.Unmarshal(data, loadedCnf); err != nil { return nil, fmt.Errorf("Unmarshal YAML error: %s", err) } if loadedCnf.AMQP == nil { cnf.AMQP = nil } return cnf, nil }