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.

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