package main import ( "fmt" "os" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/util/qcloud" "yunion.io/x/onecloud/pkg/util/shellutils" "yunion.io/x/structarg" _ "yunion.io/x/onecloud/pkg/util/qcloud/shell" ) type BaseOptions struct { Help bool `help:"Show help"` AppID string `help:"AppID" default:"$QCLOUD_APPID"` SecretID string `help:"Secret" default:"$QCLOUD_SECRET_ID"` SecretKey string `help:"Access key" default:"$QCLOUD_SECRET_KEY"` RegionId string `help:"RegionId" default:"$QCLOUD_REGION"` SUBCOMMAND string `help:"azurecli subcommand" subcommand:"true"` } func getSubcommandParser() (*structarg.ArgumentParser, error) { parse, e := structarg.NewArgumentParser(&BaseOptions{}, "qcloudcli", "Command-line interface to tencentcloud API.", `See "tencentcli help COMMAND" for help on a specific command.`) if e != nil { return nil, e } subcmd := parse.GetSubcommand() if subcmd == nil { return nil, fmt.Errorf("No subcommand argument.") } type HelpOptions struct { SUBCOMMAND string `help:"sub-command name"` } shellutils.R(&HelpOptions{}, "help", "Show help of a subcommand", func(args *HelpOptions) error { helpstr, e := subcmd.SubHelpString(args.SUBCOMMAND) if e != nil { return e } else { fmt.Print(helpstr) return nil } }) for _, v := range shellutils.CommandTable { _, e := subcmd.AddSubParser(v.Options, v.Command, v.Desc, v.Callback) if e != nil { return nil, e } } return parse, nil } func showErrorAndExit(e error) { log.Errorf("%s", e) os.Exit(1) } func newClient(options *BaseOptions) (*qcloud.SRegion, error) { if len(options.SecretKey) == 0 { return nil, fmt.Errorf("Missing SecretKey") } if len(options.SecretID) == 0 { return nil, fmt.Errorf("Missing SecretID") } account := options.SecretID if len(options.AppID) > 0 { account = fmt.Sprintf("%s/%s", account, options.AppID) } if cli, err := qcloud.NewQcloudClient("", "", account, options.SecretKey); err != nil { return nil, err } else if region := cli.GetRegion(options.RegionId); region == nil { return nil, fmt.Errorf("No such region %s", options.RegionId) } else { return region, nil } } func main() { parser, e := getSubcommandParser() if e != nil { showErrorAndExit(e) } e = parser.ParseArgs(os.Args[1:], false) options := parser.Options().(*BaseOptions) if options.Help { fmt.Print(parser.HelpString()) } else { subcmd := parser.GetSubcommand() subparser := subcmd.GetSubParser() if e != nil { if subparser != nil { fmt.Print(subparser.Usage()) } else { fmt.Print(parser.Usage()) } showErrorAndExit(e) } else { suboptions := subparser.Options() if options.SUBCOMMAND == "help" { e = subcmd.Invoke(suboptions) } else { var region *qcloud.SRegion if len(options.RegionId) == 0 { options.RegionId = qcloud.QCLOUD_DEFAULT_REGION } region, e = newClient(options) if e != nil { showErrorAndExit(e) } e = subcmd.Invoke(region, suboptions) } if e != nil { showErrorAndExit(e) } } } }