func commandWorkflowCreate(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { if WorkflowManager == nil { return fmt.Errorf("no workflow.Manager registered") } skipStart := subFlags.Bool("skip_start", false, "If set, the workflow will not be started.") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() < 1 { return fmt.Errorf("the <factoryName> argument is required for the WorkflowCreate command") } factoryName := subFlags.Arg(0) uuid, err := WorkflowManager.Create(ctx, factoryName, subFlags.Args()[1:]) if err != nil { return err } wr.Logger().Printf("uuid: %v\n", uuid) if !*skipStart { return WorkflowManager.Start(ctx, uuid) } return nil }
func commandSplitClone(wi *Instance, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) (Worker, error) { online := subFlags.Bool("online", defaultOnline, "do online copy (optional approximate copy, source and destination tablets will not be put out of serving, minimizes downtime during offline copy)") offline := subFlags.Bool("offline", defaultOffline, "do offline copy (exact copy at a specific GTID, required before shard migration, source and destination tablets will be put out of serving during copy)") excludeTables := subFlags.String("exclude_tables", "", "comma separated list of tables to exclude") strategy := subFlags.String("strategy", "", "which strategy to use for restore, use 'vtworker SplitClone --strategy=-help k/s' for more info") sourceReaderCount := subFlags.Int("source_reader_count", defaultSourceReaderCount, "number of concurrent streaming queries to use on the source") writeQueryMaxRows := subFlags.Int("write_query_max_rows", defaultWriteQueryMaxRows, "maximum number of rows per write query") writeQueryMaxSize := subFlags.Int("write_query_max_size", defaultWriteQueryMaxSize, "maximum size (in bytes) per write query") writeQueryMaxRowsDelete := subFlags.Int("write_query_max_rows_delete", defaultWriteQueryMaxRows, "maximum number of rows per DELETE FROM write query") minTableSizeForSplit := subFlags.Int("min_table_size_for_split", defaultMinTableSizeForSplit, "tables bigger than this size on disk in bytes will be split into source_reader_count chunks if possible") destinationWriterCount := subFlags.Int("destination_writer_count", defaultDestinationWriterCount, "number of concurrent RPCs to execute on the destination") minHealthyRdonlyTablets := subFlags.Int("min_healthy_rdonly_tablets", defaultMinHealthyRdonlyTablets, "minimum number of healthy RDONLY tablets in the source and destination shard at start") maxTPS := subFlags.Int64("max_tps", defaultMaxTPS, "if non-zero, limit copy to maximum number of (write) transactions/second on the destination (unlimited by default)") if err := subFlags.Parse(args); err != nil { return nil, err } if subFlags.NArg() != 1 { subFlags.Usage() return nil, fmt.Errorf("command SplitClone requires <keyspace/shard>") } keyspace, shard, err := topoproto.ParseKeyspaceShard(subFlags.Arg(0)) if err != nil { return nil, err } var excludeTableArray []string if *excludeTables != "" { excludeTableArray = strings.Split(*excludeTables, ",") } worker, err := NewSplitCloneWorker(wr, wi.cell, keyspace, shard, *online, *offline, excludeTableArray, *strategy, *sourceReaderCount, *writeQueryMaxRows, *writeQueryMaxSize, *writeQueryMaxRowsDelete, uint64(*minTableSizeForSplit), *destinationWriterCount, *minHealthyRdonlyTablets, *maxTPS) if err != nil { return nil, fmt.Errorf("cannot create split clone worker: %v", err) } return worker, nil }
func mainReqs(args []string, flags *flag.FlagSet) { flags.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: %s %s <package-name>\n", os.Args[0], args[0]) flags.PrintDefaults() } file := flags.String("graphfile", "", fmt.Sprintf("Path to PyPI dependency graph file. Defaults to $GOPATH/src/github.com/beyang/cheerio/data/pypi_graph")) flags.Parse(args[1:]) if flags.NArg() < 1 { flags.Usage() os.Exit(1) } pkg := cheerio.NormalizedPkgName(flags.Arg(0)) var pypiG *cheerio.PyPIGraph if *file == "" { pypiG = cheerio.DefaultPyPIGraph } else { var err error pypiG, err = cheerio.NewPyPIGraph(*file) if err != nil { fmt.Printf("Error creating PyPI graph: %s\n", err) os.Exit(1) } } pkgReq := pypiG.Requires(pkg) pkgReqBy := pypiG.RequiredBy(pkg) fmt.Printf("pkg %s uses (%d):\n %s\nand is used by (%d):\n %s\n", pkg, len(pkgReq), strings.Join(pkgReq, " "), len(pkgReqBy), strings.Join(pkgReqBy, " ")) }
func commandVtTabletRollback(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { connectTimeout := subFlags.Duration("connect_timeout", 30*time.Second, "Connection timeout for vttablet client") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 2 { return fmt.Errorf("the <tablet_alias> and <transaction_id> arguments are required for the VtTabletRollback command") } transactionID, err := strconv.ParseInt(subFlags.Arg(1), 10, 64) if err != nil { return err } tabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0)) if err != nil { return err } tabletInfo, err := wr.TopoServer().GetTablet(ctx, tabletAlias) if err != nil { return err } conn, err := tabletconn.GetDialer()(tabletInfo.Tablet, *connectTimeout) if err != nil { return fmt.Errorf("cannot connect to tablet %v: %v", tabletAlias, err) } defer conn.Close(ctx) return conn.Rollback(ctx, &querypb.Target{ Keyspace: tabletInfo.Tablet.Keyspace, Shard: tabletInfo.Tablet.Shard, TabletType: tabletInfo.Tablet.Type, }, transactionID) }
// newCommandUnsub creates and returns an unsub command. func newCommandUnsub(args []string, cli *client.Client) (command, error) { // Create a flag set. var flg flag.FlagSet // Define the flags. topicFilter := flg.String("t", "", "Topic Filter") // Parse the flag. if err := flg.Parse(args); err != nil { return nil, errCmdArgsParse } // Create an unsub command. cmd := &commandUnsub{ cli: cli, unsubscribeOpts: &client.UnsubscribeOptions{ TopicFilters: [][]byte{ []byte(*topicFilter), }, }, } // Return the command. return cmd, nil }
// Create an ephemeral node an just wait. func cmdElock(subFlags *flag.FlagSet, args []string) error { subFlags.Parse(args) zkPath := fixZkPath(subFlags.Arg(0)) // Speed up case where we die nicely, otherwise you have to wait for // the server to notice the client's demise. sigRecv := make(chan os.Signal, 1) signal.Notify(sigRecv, os.Interrupt) for { _, err := zconn.Create(zkPath, "", zookeeper.EPHEMERAL, zookeeper.WorldACL(zookeeper.PERM_ALL)) if err != nil { return fmt.Errorf("elock: error %v: %v", zkPath, err) } watchLoop: for { _, _, watch, err := zconn.GetW(zkPath) if err != nil { return fmt.Errorf("elock: error %v: %v", zkPath, err) } select { case <-sigRecv: zconn.Delete(zkPath, -1) return nil case event := <-watch: log.Infof("elock: event %v: %v", zkPath, event) if !event.Ok() { //return fmt.Errorf("elock: error %v: %v", zkPath, event) break watchLoop } } } } }
func commandVtGateExecuteShards(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { server := subFlags.String("server", "", "VtGate server to connect to") bindVariables := newBindvars(subFlags) connectTimeout := subFlags.Duration("connect_timeout", 30*time.Second, "Connection timeout for vtgate client") tabletType := subFlags.String("tablet_type", "master", "tablet type to query") keyspace := subFlags.String("keyspace", "", "keyspace to send query to") shardsStr := subFlags.String("shards", "", "comma-separated list of shards to send query to") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("the <sql> argument is required for the VtGateExecuteShards command") } t, err := parseTabletType(*tabletType, []pb.TabletType{pb.TabletType_MASTER, pb.TabletType_REPLICA, pb.TabletType_RDONLY}) if err != nil { return err } var shards []string if *shardsStr != "" { shards = strings.Split(*shardsStr, ",") } vtgateConn, err := vtgateconn.Dial(ctx, *server, *connectTimeout) if err != nil { return fmt.Errorf("error connecting to vtgate '%v': %v", *server, err) } defer vtgateConn.Close() qr, err := vtgateConn.ExecuteShards(ctx, subFlags.Arg(0), *keyspace, shards, *bindVariables, t) if err != nil { return fmt.Errorf("Execute failed: %v", err) } return printJSON(wr, qr) }
func commandListBackups(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("action ListBackups requires <keyspace/shard>") } keyspace, shard, err := topoproto.ParseKeyspaceShard(subFlags.Arg(0)) if err != nil { return err } bucket := fmt.Sprintf("%v/%v", keyspace, shard) bs, err := backupstorage.GetBackupStorage() if err != nil { return err } defer bs.Close() bhs, err := bs.ListBackups(bucket) if err != nil { return err } for _, bh := range bhs { wr.Logger().Printf("%v\n", bh.Name()) } return nil }
func commandRestoreFromBackup(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("The RestoreFromBackup command requires the <tablet alias> argument.") } tabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0)) if err != nil { return err } tabletInfo, err := wr.TopoServer().GetTablet(ctx, tabletAlias) if err != nil { return err } stream, err := wr.TabletManagerClient().RestoreFromBackup(ctx, tabletInfo.Tablet) if err != nil { return err } for { e, err := stream.Recv() switch err { case nil: logutil.LogEvent(wr.Logger(), e) case io.EOF: return nil default: return err } } }
// ParamsParser implements a command line parameters parser that takes a string // and returns a Parameters structure in an interface. It will display the module // help if the arguments string spell the work 'help' func (r *run) ParamsParser(args []string) (interface{}, error) { var ( err error lm, nm, li, ni, ci, lp flagParam fs flag.FlagSet ) if len(args) < 1 || args[0] == "" || args[0] == "help" { fmt.Println(cmd_help) return nil, fmt.Errorf("help printed") } fs.Init("file", flag.ContinueOnError) fs.Var(&lm, "lm", "see help") fs.Var(&nm, "nm", "see help") fs.Var(&li, "li", "see help") fs.Var(&ni, "ni", "see help") fs.Var(&ci, "ci", "see help") fs.Var(&lp, "lp", "see help") err = fs.Parse(args) if err != nil { return nil, err } var p params p.LocalMAC = lm p.NeighborMAC = nm p.LocalIP = li p.NeighborIP = ni p.ConnectedIP = ci p.ListeningPort = lp r.Parameters = p return p, r.ValidateParameters() }
// Setup the parameters with the command line flags in args. func (pool *Pool) Setup(fs *flag.FlagSet, args []string) error { fs.IntVar(&pool.Capacity, "capacity", pool.Capacity, "max parallel sandboxes") fs.StringVar(&pool.UmlPath, "uml", pool.UmlPath, "path to the UML executable") fs.StringVar(&pool.EnvDir, "envdir", pool.EnvDir, "environments directory") fs.StringVar(&pool.TasksDir, "tasksdir", pool.TasksDir, "tasks directory") return fs.Parse(args) }
func doInitialize(fs *flag.FlagSet, argv []string) error { var ( conffile = fs.String("conf", config.DefaultConfig.Conffile, "Config file path") apikey = fs.String("apikey", "", "API key from mackerel.io web site (Required)") ) fs.Parse(argv) if *apikey == "" { // Setting apikey via environment variable should be supported or not? return fmt.Errorf("-apikey option is required") } _, err := os.Stat(*conffile) confExists := err == nil if confExists { conf, err := config.LoadConfig(*conffile) if err != nil { return fmt.Errorf("Failed to load the config file: %s", err) } if conf.Apikey != "" { return apikeyAlreadySetError(*conffile) } } contents := []byte(fmt.Sprintf("apikey = %q\n", *apikey)) if confExists { cBytes, err := ioutil.ReadFile(*conffile) if err != nil { return err } contents = append(contents, cBytes...) } return ioutil.WriteFile(*conffile, contents, 0644) }
// Setup the parameters with the command line flags in args. func (job *Job) Setup(fs *flag.FlagSet, args []string) error { taskfile := fs.String("task", "", "path to the task description (mandatory)") inputfile := fs.String("input", "", "path to the input file (mandatory)") fs.StringVar(&job.UmlPath, "uml", job.UmlPath, "path to the UML executable") fs.StringVar(&job.EnvDir, "envdir", job.EnvDir, "environments directory") fs.StringVar(&job.TasksDir, "tasksdir", job.TasksDir, "tasks directory") if err := fs.Parse(args); err != nil { return err } if len(*taskfile) == 0 || len(*inputfile) == 0 { return errors.New("Missing task or input file") } taskcontent, err := ioutil.ReadFile(*taskfile) if err != nil { return err } if json.Unmarshal(taskcontent, &job.Task) != nil { return err } inputcontent, err := ioutil.ReadFile(*inputfile) if err != nil { return err } job.Input = string(inputcontent) return nil }
// RunCommand detects the project root, parses flags and runs the Command. func RunCommand(fs *flag.FlagSet, cmd *Command, projectroot, goroot string, args []string) error { if cmd.AddFlags != nil { cmd.AddFlags(fs) } if err := fs.Parse(args); err != nil { fs.Usage() os.Exit(1) } args = fs.Args() // reset to the remaining arguments if projectroot == "" { return fmt.Errorf("project root is blank") } root, err := FindProjectroot(projectroot) if err != nil { return fmt.Errorf("could not locate project root: %v", err) } project := gb.NewProject(root) gb.Debugf("project root %q", project.Projectdir()) ctx, err := project.NewContext( gb.GcToolchain(), ) if err != nil { return fmt.Errorf("unable to construct context: %v", err) } gb.Debugf("args: %v", args) return cmd.Run(ctx, args) }
func ParseServiceFlags(scfg *ServiceConfig, flagset *flag.FlagSet, argv []string) (config *ServiceConfig, args []string) { rpcAddr := flagset.String("l", GetDefaultBindAddr(), "host:port to listen on for RPC") adminAddr := flagset.String("admin", GetDefaultBindAddr(), "host:port to listen on for admin") err := flagset.Parse(argv) args = flagset.Args() if err == flag.ErrHelp { // -help was given, pass it on to caller who // may decide to quit instead of continuing args = append(args, "-help") } rpcBA, err := BindAddrFromString(*rpcAddr) if err != nil { panic(err) } adminBA, err := BindAddrFromString(*adminAddr) if err != nil { panic(err) } scfg.ServiceAddr = rpcBA scfg.AdminAddr = adminBA return scfg, args }
func commandVtGateExecute(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { server := subFlags.String("server", "", "VtGate server to connect to") bindVariables := newBindvars(subFlags) connectTimeout := subFlags.Duration("connect_timeout", 30*time.Second, "Connection timeout for vtgate client") tabletType := subFlags.String("tablet_type", "master", "tablet type to query") json := subFlags.Bool("json", false, "Output JSON instead of human-readable table") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("the <sql> argument is required for the VtGateExecute command") } t, err := parseTabletType(*tabletType, []topodatapb.TabletType{topodatapb.TabletType_MASTER, topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY}) if err != nil { return err } vtgateConn, err := vtgateconn.Dial(ctx, *server, *connectTimeout) if err != nil { return fmt.Errorf("error connecting to vtgate '%v': %v", *server, err) } defer vtgateConn.Close() qr, err := vtgateConn.Execute(ctx, subFlags.Arg(0), *bindVariables, t) if err != nil { return fmt.Errorf("Execute failed: %v", err) } if *json { return printJSON(wr.Logger(), qr) } printQueryResult(loggerWriter{wr.Logger()}, qr) return nil }
// ParamsParser implements a command line parameter parser for the ping module func (r *run) ParamsParser(args []string) (interface{}, error) { var ( err error pa params d, p string dp, c, t float64 fs flag.FlagSet ) if len(args) < 1 || args[0] == "" || args[0] == "help" { printHelp(true) return nil, fmt.Errorf("help printed") } fs.Init("ping", flag.ContinueOnError) fs.StringVar(&d, "d", "www.google.com", "see help") fs.Float64Var(&dp, "dp", -1, "see help") fs.StringVar(&p, "p", "icmp", "see help") fs.Float64Var(&c, "c", 3, "see help") fs.Float64Var(&t, "t", 5, "see help") err = fs.Parse(args) if err != nil { return nil, err } pa.Destination = d pa.DestinationPort = dp pa.Protocol = p pa.Count = c pa.Timeout = t r.Parameters = pa return pa, r.ValidateParameters() }
// newCommandSub creates and returns a sub command. func newCommandSub(args []string, cli *client.Client) (command, error) { // Create a flag set. var flg flag.FlagSet // Define the flags. topicFilter := flg.String("t", "", "Topic Filter") qos := flg.Uint("q", uint(mqtt.QoS0), "QoS") // Parse the flag. if err := flg.Parse(args); err != nil { return nil, errCmdArgsParse } // Create a sub command. cmd := &commandSub{ cli: cli, subscribeOpts: &client.SubscribeOptions{ SubReqs: []*client.SubReq{ &client.SubReq{ TopicFilter: []byte(*topicFilter), QoS: byte(*qos), Handler: messageHandler, }, }, }, } // Return the command. return cmd, nil }
func (r *run) ParamsParser(args []string) (interface{}, error) { var ( err error drift string fs flag.FlagSet ) if len(args) >= 1 && args[0] == "help" { printHelp(true) return nil, fmt.Errorf("help printed") } if len(args) == 0 { return r.Parameters, nil } fs.Init("time", flag.ContinueOnError) fs.StringVar(&drift, "drift", "", "see help") err = fs.Parse(args) if err != nil { return nil, err } _, err = time.ParseDuration(drift) if err != nil { return nil, fmt.Errorf("invalid drift duration. try help.") } r.Parameters.Drift = drift return r.Parameters, r.ValidateParameters() }
func NewContext(cmdName string, args []string) *cli.Context { targetCommand := findCommand(cmdName) flagSet := new(flag.FlagSet) for i, _ := range targetCommand.Flags { targetCommand.Flags[i].Apply(flagSet) } // move all flag args to the beginning of the list, go requires them all upfront firstFlagIndex := -1 for index, arg := range args { if strings.HasPrefix(arg, "-") { firstFlagIndex = index break } } if firstFlagIndex > 0 { args := args[0:firstFlagIndex] flags := args[firstFlagIndex:] flagSet.Parse(append(flags, args...)) } else { flagSet.Parse(args[0:]) } globalSet := new(flag.FlagSet) return cli.NewContext(cli.NewApp(), flagSet, globalSet) }
func commandVtGateSplitQuery(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { server := subFlags.String("server", "", "VtGate server to connect to") bindVariables := newBindvars(subFlags) connectTimeout := subFlags.Duration("connect_timeout", 30*time.Second, "Connection timeout for vtgate client") splitColumn := subFlags.String("split_column", "", "force the use of this column to split the query") splitCount := subFlags.Int("split_count", 16, "number of splits to generate") keyspace := subFlags.String("keyspace", "", "keyspace to send query to") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("the <sql> argument is required for the VtGateSplitQuery command") } vtgateConn, err := vtgateconn.Dial(ctx, *server, *connectTimeout, "") if err != nil { return fmt.Errorf("error connecting to vtgate '%v': %v", *server, err) } defer vtgateConn.Close() r, err := vtgateConn.SplitQuery(ctx, *keyspace, subFlags.Arg(0), *bindVariables, *splitColumn, int64(*splitCount)) if err != nil { return fmt.Errorf("SplitQuery failed: %v", err) } return printJSON(wr.Logger(), r) }
func (a *app) parseArgs(fs *flag.FlagSet, args []string) error { fs.SetOutput(a.out) fs.Usage = func() { fmt.Fprintf(a.out, help, args[0], args[0]) fs.PrintDefaults() } fs.Var(&a.typeNames, "type", "A generated proto.Message type to generate stubs for (required, repeatable)") fs.StringVar(&a.outFile, "out", "proto_gae.gen.go", "The name of the output file") fs.StringVar(&a.header, "header", copyright, "Header text to put at the top of "+ "the generated file. Defaults to the Chromium Authors copyright.") if err := fs.Parse(args[1:]); err != nil { return err } fail := errors.MultiError(nil) if a.typeNames.Data == nil || a.typeNames.Data.Len() == 0 { fail = append(fail, errors.New("must specify one or more -type")) } if !strings.HasSuffix(a.outFile, ".go") { fail = append(fail, errors.New("-output must end with '.go'")) } if len(fail) > 0 { for _, e := range fail { fmt.Fprintln(a.out, "error:", e) } fmt.Fprintln(a.out) fs.Usage() return fail } return nil }
func (r *run) ParamsParser(args []string) (interface{}, error) { var ( fs flag.FlagSet pkgMatch flagParam verMatch string ) if len(args) < 1 || args[0] == "" || args[0] == "help" { printHelp(true) return nil, nil } fs.Init("pkg", flag.ContinueOnError) fs.Var(&pkgMatch, "name", "see help") fs.StringVar(&verMatch, "version", "", "see help") err := fs.Parse(args) if err != nil { return nil, err } p := newParameters() p.PkgMatch.Matches = pkgMatch if verMatch != "" { p.VerMatch = verMatch } r.Parameters = *p return r.Parameters, r.ValidateParameters() }
func positionCmd(subFlags *flag.FlagSet, args []string) error { subFlags.Parse(args) if len(args) < 3 { return fmt.Errorf("Not enough arguments for position operation.") } pos1, err := replication.DecodePosition(args[1]) if err != nil { return err } switch args[0] { case "equal": pos2, err := replication.DecodePosition(args[2]) if err != nil { return err } fmt.Println(pos1.Equal(pos2)) case "at_least": pos2, err := replication.DecodePosition(args[2]) if err != nil { return err } fmt.Println(pos1.AtLeast(pos2)) case "append": gtid, err := replication.DecodeGTID(args[2]) if err != nil { return err } fmt.Println(replication.AppendGTID(pos1, gtid)) } return nil }
func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", 30*time.Second, "time to wait for slaves to catch up in reparenting") keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented") newMaster := subFlags.String("new_master", "", "alias of a tablet that should be the new master") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() == 2 { // Legacy syntax: "<keyspace/shard> <tablet alias>". if *newMaster != "" { return fmt.Errorf("cannot use legacy syntax and flag -new_master for action EmergencyReparentShard at the same time") } *keyspaceShard = subFlags.Arg(0) *newMaster = subFlags.Arg(1) } else if subFlags.NArg() != 0 { return fmt.Errorf("action EmergencyReparentShard requires -keyspace_shard=<keyspace/shard> -new_master=<tablet alias>") } keyspace, shard, err := topoproto.ParseKeyspaceShard(*keyspaceShard) if err != nil { return err } tabletAlias, err := topoproto.ParseTabletAlias(*newMaster) if err != nil { return err } return wr.EmergencyReparentShard(ctx, keyspace, shard, tabletAlias, *waitSlaveTimeout) }
func commandVtGateExecute(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { server := subFlags.String("server", "", "VtGate server to connect to") bindVariables := newBindvars(subFlags) connectTimeout := subFlags.Duration("connect_timeout", 30*time.Second, "Connection timeout for vtgate client") tabletType := subFlags.String("tablet_type", "master", "tablet type to query") if err := subFlags.Parse(args); err != nil { return err } if subFlags.NArg() != 1 { return fmt.Errorf("the <sql> argument is required for the VtGateExecute command") } t, err := parseTabletType(*tabletType, []topo.TabletType{topo.TYPE_MASTER, topo.TYPE_REPLICA, topo.TYPE_RDONLY}) if err != nil { return err } vtgateConn, err := vtgateconn.Dial(ctx, *server, *connectTimeout) if err != nil { return fmt.Errorf("error connecting to vtgate '%v': %v", *server, err) } defer vtgateConn.Close() qr, err := vtgateConn.Execute(ctx, subFlags.Arg(0), *bindVariables, t) if err != nil { return fmt.Errorf("Execute failed: %v", err) } wr.Logger().Printf("%v\n", jscfg.ToJSON(qr)) return nil }
func multisnapshotCmd(mysqld *mysqlctl.Mysqld, subFlags *flag.FlagSet, args []string) { concurrency := subFlags.Int("concurrency", 8, "how many compression jobs to run simultaneously") spec := subFlags.String("spec", "-", "shard specification") tablesString := subFlags.String("tables", "", "dump only this comma separated list of tables") skipSlaveRestart := subFlags.Bool("skip-slave-restart", false, "after the snapshot is done, do not restart slave replication") maximumFilesize := subFlags.Uint64("maximum-file-size", 128*1024*1024, "the maximum size for an uncompressed data file") subFlags.Parse(args) if subFlags.NArg() != 2 { relog.Fatal("action multisnapshot requires <db name> <key name>") } shards, err := key.ParseShardingSpec(*spec) if err != nil { relog.Fatal("multisnapshot failed: %v", err) } var tables []string if *tablesString != "" { tables = strings.Split(*tablesString, ",") } filenames, err := mysqld.CreateMultiSnapshot(shards, subFlags.Arg(0), subFlags.Arg(1), tabletAddr, false, *concurrency, tables, *skipSlaveRestart, *maximumFilesize, nil) if err != nil { relog.Fatal("multisnapshot failed: %v", err) } else { relog.Info("manifest locations: %v", filenames) } }
// newCommandPub creates and returns a pub command. func newCommandPub(args []string, cli *client.Client) (command, error) { // Create a flag set. var flg flag.FlagSet // Define the flags. qos := flg.Uint("q", uint(mqtt.QoS0), "QoS") retain := flg.Bool("r", false, "Retain") topicName := flg.String("t", "", "Topic Name") message := flg.String("m", "", "Application Message") // Parse the flag. if err := flg.Parse(args); err != nil { return nil, errCmdArgsParse } // Create a pub command. cmd := &commandPub{ cli: cli, publishOpts: &client.PublishOptions{ QoS: byte(*qos), Retain: *retain, TopicName: []byte(*topicName), Message: []byte(*message), }, } // Return the command. return cmd, nil }
func commandVerticalSplitClone(wi *Instance, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) (Worker, error) { tables := subFlags.String("tables", "", "comma separated list of tables to replicate (used for vertical split)") strategy := subFlags.String("strategy", "", "which strategy to use for restore, use 'mysqlctl multirestore -strategy=-help' for more info") sourceReaderCount := subFlags.Int("source_reader_count", defaultSourceReaderCount, "number of concurrent streaming queries to use on the source") destinationPackCount := subFlags.Int("destination_pack_count", defaultDestinationPackCount, "number of packets to pack in one destination insert") minTableSizeForSplit := subFlags.Int("min_table_size_for_split", defaultMinTableSizeForSplit, "tables bigger than this size on disk in bytes will be split into source_reader_count chunks if possible") destinationWriterCount := subFlags.Int("destination_writer_count", defaultDestinationWriterCount, "number of concurrent RPCs to execute on the destination") if err := subFlags.Parse(args); err != nil { return nil, err } if subFlags.NArg() != 1 { subFlags.Usage() return nil, fmt.Errorf("command VerticalSplitClone requires <destination keyspace/shard>") } keyspace, shard, err := topo.ParseKeyspaceShardString(subFlags.Arg(0)) if err != nil { return nil, err } var tableArray []string if *tables != "" { tableArray = strings.Split(*tables, ",") } worker, err := NewVerticalSplitCloneWorker(wr, wi.cell, keyspace, shard, tableArray, *strategy, *sourceReaderCount, *destinationPackCount, uint64(*minTableSizeForSplit), *destinationWriterCount) if err != nil { return nil, fmt.Errorf("cannot create worker: %v", err) } return worker, nil }
func getCmd(flagset *flag.FlagSet) { flagset.Usage = func() { fmt.Fprintf(os.Stderr, "usage: %s get [args...] key\n", os.Args[0]) flagset.PrintDefaults() } flagset.StringVar(&secretKeyring, "secret-keyring", DefaultConfig.SecretKeyring, "path to armored secret keyring") flagset.Parse(os.Args[2:]) key := flagset.Arg(0) if key == "" { flagset.Usage() os.Exit(1) } backendStore, err := getBackendStore(backendName, endpoint) if err != nil { log.Fatal(err) } log.Printf("Looking at consul node %q\n", nodeKey(key)) if plaintext { value, err := getPlain(nodeKey(key), backendStore) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", value) return } value, err := getEncrypted(nodeKey(key), secretKeyring, backendStore) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", value) }