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 }
func main() { // parse global arguments globalFlagset.Parse(os.Args[1:]) var args = globalFlagset.Args() getFlagsFromEnv(cliName, globalFlagset) if globalFlags.Debug { log.EnableDebug() } if globalFlags.Version { args = []string{"version"} } else if len(args) < 1 || globalFlags.Help { args = []string{"help"} } var cmd *Command // determine which Command should be run for _, c := range commands { if c.Name == args[0] { cmd = c if err := c.Flags.Parse(args[1:]); err != nil { stderr("%v", err) os.Exit(2) } break } } if cmd == nil { stderr("%v: unknown subcommand: %q", cliName, args[0]) stderr("Run '%v help' for usage.", cliName) os.Exit(2) } if sharedFlags.Sign { stderr("WARNING: The signed/verified units feature is DEPRECATED and cannot be used.") os.Exit(2) } if cmd.Name != "help" && cmd.Name != "version" { var err error cAPI, err = getClient() if err != nil { stderr("Unable to initialize client: %v", err) os.Exit(1) } } os.Exit(cmd.Run(cmd.Flags.Args())) }
func main() { // parse global arguments globalFlagset.Parse(os.Args[1:]) var args = globalFlagset.Args() getFlagsFromEnv(cliName, globalFlagset) if globalFlags.Debug { log.EnableDebug() } if globalFlags.Version { args = []string{"version"} } else if len(args) < 1 || globalFlags.Help { args = []string{"help"} } var cmd *Command // determine which Command should be run for _, c := range commands { if c.Name == args[0] { cmd = c if err := c.Flags.Parse(args[1:]); err != nil { stderr("%v", err) os.Exit(2) } break } } if cmd == nil { stderr("%v: unknown subcommand: %q", cliName, args[0]) stderr("Run '%v help' for usage.", cliName) os.Exit(2) } if sharedFlags.Sign { stderr("WARNING: The signed/verified units feature is DEPRECATED and cannot be used.") os.Exit(2) } visited := make(map[string]bool, 0) globalFlagset.Visit(func(f *flag.Flag) { visited[f.Name] = true }) // if --driver is not set, but --endpoint looks like an etcd // server, set the driver to etcd if visited["endpoint"] && !visited["driver"] { if u, err := url.Parse(strings.Split(globalFlags.Endpoint, ",")[0]); err == nil { if _, port, err := net.SplitHostPort(u.Host); err == nil && (port == "4001" || port == "2379") { log.Debugf("Defaulting to --driver=%s as --endpoint appears to be etcd", clientDriverEtcd) globalFlags.ClientDriver = clientDriverEtcd } } } if cmd.Name != "help" && cmd.Name != "version" { var err error cAPI, err = getClient() if err != nil { stderr("Unable to initialize client: %v", err) os.Exit(1) } } os.Exit(cmd.Run(cmd.Flags.Args())) }
func main() { if globalFlags.Debug { log.EnableDebug() } // call this as early as possible to ensure we always have timestamps // on fleetctl logs log.EnableTimestamps() if len(os.Args) == 1 { cmdFleet.Help() os.Exit(0) } if os.Args[1] == "--version" || os.Args[1] == "-v" { runVersion(cmdVersion, nil) os.Exit(0) } // determine currentCommand. We only need this for --replace and its // functional tests, so just handle those for now in the switch... // "The rest" doesn't care about "currentCommand" if len(os.Args) > 1 { for i := 1; i < len(os.Args); i++ { switch os.Args[i] { case "start": currentCommand = "start" case "load": currentCommand = "load" case "submit": currentCommand = "submit" default: continue } } } if sharedFlags.Sign { stderr("WARNING: The signed/verified units feature is DEPRECATED and cannot be used.") os.Exit(2) } // if --driver is not set, but --endpoint looks like an etcd // server, set the driver to etcd if globalFlags.Endpoint != "" && globalFlags.ClientDriver == "" { if u, err := url.Parse(strings.Split(globalFlags.Endpoint, ",")[0]); err == nil { if _, port, err := net.SplitHostPort(u.Host); err == nil && (port == "4001" || port == "2379") { log.Debugf("Defaulting to --driver=%s as --endpoint appears to be etcd", clientDriverEtcd) globalFlags.ClientDriver = clientDriverEtcd } } } cmdFleet.SetUsageFunc(usageFunc) cmdFleet.SetHelpTemplate(`{{.UsageString}}`) if err := cmdFleet.Execute(); err != nil { stderr("cannot execute cmdFleet: %v", err) } os.Exit(cmdExitCode) }