a command line interface for elastic (work in progress)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
4.8 KiB

  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "strings"
  8. )
  9. func handleAliasCommand() {
  10. if len(os.Args) < 3 {
  11. fmt.Fprintf(os.Stderr, "%s alias: subcommand missing\n", os.Args[0])
  12. printAliasUsage()
  13. os.Exit(1)
  14. }
  15. subcmd := strings.ToLower(os.Args[2])
  16. switch subcmd {
  17. case "list", "ls", "l":
  18. cmd := flag.NewFlagSet("alias list", flag.ExitOnError)
  19. cmd.SetOutput(os.Stdout)
  20. cfgpath := cmd.String("config", "", "path to configuration")
  21. server := cmd.String("server", "", "server name to use")
  22. aname := cmd.String("name", "", "filter list to named alias")
  23. cmd.Parse(os.Args[3:])
  24. cfg := LoadConfig(*cfgpath)
  25. es := cfg.GetClient(*server)
  26. aliases, err := es.CatAliases().Do(context.Background())
  27. if err != nil {
  28. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  29. os.Exit(1)
  30. }
  31. for _, alias := range aliases {
  32. if *aname != "" {
  33. if alias.Alias == *aname {
  34. fmt.Printf("%s\n", alias.Index)
  35. }
  36. } else {
  37. fmt.Printf("%s %s\n", alias.Alias, alias.Index)
  38. }
  39. }
  40. case "add":
  41. cmd := flag.NewFlagSet("alias add", flag.ExitOnError)
  42. cmd.SetOutput(os.Stdout)
  43. cmd.Usage = func() {
  44. fmt.Printf("Usage: %s alias %s [args] <alias> <index>...\n",
  45. os.Args[0], subcmd)
  46. cmd.PrintDefaults()
  47. }
  48. cfgpath := cmd.String("config", "", "path to configuration")
  49. server := cmd.String("server", "", "server name to use")
  50. cmd.Parse(os.Args[3:])
  51. if len(cmd.Args()) < 2 {
  52. fmt.Fprintf(os.Stderr, "alias and index required for alias add\n")
  53. cmd.Usage()
  54. os.Exit(1)
  55. }
  56. aname := cmd.Arg(0)
  57. indexes := cmd.Args()[1:]
  58. cfg := LoadConfig(*cfgpath)
  59. es := cfg.GetClient(*server)
  60. alias := es.Alias()
  61. for _, index := range indexes {
  62. alias.Add(index, aname)
  63. }
  64. _, err := alias.Do(context.Background())
  65. if err != nil {
  66. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  67. os.Exit(1)
  68. }
  69. case "del":
  70. fallthrough
  71. case "delete":
  72. cmd := flag.NewFlagSet("alias delete", flag.ExitOnError)
  73. cmd.SetOutput(os.Stdout)
  74. cmd.Usage = func() {
  75. fmt.Printf("Usage: %s alias %s [args] <alias> <index>...\n",
  76. os.Args[0], subcmd)
  77. cmd.PrintDefaults()
  78. }
  79. cfgpath := cmd.String("config", "", "path to configuration")
  80. server := cmd.String("server", "", "server name to use")
  81. cmd.Parse(os.Args[3:])
  82. if len(cmd.Args()) < 2 {
  83. fmt.Fprintf(os.Stderr, "alias and index required for alias delete\n")
  84. cmd.Usage()
  85. os.Exit(1)
  86. }
  87. aname := cmd.Arg(0)
  88. indexes := cmd.Args()[1:]
  89. cfg := LoadConfig(*cfgpath)
  90. es := cfg.GetClient(*server)
  91. alias := es.Alias()
  92. for _, index := range indexes {
  93. alias.Remove(index, aname)
  94. }
  95. _, err := alias.Do(context.Background())
  96. if err != nil {
  97. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  98. os.Exit(1)
  99. }
  100. case "replace":
  101. cmd := flag.NewFlagSet("alias replace", flag.ExitOnError)
  102. cmd.SetOutput(os.Stdout)
  103. cfgpath := cmd.String("config", "", "path to configuration")
  104. server := cmd.String("server", "", "server name to use")
  105. aname := cmd.String("name", "", "(required) name of alias")
  106. oiname := cmd.String("oldindex", "", "name of the old index")
  107. niname := cmd.String("newindex", "",
  108. "(required) name of the new index")
  109. cmd.Parse(os.Args[3:])
  110. if *aname == "" {
  111. fmt.Fprintf(os.Stderr, "name parameter is required for alias replace\n")
  112. cmd.PrintDefaults()
  113. os.Exit(1)
  114. }
  115. if *niname == "" {
  116. fmt.Fprintf(os.Stderr,
  117. "newindex parameter is required for alias replace\n")
  118. cmd.PrintDefaults()
  119. os.Exit(1)
  120. }
  121. cfg := LoadConfig(*cfgpath)
  122. es := cfg.GetClient(*server)
  123. oinames := make([]string, 0, 10)
  124. if *oiname != "" {
  125. oinames = append(oinames, *oiname)
  126. } else {
  127. aliases, err := es.CatAliases().Do(context.Background())
  128. if err != nil {
  129. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  130. os.Exit(1)
  131. }
  132. for _, alias := range aliases {
  133. if alias.Alias == *aname {
  134. oinames = append(oinames, alias.Index)
  135. }
  136. }
  137. }
  138. as := es.Alias()
  139. for _, idx := range oinames {
  140. as.Remove(idx, *aname)
  141. }
  142. as.Add(*niname, *aname)
  143. _, err := as.Do(context.Background())
  144. if err != nil {
  145. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  146. os.Exit(1)
  147. }
  148. case "--help":
  149. printAliasUsage()
  150. os.Exit(0)
  151. default:
  152. fmt.Fprintf(os.Stderr, "%s: alias '%s' is not a recognized subcommand\n",
  153. os.Args[0], os.Args[2])
  154. printAliasUsage()
  155. os.Exit(1)
  156. }
  157. }
  158. func printAliasUsage() {
  159. fmt.Printf("Usage: %s alias <subcommand> ... \n", os.Args[0])
  160. fmt.Printf("See '%s alias <subcommand> --help' for information", os.Args[0])
  161. fmt.Printf(" on a specific command\n")
  162. fmt.Printf("valid subcommands:\n")
  163. fmt.Printf(" list list aliases\n")
  164. fmt.Printf(" add add alias\n")
  165. fmt.Printf(" delete delete alias\n")
  166. fmt.Printf(" replace replace alias (single step add/delete)\n")
  167. }