// 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]") } }
func SendMySQLSeedData(targetHostname string, directory string, seedId string) error { if directory == "" { return log.Error("Empty directory in SendMySQLSeedData") } err := commandRun(fmt.Sprintf("%s %s %s %d", config.Config.SendSeedDataCommand, directory, targetHostname, SeedTransferPort), func(cmd *exec.Cmd) { activeCommands[seedId] = cmd log.Debug("SendMySQLSeedData command completed") }) if err != nil { return log.Errore(err) } return err }
// Verify that the OU of the presented client certificate matches the list // of Valid OUs func Verify(r *nethttp.Request, validOUs []string) error { if r.TLS == nil { return errors.New("no TLS") } for _, chain := range r.TLS.VerifiedChains { s := chain[0].Subject.OrganizationalUnit log.Debug("All OUs:", strings.Join(s, " ")) for _, ou := range s { log.Debug("Client presented OU:", ou) if HasString(ou, validOUs) { log.Debug("Found valid OU:", ou) return nil } } } log.Error("No valid OUs found") return errors.New("Invalid OU") }