func (cfg *config) configFromCmdLine() error { err := flags.SetFlagsFromEnv("ETCD", cfg.FlagSet) if err != nil { plog.Fatalf("%v", err) } cfg.LPUrls = flags.URLsFromFlag(cfg.FlagSet, "listen-peer-urls") cfg.APUrls = flags.URLsFromFlag(cfg.FlagSet, "initial-advertise-peer-urls") cfg.LCUrls = flags.URLsFromFlag(cfg.FlagSet, "listen-client-urls") cfg.ACUrls = flags.URLsFromFlag(cfg.FlagSet, "advertise-client-urls") cfg.ClusterState = cfg.clusterState.String() cfg.Fallback = cfg.fallback.String() cfg.Proxy = cfg.proxy.String() // disable default advertise-client-urls if lcurls is set missingAC := flags.IsSet(cfg.FlagSet, "listen-client-urls") && !flags.IsSet(cfg.FlagSet, "advertise-client-urls") if !cfg.mayBeProxy() && missingAC { cfg.ACUrls = nil } // disable default initial-cluster if discovery is set if (cfg.Durl != "" || cfg.DNSCluster != "") && !flags.IsSet(cfg.FlagSet, "initial-cluster") { cfg.InitialCluster = "" } return cfg.validate() }
func (cfg *config) configFromCmdLine() error { err := flags.SetFlagsFromEnv("ETCD", cfg.FlagSet) if err != nil { plog.Fatalf("%v", err) } flags.SetBindAddrFromAddr(cfg.FlagSet, "peer-bind-addr", "peer-addr") flags.SetBindAddrFromAddr(cfg.FlagSet, "bind-addr", "addr") cfg.lpurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-peer-urls", "peer-bind-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.apurls, err = flags.URLsFromFlags(cfg.FlagSet, "initial-advertise-peer-urls", "peer-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.lcurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-client-urls", "bind-addr", cfg.clientTLSInfo) if err != nil { return err } cfg.acurls, err = flags.URLsFromFlags(cfg.FlagSet, "advertise-client-urls", "addr", cfg.clientTLSInfo) if err != nil { return err } return cfg.validateConfig(func(field string) bool { return flags.IsSet(cfg.FlagSet, field) }) }
func main() { fs.Usage = flags.UsageWithIgnoredFlagsFunc(fs, ignored) err := fs.Parse(os.Args[1:]) switch err { case nil: case flag.ErrHelp: os.Exit(0) default: os.Exit(2) } if *printVersion { fmt.Println("etcd version", version.Version) os.Exit(0) } flags.SetFlagsFromEnv(fs) if string(*proxyFlag) == flags.ProxyValueOff { startEtcd() } else { startProxy() } // Block indefinitely <-make(chan struct{}) }
func (cfg *config) Parse(arguments []string) error { perr := cfg.FlagSet.Parse(arguments) switch perr { case nil: case flag.ErrHelp: os.Exit(0) default: os.Exit(2) } if cfg.printVersion { fmt.Println("etcd version", version.Version) os.Exit(0) } err := flags.SetFlagsFromEnv(cfg.FlagSet) if err != nil { log.Fatalf("etcd: %v", err) } set := make(map[string]bool) cfg.FlagSet.Visit(func(f *flag.Flag) { set[f.Name] = true }) nSet := 0 for _, v := range []bool{set["discovery"], set["initial-cluster"], set["discovery-srv"]} { if v { nSet += 1 } } if nSet > 1 { return ErrConflictBootstrapFlags } cfg.lpurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-peer-urls", "peer-bind-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.apurls, err = flags.URLsFromFlags(cfg.FlagSet, "initial-advertise-peer-urls", "peer-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.lcurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-client-urls", "bind-addr", cfg.clientTLSInfo) if err != nil { return err } cfg.acurls, err = flags.URLsFromFlags(cfg.FlagSet, "advertise-client-urls", "addr", cfg.clientTLSInfo) if err != nil { return err } if err := cfg.resolveUrls(); err != nil { return errors.New("cannot resolve DNS hostnames.") } return nil }
// parseConfig parses out the input config from cmdline arguments and // environment variables. func parseConfig(args []string) (*flag.FlagSet, error) { fs := flag.NewFlagSet("full flagset", flag.ContinueOnError) etcdmain.NewConfig().VisitAll(func(f *flag.Flag) { fs.Var(&value{}, f.Name, "") }) if err := fs.Parse(args); err != nil { return nil, err } if err := flags.SetFlagsFromEnv(fs); err != nil { return nil, err } return fs, nil }
func (cfg *config) configFromCmdLine() error { err := flags.SetFlagsFromEnv("ETCD", cfg.FlagSet) if err != nil { plog.Fatalf("%v", err) } cfg.lpurls = flags.URLsFromFlag(cfg.FlagSet, "listen-peer-urls") cfg.apurls = flags.URLsFromFlag(cfg.FlagSet, "initial-advertise-peer-urls") cfg.lcurls = flags.URLsFromFlag(cfg.FlagSet, "listen-client-urls") cfg.acurls = flags.URLsFromFlag(cfg.FlagSet, "advertise-client-urls") return cfg.validateConfig(func(field string) bool { return flags.IsSet(cfg.FlagSet, field) }) }
func Main() { perr := fs.Parse(os.Args[1:]) switch perr { case nil: case flag.ErrHelp: os.Exit(0) default: os.Exit(2) } if *printVersion { fmt.Println("etcd version", version.Version) os.Exit(0) } err := flags.SetFlagsFromEnv(fs) if err != nil { log.Fatalf("etcd: %v", err) } shouldProxy := proxyFlag.String() != proxyFlagOff var stopped <-chan struct{} if !shouldProxy { stopped, err = startEtcd() if err == discovery.ErrFullCluster && fallbackFlag.String() == fallbackFlagProxy { log.Printf("etcd: discovery cluster full, falling back to %s", fallbackFlagProxy) shouldProxy = true } } if shouldProxy { err = startProxy() } if err != nil { switch err { case discovery.ErrDuplicateID: log.Fatalf("etcd: member %s has previously registered with discovery service (%s), but the data-dir (%s) on disk cannot be found.", *name, *durl, *dir) default: log.Fatalf("etcd: %v", err) } } <-stopped }
func Main() { fs.Usage = flags.UsageWithIgnoredFlagsFunc(fs, ignored) perr := fs.Parse(os.Args[1:]) switch perr { case nil: case flag.ErrHelp: os.Exit(0) default: os.Exit(2) } if *printVersion { fmt.Println("etcd version", version.Version) os.Exit(0) } err := flags.SetFlagsFromEnv(fs) if err != nil { log.Fatalf("etcd: %v", err) } shouldProxy := proxyFlag.String() != proxyFlagOff var stopped <-chan struct{} if !shouldProxy { stopped, err = startEtcd() if err == discovery.ErrFullCluster && fallbackFlag.String() == fallbackFlagProxy { log.Printf("etcd: discovery cluster full, falling back to %s", fallbackFlagProxy) shouldProxy = true } } if shouldProxy { err = startProxy() } if err != nil { log.Fatalf("etcd: %v", err) } <-stopped }
func (cfg *config) Parse(arguments []string) error { perr := cfg.FlagSet.Parse(arguments) switch perr { case nil: case flag.ErrHelp: fmt.Println(flagsline) os.Exit(0) default: os.Exit(2) } if len(cfg.FlagSet.Args()) != 0 { return fmt.Errorf("'%s' is not a valid flag", cfg.FlagSet.Arg(0)) } if cfg.printVersion { fmt.Printf("etcd Version: %s\n", version.Version) fmt.Printf("Git SHA: %s\n", version.GitSHA) fmt.Printf("Go Version: %s\n", runtime.Version()) fmt.Printf("Go OS/Arch: %s/%s\n", runtime.GOOS, runtime.GOARCH) os.Exit(0) } err := flags.SetFlagsFromEnv("ETCD", cfg.FlagSet) if err != nil { plog.Fatalf("%v", err) } set := make(map[string]bool) cfg.FlagSet.Visit(func(f *flag.Flag) { set[f.Name] = true }) nSet := 0 for _, v := range []bool{set["discovery"], set["initial-cluster"], set["discovery-srv"]} { if v { nSet += 1 } } if nSet > 1 { return ErrConflictBootstrapFlags } flags.SetBindAddrFromAddr(cfg.FlagSet, "peer-bind-addr", "peer-addr") flags.SetBindAddrFromAddr(cfg.FlagSet, "bind-addr", "addr") cfg.lpurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-peer-urls", "peer-bind-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.apurls, err = flags.URLsFromFlags(cfg.FlagSet, "initial-advertise-peer-urls", "peer-addr", cfg.peerTLSInfo) if err != nil { return err } cfg.lcurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-client-urls", "bind-addr", cfg.clientTLSInfo) if err != nil { return err } cfg.acurls, err = flags.URLsFromFlags(cfg.FlagSet, "advertise-client-urls", "addr", cfg.clientTLSInfo) if err != nil { return err } // when etcd runs in member mode user needs to set --advertise-client-urls if --listen-client-urls is set. // TODO(yichengq): check this for joining through discovery service case mayFallbackToProxy := flags.IsSet(cfg.FlagSet, "discovery") && cfg.fallback.String() == fallbackFlagProxy mayBeProxy := cfg.proxy.String() != proxyFlagOff || mayFallbackToProxy if !mayBeProxy { if flags.IsSet(cfg.FlagSet, "listen-client-urls") && !flags.IsSet(cfg.FlagSet, "advertise-client-urls") { return errUnsetAdvertiseClientURLsFlag } } if 5*cfg.TickMs > cfg.ElectionMs { return fmt.Errorf("--election-timeout[%vms] should be at least as 5 times as --heartbeat-interval[%vms]", cfg.ElectionMs, cfg.TickMs) } if cfg.ElectionMs > maxElectionMs { return fmt.Errorf("--election-timeout[%vms] is too long, and should be set less than %vms", cfg.ElectionMs, maxElectionMs) } return nil }