func (c *Config) loadEnv(target interface{}) error { value := reflect.Indirect(reflect.ValueOf(target)) typ := value.Type() for i := 0; i < typ.NumField(); i++ { field := typ.Field(i) // Retrieve environment variable. v := strings.TrimSpace(os.Getenv(field.Tag.Get("env"))) if v == "" { continue } // Set the appropriate type. switch field.Type.Kind() { case reflect.Bool: value.Field(i).SetBool(v != "0" && v != "false") case reflect.Int: newValue, err := strconv.ParseInt(v, 10, 0) if err != nil { return fmt.Errorf("Parse error: %s: %s", field.Tag.Get("env"), err) } value.Field(i).SetInt(newValue) case reflect.String: value.Field(i).SetString(v) case reflect.Slice: value.Field(i).Set(reflect.ValueOf(ustrings.TrimSplit(v, ","))) } } return nil }
// LoadPeersFile loads the peers listed in the peers file. func (c *Config) LoadPeersFile() error { if c.PeersFile == "" { return nil } b, err := ioutil.ReadFile(c.PeersFile) if err != nil { return fmt.Errorf("Peers file error: %s", err) } c.Peers = ustrings.TrimSplit(string(b), ",") return nil }
// Loads configuration from command line flags. func (c *Config) LoadFlags(arguments []string) error { var peers, cors, path string f := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) f.SetOutput(ioutil.Discard) f.BoolVar(&c.ShowHelp, "h", false, "") f.BoolVar(&c.ShowHelp, "help", false, "") f.BoolVar(&c.ShowVersion, "version", false, "") f.BoolVar(&c.Force, "f", false, "") f.BoolVar(&c.Force, "force", false, "") f.BoolVar(&c.Verbose, "v", c.Verbose, "") f.BoolVar(&c.VeryVerbose, "vv", c.VeryVerbose, "") f.BoolVar(&c.VeryVeryVerbose, "vvv", c.VeryVeryVerbose, "") f.StringVar(&peers, "peers", "", "") f.StringVar(&c.PeersFile, "peers-file", c.PeersFile, "") f.StringVar(&c.Name, "name", c.Name, "") f.StringVar(&c.Addr, "addr", c.Addr, "") f.StringVar(&c.Discovery, "discovery", c.Discovery, "") f.StringVar(&c.BindAddr, "bind-addr", c.BindAddr, "") f.StringVar(&c.Peer.Addr, "peer-addr", c.Peer.Addr, "") f.StringVar(&c.Peer.BindAddr, "peer-bind-addr", c.Peer.BindAddr, "") f.StringVar(&c.CAFile, "ca-file", c.CAFile, "") f.StringVar(&c.CertFile, "cert-file", c.CertFile, "") f.StringVar(&c.KeyFile, "key-file", c.KeyFile, "") f.StringVar(&c.Peer.CAFile, "peer-ca-file", c.Peer.CAFile, "") f.StringVar(&c.Peer.CertFile, "peer-cert-file", c.Peer.CertFile, "") f.StringVar(&c.Peer.KeyFile, "peer-key-file", c.Peer.KeyFile, "") f.StringVar(&c.DataDir, "data-dir", c.DataDir, "") f.IntVar(&c.MaxResultBuffer, "max-result-buffer", c.MaxResultBuffer, "") f.IntVar(&c.MaxRetryAttempts, "max-retry-attempts", c.MaxRetryAttempts, "") f.Float64Var(&c.RetryInterval, "retry-interval", c.RetryInterval, "") f.IntVar(&c.MaxClusterSize, "max-cluster-size", c.MaxClusterSize, "") f.IntVar(&c.Peer.HeartbeatTimeout, "peer-heartbeat-timeout", c.Peer.HeartbeatTimeout, "") f.IntVar(&c.Peer.ElectionTimeout, "peer-election-timeout", c.Peer.ElectionTimeout, "") f.StringVar(&cors, "cors", "", "") f.BoolVar(&c.Snapshot, "snapshot", c.Snapshot, "") f.IntVar(&c.SnapshotCount, "snapshot-count", c.SnapshotCount, "") f.StringVar(&c.CPUProfileFile, "cpuprofile", "", "") f.StringVar(&c.strTrace, "trace", "", "") f.StringVar(&c.GraphiteHost, "graphite-host", "", "") // BEGIN IGNORED FLAGS f.StringVar(&path, "config", "", "") // BEGIN IGNORED FLAGS // BEGIN DEPRECATED FLAGS f.StringVar(&peers, "C", "", "(deprecated)") f.StringVar(&c.PeersFile, "CF", c.PeersFile, "(deprecated)") f.StringVar(&c.Name, "n", c.Name, "(deprecated)") f.StringVar(&c.Addr, "c", c.Addr, "(deprecated)") f.StringVar(&c.BindAddr, "cl", c.BindAddr, "(deprecated)") f.StringVar(&c.Peer.Addr, "s", c.Peer.Addr, "(deprecated)") f.StringVar(&c.Peer.BindAddr, "sl", c.Peer.BindAddr, "(deprecated)") f.StringVar(&c.Peer.CAFile, "serverCAFile", c.Peer.CAFile, "(deprecated)") f.StringVar(&c.Peer.CertFile, "serverCert", c.Peer.CertFile, "(deprecated)") f.StringVar(&c.Peer.KeyFile, "serverKey", c.Peer.KeyFile, "(deprecated)") f.StringVar(&c.CAFile, "clientCAFile", c.CAFile, "(deprecated)") f.StringVar(&c.CertFile, "clientCert", c.CertFile, "(deprecated)") f.StringVar(&c.KeyFile, "clientKey", c.KeyFile, "(deprecated)") f.StringVar(&c.DataDir, "d", c.DataDir, "(deprecated)") f.IntVar(&c.MaxResultBuffer, "m", c.MaxResultBuffer, "(deprecated)") f.IntVar(&c.MaxRetryAttempts, "r", c.MaxRetryAttempts, "(deprecated)") f.IntVar(&c.MaxClusterSize, "maxsize", c.MaxClusterSize, "(deprecated)") f.IntVar(&c.SnapshotCount, "snapshotCount", c.SnapshotCount, "(deprecated)") // END DEPRECATED FLAGS if err := f.Parse(arguments); err != nil { return err } // Print deprecation warnings on STDERR. f.Visit(func(f *flag.Flag) { if len(newFlagNameLookup[f.Name]) > 0 { fmt.Fprintf(os.Stderr, "[deprecated] use -%s, not -%s\n", newFlagNameLookup[f.Name], f.Name) } }) // Convert some parameters to lists. if peers != "" { c.Peers = ustrings.TrimSplit(peers, ",") } if cors != "" { c.CorsOrigins = ustrings.TrimSplit(cors, ",") } return nil }