configurecmd.go (171 lines of code) (raw):

package main import ( "fmt" "os" "path/filepath" "strings" "github.com/aliyun/aliyun_assist_client/agent/log" pb "github.com/aliyun/aliyun_assist_client/interprocess/configure/agrpc" "github.com/aliyun/aliyun_assist_client/interprocess/configure/client" "github.com/aliyun/aliyun_assist_client/interprocess/configure/server" "github.com/aliyun/aliyun_assist_client/thirdparty/aliyun-cli/cli" "github.com/aliyun/aliyun_assist_client/thirdparty/aliyun-cli/i18n" ) const ( ConfigureSubCmd = "configure" getSubSubCmd = "get" setSubSubCmd = "set" reloadSubSubCmd = "reload" runtimeFlagName = "runtime" crossVersionFlagName = "cross-version" itemFlagName = "item" ) var ( runtimeFlag = cli.Flag{ Name: runtimeFlagName, Short: i18n.T( `For runtime only.`, `仅对当前运行时生效.`, ), AssignedMode: cli.AssignedNone, Category: "caller", } crossVersionFlag = cli.Flag{ Name: crossVersionFlagName, Short: i18n.T( `Effective across versions.`, `跨版本范围生效.`, ), AssignedMode: cli.AssignedNone, Category: "caller", } itemFlag = cli.Flag{ Name: itemFlagName, Short: i18n.T( `Specify configuration in the key=value format.`, `按照 key=value 的格式指定配置`, ), AssignedMode: cli.AssignedRepeatable, Category: "caller", } configureSubCmd = &cli.Command{ Name: ConfigureSubCmd, Short: i18n.T( "Manage configuration items", "管理配置项", ), EnableUnknownFlag: false, } getConfigSubSubCmd = &cli.Command{ Name: getSubSubCmd, Short: i18n.T( "Get configurations.", "查看配置.", ), Usage: fmt.Sprint(getSubSubCmd, " [flags]"), Sample: getConfigSample(), EnableUnknownFlag: false, Run: getConfig, } setConfigSubSubCmd = &cli.Command{ Name: setSubSubCmd, Short: i18n.T( "Set configurations.", "修改配置.", ), Usage: fmt.Sprint(setSubSubCmd, " [flags]"), Sample: setConfigSample(), EnableUnknownFlag: false, Run: setConfig, } reloadConfigSubSubCmd = &cli.Command{ Name: reloadSubSubCmd, Short: i18n.T( "Reload configurations.", "重新加载配置.", ), Usage: fmt.Sprint(reloadSubSubCmd), EnableUnknownFlag: false, Run: reloadConfig, } ) func init() { getConfigSubSubCmd.Flags().Add(&runtimeFlag) setConfigSubSubCmd.Flags().Add(&runtimeFlag) setConfigSubSubCmd.Flags().Add(&crossVersionFlag) setConfigSubSubCmd.Flags().Add(&itemFlag) configureSubCmd.AddSubCommand(getConfigSubSubCmd) configureSubCmd.AddSubCommand(setConfigSubSubCmd) configureSubCmd.AddSubCommand(reloadConfigSubSubCmd) } func getConfig(ctx *cli.Context, args []string) error { runtime := ctx.Flags().Get(runtimeFlagName).IsAssigned() var err error var items []*pb.ConfItem if runtime { items, err = client.GetConf(runtime) } else { items = server.GetConfLocal(log.GetLogger()) } if err != nil { fmt.Fprintln(os.Stderr, err.Error()) cli.Exit(1) } for _, item := range items { fmt.Printf("%s=%s\n", item.Name, item.Value) } return nil } func setConfig(ctx *cli.Context, args []string) error { runtime := ctx.Flags().Get(runtimeFlagName).IsAssigned() crossVer := ctx.Flags().Get(crossVersionFlagName).IsAssigned() items := ctx.Flags().Get(itemFlagName).GetValues() if runtime && crossVer { fmt.Fprintf(os.Stderr, "`--%s` and `--%s` are in conflict\n", runtimeFlagName, crossVersionFlagName) cli.Exit(1) } var kvList []string for _, item := range items { idx := strings.Index(item, "=") if idx == -1 || idx == len(item)-1 { fmt.Fprintf(os.Stderr, "invalid item `%s`\n", item) cli.Exit(1) } kvList = append(kvList, item[:idx]) kvList = append(kvList, item[idx+1:]) } var err error if runtime { err = client.SetConf(kvList, runtime, crossVer) } else { err = server.SetConfLocal(log.GetLogger(), kvList, crossVer) } if err != nil { fmt.Fprintln(os.Stderr, err.Error()) } cli.Exit(1) return nil } func reloadConfig(ctx *cli.Context, args []string) error { if err := client.ReloadConf(); err != nil { fmt.Fprintln(os.Stderr, err.Error()) cli.Exit(1) } return nil } func getConfigSample() string { s := "" path, _ := os.Executable() _, exeFile := filepath.Split(path) s += fmt.Sprintf("%s %s %s [--%s]", exeFile, ConfigureSubCmd, getSubSubCmd, runtimeFlagName) return s } func setConfigSample() string { s := "" path, _ := os.Executable() _, exeFile := filepath.Split(path) s += fmt.Sprintf("%s %s %s --%s key=value", exeFile, ConfigureSubCmd, setSubSubCmd, itemFlagName) s += fmt.Sprintf("\n %s %s %s --%s --%s key=value", exeFile, ConfigureSubCmd, setSubSubCmd, runtimeFlagName, itemFlagName) s += fmt.Sprintf("\n %s %s %s --%s --%s key=value", exeFile, ConfigureSubCmd, setSubSubCmd, crossVersionFlagName, itemFlagName) return s }