func main() { app := cli.NewApp() app.Name = "fleetctl" app.Usage = "fleetctl is a command line driven interface to the cluster wide CoreOS init system." app.Flags = []cli.Flag{ cli.StringFlag{"endpoint", "http://127.0.0.1:4001", "Fleet Engine API endpoint (etcd)"}, cli.StringFlag{"tunnel", "", "Establish an SSH tunnel through the provided address for communication with fleet and etcd."}, cli.BoolTFlag{"strict-host-key-checking", "Do strict check on known hosts for ssh connection. Defaults to 'true'."}, cli.StringFlag{"known-hosts-file", ssh.DefaultKnownHostsFile, "Location for known_hosts file"}, } app.Commands = []cli.Command{ newListUnitsCommand(), newSubmitUnitCommand(), newDestroyUnitCommand(), newStartUnitCommand(), newStopUnitCommand(), newStatusUnitsCommand(), newCatUnitCommand(), newListMachinesCommand(), newJournalCommand(), newSSHCommand(), newVerifyUnitCommand(), newDebugInfoCommand(), } for _, f := range app.Flags { f.Apply(flagset) } flagset.Bool("version", false, "Print the version and exit") flagset.Parse(os.Args[1:]) if (*flagset.Lookup("version")).Value.(flag.Getter).Get().(bool) { fmt.Println("fleetctl version", version.Version) os.Exit(0) } globalconf.Register("fleetctl", flagset) opts := globalconf.Options{EnvPrefix: "FLEETCTL_"} gconf, _ := globalconf.NewWithOptions(&opts) gconf.ParseSet("", flagset) registryCtl = NewRegistry(getRegistry()) app.Run(os.Args) }
func main() { app := cli.NewApp() app.Version = version.Version app.Name = "fleetctl" app.Usage = "fleetctl is a command line driven interface to the cluster wide CoreOS init system." app.Flags = []cli.Flag{ cli.StringFlag{"endpoint", "http://127.0.0.1:4001", "Fleet Engine API endpoint (etcd)"}, cli.StringFlag{"tunnel", "", "Establish an SSH tunnel through the provided address for communication with fleet and etcd."}, } app.Commands = []cli.Command{ newListUnitsCommand(), newSubmitUnitCommand(), newDestroyUnitCommand(), newStartUnitCommand(), newStopUnitCommand(), newStatusUnitsCommand(), newCatUnitCommand(), newListMachinesCommand(), newJournalCommand(), newSSHCommand(), } //flagset := flag.NewFlagSet("fleetctl", flag.ExitOnError) for _, flag := range app.Flags { flag.Apply(flagset) } flagset.Parse(os.Args[1:]) globalconf.Register("fleetctl", flagset) opts := globalconf.Options{ EnvPrefix: "FLEETCTL_", } gconf, _ := globalconf.NewWithOptions(opts) gconf.ParseSet("", flagset) app.Run(os.Args) }
func main() { // We use a FlagSets since glog adds a bunch of flags we do not want to publish userset := flag.NewFlagSet("fleet", flag.ExitOnError) printVersion := userset.Bool("version", false, "Print the version and exit") cfgPath := userset.String("config", "/etc/fleet/fleet.conf", "Path to config file") err := userset.Parse(os.Args[1:]) if err == flag.ErrHelp { userset.Usage() syscall.Exit(1) } if *printVersion { fmt.Println("fleet version", version.Version) os.Exit(0) } cfgset := flag.NewFlagSet("fleet", flag.ExitOnError) cfgset.Int("verbosity", 0, "Logging level") cfgset.Var(&stringSlice{}, "etcd_servers", "List of etcd endpoints") cfgset.String("boot_id", "", "Override default BootID of fleet machine") cfgset.String("public_ip", "", "IP address that fleet machine should publish") cfgset.String("metadata", "", "List of key-value metadata to assign to the fleet machine") cfgset.String("unit_prefix", "", "Prefix that should be used for all systemd units") cfgset.String("agent_ttl", agent.DefaultTTL, "TTL in seconds of fleet machine state in etcd") globalconf.Register("", cfgset) cfg, err := getConfig(cfgset, *cfgPath) if err != nil { glog.Error(err.Error()) syscall.Exit(1) } config.UpdateLoggingFlagsFromConfig(cfg) etcd.SetLogger(etcdLogger{}) srv := server.New(*cfg) srv.Run() reconfigure := func() { glog.Infof("Reloading configuration from %s", *cfgPath) cfg, err := getConfig(cfgset, *cfgPath) if err != nil { glog.Errorf(err.Error()) syscall.Exit(1) } srv.Stop() config.UpdateLoggingFlagsFromConfig(cfg) srv = server.New(*cfg) srv.Run() } shutdown := func() { glog.Infof("Gracefully shutting down") srv.Stop() srv.Purge() syscall.Exit(0) } signals := map[os.Signal]func(){ syscall.SIGHUP: reconfigure, syscall.SIGTERM: shutdown, syscall.SIGINT: shutdown, } listenForSignals(signals) }
func main() { // We use a FlagSets since glog adds a bunch of flags we do not want to publish userset := flag.NewFlagSet("fleet", flag.ExitOnError) printVersion := userset.Bool("version", false, "Print the version and exit") cfgPath := userset.String("config", "", fmt.Sprintf("Path to config file. Fleet will look for a config at %s by default.", DefaultConfigFile)) // Initialize logging so we have it set up while parsing config information config.UpdateLoggingFlagsFromConfig(flag.CommandLine, &config.Config{}) err := userset.Parse(os.Args[1:]) if err == flag.ErrHelp { userset.Usage() syscall.Exit(1) } if *printVersion { fmt.Println("fleet version", version.Version) os.Exit(0) } cfgset := flag.NewFlagSet("fleet", flag.ExitOnError) cfgset.Int("verbosity", 0, "Logging level") cfgset.Var(&stringSlice{}, "etcd_servers", "List of etcd endpoints") cfgset.String("boot_id", "", "Override default BootID of fleet machine") cfgset.String("public_ip", "", "IP address that fleet machine should publish") cfgset.String("metadata", "", "List of key-value metadata to assign to the fleet machine") cfgset.String("unit_prefix", "", "Prefix that should be used for all systemd units") cfgset.String("agent_ttl", agent.DefaultTTL, "TTL in seconds of fleet machine state in etcd") cfgset.Bool("verify_units", false, "Verify unit file signatures using local SSH identities") cfgset.String("authorized_keys_file", sign.DefaultAuthorizedKeysFile, "File containing public SSH keys to be used for signature verification") globalconf.Register("", cfgset) cfg, err := getConfig(cfgset, *cfgPath) if err != nil { glog.Error(err.Error()) syscall.Exit(1) } srv := server.New(*cfg) srv.Run() reconfigure := func() { glog.Infof("Reloading configuration from %s", *cfgPath) cfg, err := getConfig(cfgset, *cfgPath) if err != nil { glog.Errorf(err.Error()) syscall.Exit(1) } srv.Stop() srv = server.New(*cfg) srv.Run() } shutdown := func() { glog.Infof("Gracefully shutting down") srv.Stop() srv.Purge() syscall.Exit(0) } writeState := func() { glog.Infof("Dumping server state") encoded, err := json.Marshal(srv) if err != nil { glog.Errorf("Failed to dump server state: %v", err) return } if _, err := os.Stdout.Write(encoded); err != nil { glog.Errorf("Failed to dump server state: %v", err) return } os.Stdout.Write([]byte("\n")) glog.V(1).Infof("Finished dumping server state") } signals := map[os.Signal]func(){ syscall.SIGHUP: reconfigure, syscall.SIGTERM: shutdown, syscall.SIGINT: shutdown, syscall.SIGUSR1: writeState, } listenForSignals(signals) }