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.

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