diff --git a/alias.go b/alias.go new file mode 100644 index 0000000..3afb04b --- /dev/null +++ b/alias.go @@ -0,0 +1,166 @@ +package main + +import ( + "context" + "flag" + "fmt" + "os" + "strings" +) + +func handleAliasCommand() { + if len(os.Args) < 3 { + fmt.Fprintf(os.Stderr, "%s alias: subcommand missing\n", os.Args[0]) + printAliasUsage() + os.Exit(1) + } + + subcmd := strings.ToLower(os.Args[2]) + switch subcmd { + case "list": + listcmd := flag.NewFlagSet("alias list", flag.ExitOnError) + listcmd.SetOutput(os.Stdout) + cfgpath := listcmd.String("config", "", "path to configuration") + aname := listcmd.String("name", "", "filter list to named alias") + listcmd.Parse(os.Args[3:]) + + cfg := LoadConfig(*cfgpath) + es := ClientFromConfig(cfg.Elastic) + + aliases, err := es.CatAliases().Do(context.Background()) + if err != nil { + fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error()) + os.Exit(1) + } + + for _, alias := range aliases { + if *aname != "" { + if alias.Alias == *aname { + fmt.Printf("%s\n", alias.Index) + } + } else { + fmt.Printf("%s %s\n", alias.Alias, alias.Index) + } + } + + case "create": + createcmd := flag.NewFlagSet("alias create", flag.ExitOnError) + createcmd.SetOutput(os.Stdout) + cfgpath := createcmd.String("config", "", "path to configuration") + aname := createcmd.String("name", "", "(required) name of alias") + iname := createcmd.String("index", "", "(required) name of index") + createcmd.Parse(os.Args[3:]) + + if *aname == "" { + fmt.Fprintf(os.Stderr, "name parameter is required for alias create\n") + createcmd.PrintDefaults() + os.Exit(1) + } + + if *iname == "" { + fmt.Fprintf(os.Stderr, "index parameter is required for alias create\n") + createcmd.PrintDefaults() + os.Exit(1) + } + + cfg := LoadConfig(*cfgpath) + es := ClientFromConfig(cfg.Elastic) + + _, err := es.Alias().Add(*iname, *aname).Do(context.Background()) + if err != nil { + fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error()) + os.Exit(1) + } + + case "delete": + deletecmd := flag.NewFlagSet("alias delete", flag.ExitOnError) + deletecmd.SetOutput(os.Stdout) + cfgpath := deletecmd.String("config", "", "path to configuration") + aname := deletecmd.String("name", "", "(required) name of alias") + iname := deletecmd.String("index", "", "(required) name of index") + deletecmd.Parse(os.Args[3:]) + + if *aname == "" { + fmt.Fprintf(os.Stderr, "name parameter is required for alias delete\n") + deletecmd.PrintDefaults() + os.Exit(1) + } + + if *iname == "" { + fmt.Fprintf(os.Stderr, "index parameter is required for alias delete\n") + deletecmd.PrintDefaults() + os.Exit(1) + } + + cfg := LoadConfig(*cfgpath) + es := ClientFromConfig(cfg.Elastic) + + _, err := es.Alias().Remove(*iname, *aname).Do(context.Background()) + if err != nil { + fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error()) + os.Exit(1) + } + + case "replace": + replacecmd := flag.NewFlagSet("alias replace", flag.ExitOnError) + replacecmd.SetOutput(os.Stdout) + cfgpath := replacecmd.String("config", "", "path to configuration") + aname := replacecmd.String("name", "", "(required) name of alias") + oiname := replacecmd.String("oldindex", "", + "(required) name of the old index") + niname := replacecmd.String("newindex", "", + "(required) name of the new index") + replacecmd.Parse(os.Args[3:]) + + if *aname == "" { + fmt.Fprintf(os.Stderr, "name parameter is required for alias replace\n") + replacecmd.PrintDefaults() + os.Exit(1) + } + if *oiname == "" { + fmt.Fprintf(os.Stderr, + "oldindex parameter is required for alias replace\n") + replacecmd.PrintDefaults() + os.Exit(1) + } + if *niname == "" { + fmt.Fprintf(os.Stderr, + "newindex parameter is required for alias replace\n") + replacecmd.PrintDefaults() + os.Exit(1) + } + + cfg := LoadConfig(*cfgpath) + es := ClientFromConfig(cfg.Elastic) + + _, err := es.Alias(). + Remove(*oiname, *aname). + Add(*niname, *aname). + Do(context.Background()) + if err != nil { + fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error()) + os.Exit(1) + } + + case "--help": + printAliasUsage() + os.Exit(0) + + default: + fmt.Fprintf(os.Stderr, "%s: alias '%s' is not a recognized subcommand\n", + os.Args[0], os.Args[2]) + printAliasUsage() + os.Exit(1) + } +} + +func printAliasUsage() { + fmt.Printf("Usage: %s alias ... \n", os.Args[0]) + fmt.Printf("See '%s alias --help' for information", os.Args[0]) + fmt.Printf(" on a specific command\n") + fmt.Printf("valid subcommands:\n") + fmt.Printf(" list list aliases\n") + fmt.Printf(" create create alias\n") + fmt.Printf(" delete delete alias\n") + fmt.Printf(" replace replace alias (single step add/remove)\n") +} diff --git a/index.go b/index.go index 8077803..44ef725 100644 --- a/index.go +++ b/index.go @@ -132,7 +132,7 @@ func handleIndexCommand() { default: fmt.Fprintf(os.Stderr, "%s: index '%s' is not a recognized subcommand\n", os.Args[0], os.Args[2]) - printDefaultUsage() + printIndexUsage() os.Exit(1) } } diff --git a/main.go b/main.go index 7de7d4c..016a297 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,9 @@ func main() { case "index": handleIndexCommand() + case "alias": + handleAliasCommand() + case "--help": printDefaultUsage() os.Exit(0) @@ -39,4 +42,5 @@ func printDefaultUsage() { fmt.Printf(" on a specific command\n") fmt.Printf("valid commands:\n") fmt.Printf(" index create, delete, refresh, or list indexes\n") + fmt.Printf(" alias create, delete, replace, or list aliases\n") }