// main is the application's entry point. It will either spawn a CLI or HTTP itnerfaces. func main() { configFile := flag.String("config", "", "config file name") command := flag.String("c", "", "command (discover|forget|continuous|move-up|move-below|begin-maintenance|end-maintenance|clusters|topology)") strict := flag.Bool("strict", false, "strict mode (more checks, slower)") instance := flag.String("i", "", "instance, host:port") sibling := flag.String("s", "", "sibling instance, host:port") owner := flag.String("owner", "", "operation owner") reason := flag.String("reason", "", "operation reason") duration := flag.String("duration", "", "maintenance duration (format: 59s, 59m, 23h, 6d, 4w)") pattern := flag.String("pattern", "", "regular expression pattern") clusterAlias := flag.String("alias", "", "cluster alias") pool := flag.String("pool", "", "Pool logical name (applies for pool-related commands)") hostnameFlag := flag.String("hostname", "", "Hostname/fqdn/CNAME/VIP (applies for hostname/resolve related commands)") discovery := flag.Bool("discovery", true, "auto discovery mode") verbose := flag.Bool("verbose", false, "verbose") debug := flag.Bool("debug", false, "debug mode (very verbose)") stack := flag.Bool("stack", false, "add stack trace upon error") config.RuntimeCLIFlags.SkipUnresolveCheck = flag.Bool("skip-unresolve-check", false, "Skip/ignore checking an unresolve mapping (via hostname_unresolve table) resolves back to same hostname") config.RuntimeCLIFlags.Noop = flag.Bool("noop", false, "Dry run; do not perform destructing operations") flag.Parse() log.SetLevel(log.ERROR) if *verbose { log.SetLevel(log.INFO) } if *debug { log.SetLevel(log.DEBUG) } if *stack { log.SetPrintStackTrace(*stack) } log.Info("starting") runtime.GOMAXPROCS(math.MinInt(4, runtime.NumCPU())) if len(*configFile) > 0 { config.ForceRead(*configFile) } else { config.Read("/etc/orchestrator.conf.json", "conf/orchestrator.conf.json", "orchestrator.conf.json") } if config.Config.Debug { log.SetLevel(log.DEBUG) } if len(flag.Args()) == 0 && *command == "" { // No command, no argument: just prompt fmt.Println(prompt) return } switch { case len(flag.Args()) == 0 || flag.Arg(0) == "cli": app.Cli(*command, *strict, *instance, *sibling, *owner, *reason, *duration, *pattern, *clusterAlias, *pool, *hostnameFlag) case flag.Arg(0) == "http": app.Http(*discovery) default: log.Error("Usage: orchestrator --options... [cli|http]") } }
// main is the application's entry point. It will either spawn a CLI or HTTP itnerfaces. func main() { configFile := flag.String("config", "", "config file name") command := flag.String("c", "", "command, required. See full list of commands via 'orchestrator -c help'") strict := flag.Bool("strict", false, "strict mode (more checks, slower)") instance := flag.String("i", "", "instance, host_fqdn[:port] (e.g. db.company.com:3306, db.company.com)") sibling := flag.String("s", "", "sibling instance, host_fqdn[:port]") destination := flag.String("d", "", "destination instance, host_fqdn[:port] (synonym to -s)") owner := flag.String("owner", "", "operation owner") reason := flag.String("reason", "", "operation reason") duration := flag.String("duration", "", "maintenance duration (format: 59s, 59m, 23h, 6d, 4w)") pattern := flag.String("pattern", "", "regular expression pattern") clusterAlias := flag.String("alias", "", "cluster alias") pool := flag.String("pool", "", "Pool logical name (applies for pool-related commands)") hostnameFlag := flag.String("hostname", "", "Hostname/fqdn/CNAME/VIP (applies for hostname/resolve related commands)") discovery := flag.Bool("discovery", true, "auto discovery mode") quiet := flag.Bool("quiet", false, "quiet") verbose := flag.Bool("verbose", false, "verbose") debug := flag.Bool("debug", false, "debug mode (very verbose)") stack := flag.Bool("stack", false, "add stack trace upon error") config.RuntimeCLIFlags.Databaseless = flag.Bool("databaseless", false, "EXPERIMENTAL! Work without backend database") config.RuntimeCLIFlags.SkipUnresolveCheck = flag.Bool("skip-unresolve-check", false, "Skip/ignore checking an unresolve mapping (via hostname_unresolve table) resolves back to same hostname") config.RuntimeCLIFlags.Noop = flag.Bool("noop", false, "Dry run; do not perform destructing operations") config.RuntimeCLIFlags.BinlogFile = flag.String("binlog", "", "Binary log file name") flag.Parse() if *destination != "" && *sibling != "" { log.Fatalf("-s and -d are synonyms, yet both were specified. You're probably doing the wrong thing.") } if *destination == "" { *destination = *sibling } log.SetLevel(log.ERROR) if *verbose { log.SetLevel(log.INFO) } if *debug { log.SetLevel(log.DEBUG) } if *stack { log.SetPrintStackTrace(*stack) } log.Info("starting") runtime.GOMAXPROCS(math.MinInt(4, runtime.NumCPU())) if len(*configFile) > 0 { config.ForceRead(*configFile) } else { config.Read("/etc/orchestrator.conf.json", "conf/orchestrator.conf.json", "orchestrator.conf.json") } if *config.RuntimeCLIFlags.Databaseless { config.Config.DatabaselessMode__experimental = true } if config.Config.Debug { log.SetLevel(log.DEBUG) } if *quiet { // Override!! log.SetLevel(log.ERROR) } if config.Config.EnableSyslog { log.EnableSyslogWriter("orchestrator") log.SetSyslogLevel(log.INFO) } if config.Config.AuditToSyslog { inst.EnableAuditSyslog() } if len(flag.Args()) == 0 && *command == "" { // No command, no argument: just prompt fmt.Println(prompt) return } var executionMode OrchestratorExecutionMode switch { case len(flag.Args()) == 0 || flag.Arg(0) == "cli": executionMode = CliMode case flag.Arg(0) == "http": executionMode = HttpMode default: fmt.Fprintln(os.Stderr, `Usage: orchestrator --options... [cli|http] See complete list of commands: orchestrator -c help Full blown documentation: orchestrator `) os.Exit(1) } process.ContinuousRegistration(string(executionMode)) switch executionMode { case CliMode: app.Cli(*command, *strict, *instance, *destination, *owner, *reason, *duration, *pattern, *clusterAlias, *pool, *hostnameFlag) case HttpMode: app.Http(*discovery) } }