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.

215 lines
5.6 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. elastic "github.com/olivere/elastic/v7"
  9. "encoding/json"
  10. "strings"
  11. )
  12. func handleIndexCommand() {
  13. if len(os.Args) < 3 {
  14. fmt.Fprintf(os.Stderr, "%s index: subcommand missing\n", os.Args[0])
  15. printIndexUsage()
  16. os.Exit(1)
  17. }
  18. subcmd := strings.ToLower(os.Args[2])
  19. switch subcmd {
  20. case "list", "ls", "l":
  21. listcmd := flag.NewFlagSet("index list", flag.ExitOnError)
  22. listcmd.SetOutput(os.Stdout)
  23. cfgpath := listcmd.String("config", "", "path to configuration")
  24. server := listcmd.String("server", "", "server name to use")
  25. listcmd.Parse(os.Args[3:])
  26. cfg := LoadConfig(*cfgpath)
  27. es := cfg.GetClient(*server)
  28. indexes, err := es.IndexNames()
  29. if err != nil {
  30. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  31. os.Exit(1)
  32. }
  33. for _, index := range indexes {
  34. fmt.Printf("%s\n", index)
  35. }
  36. case "search", "sea", "s":
  37. cmd := flag.NewFlagSet("index search", flag.ExitOnError)
  38. cmd.SetOutput(os.Stdout)
  39. cmd.Usage = func() {
  40. fmt.Printf("Usage: %s index %s [args] <index> <search term(s)>\n",
  41. os.Args[0], subcmd)
  42. cmd.PrintDefaults()
  43. }
  44. cfgpath := cmd.String("config", "", "path to configuration")
  45. server := cmd.String("server", "", "server name to use")
  46. fields := cmd.String("fields", "*", "fields to include in search")
  47. defop := cmd.String("defop", "AND", "default search operator")
  48. cmd.Parse(os.Args[3:])
  49. if *defop != "AND" && *defop != "OR" {
  50. fmt.Fprintf(os.Stderr, "default operator must be AND or OR\n")
  51. cmd.Usage()
  52. os.Exit(1)
  53. }
  54. if len(cmd.Args()) < 2 {
  55. fmt.Fprintf(os.Stderr, "index name and query required for index search\n")
  56. cmd.Usage()
  57. os.Exit(1)
  58. }
  59. cfg := LoadConfig(*cfgpath)
  60. es := cfg.GetClient(*server)
  61. res, err := es.Search().Index(cmd.Arg(0)).StoredField(*fields).Query(
  62. elastic.NewQueryStringQuery(cmd.Arg(1)).DefaultOperator(*defop),
  63. ).Do(context.Background())
  64. if err != nil {
  65. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  66. os.Exit(1)
  67. }
  68. for _, r := range res.Hits.Hits {
  69. b, err := json.Marshal(r.Fields)
  70. if err != nil {
  71. fmt.Fprintf(os.Stderr, "marshal error: %s\n", err.Error())
  72. os.Exit(1)
  73. }
  74. fmt.Fprintf(os.Stdout, "%s: %s\n", r.Id, string(b))
  75. }
  76. fmt.Fprintf(os.Stdout, "Total: %d\n", res.Hits.TotalHits.Value);
  77. case "delete", "del", "d":
  78. cmd := flag.NewFlagSet("index delete", flag.ExitOnError)
  79. cmd.SetOutput(os.Stdout)
  80. cmd.Usage = func() {
  81. fmt.Printf("Usage: %s index %s [args] <index>...\n",
  82. os.Args[0], subcmd)
  83. cmd.PrintDefaults()
  84. }
  85. cfgpath := cmd.String("config", "", "path to configuration")
  86. server := cmd.String("server", "", "server name to use")
  87. cmd.Parse(os.Args[3:])
  88. if len(cmd.Args()) < 1 {
  89. fmt.Fprintf(os.Stderr, "index name required for index delete\n")
  90. cmd.Usage()
  91. os.Exit(1)
  92. }
  93. cfg := LoadConfig(*cfgpath)
  94. es := cfg.GetClient(*server)
  95. _, err := es.DeleteIndex(cmd.Args()...).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 "add", "a":
  101. cmd := flag.NewFlagSet("index add", flag.ExitOnError)
  102. cmd.SetOutput(os.Stdout)
  103. cmd.Usage = func() {
  104. fmt.Printf("Usage: %s index %s [args] <index>\n",
  105. os.Args[0], subcmd)
  106. cmd.PrintDefaults()
  107. }
  108. cfgpath := cmd.String("config", "", "path to configuration")
  109. server := cmd.String("server", "", "server name to use")
  110. bodystr := cmd.String("body", "",
  111. "json string to use as body options during add")
  112. bodyfile := cmd.String("bodyfile", "",
  113. "json file to use as body options during add")
  114. cmd.Parse(os.Args[3:])
  115. if len(cmd.Args()) < 1 {
  116. fmt.Fprintf(os.Stderr, "index name required for index add\n")
  117. cmd.PrintDefaults()
  118. os.Exit(1)
  119. }
  120. if *bodystr != "" && *bodyfile != "" {
  121. fmt.Fprintf(os.Stderr,
  122. "body parameter cannot be used with bodyfile parameter\n")
  123. os.Exit(1)
  124. }
  125. body := *bodystr
  126. if *bodyfile != "" {
  127. raw, err := ioutil.ReadFile(*bodyfile)
  128. if err != nil {
  129. fmt.Fprintf(os.Stderr, "read error: %s\n", err.Error())
  130. os.Exit(1)
  131. }
  132. body = string(raw)
  133. }
  134. cfg := LoadConfig(*cfgpath)
  135. es := cfg.GetClient(*server)
  136. ics := es.CreateIndex(cmd.Arg(0))
  137. if body != "" {
  138. ics.Body(body)
  139. }
  140. _, err := ics.Do(context.Background())
  141. if err != nil {
  142. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  143. os.Exit(1)
  144. }
  145. case "refresh":
  146. cmd := flag.NewFlagSet("index refresh", flag.ExitOnError)
  147. cmd.SetOutput(os.Stdout)
  148. cmd.Usage = func() {
  149. fmt.Printf("Usage: %s index %s [args] <index>...\n",
  150. os.Args[0], subcmd)
  151. cmd.PrintDefaults()
  152. }
  153. cfgpath := cmd.String("config", "", "path to configuration")
  154. server := cmd.String("server", "", "server name to use")
  155. cmd.Parse(os.Args[3:])
  156. if len(cmd.Args()) < 1 {
  157. fmt.Fprintf(os.Stderr, "index name required for index refresh\n")
  158. cmd.Usage()
  159. os.Exit(1)
  160. }
  161. cfg := LoadConfig(*cfgpath)
  162. es := cfg.GetClient(*server)
  163. _, err := es.Refresh(cmd.Args()...).Do(context.Background())
  164. if err != nil {
  165. fmt.Fprintf(os.Stderr, "elastic error: %s\n", err.Error())
  166. os.Exit(1)
  167. }
  168. case "--help":
  169. printIndexUsage()
  170. os.Exit(0)
  171. default:
  172. fmt.Fprintf(os.Stderr, "%s: index '%s' is not a recognized subcommand\n",
  173. os.Args[0], os.Args[2])
  174. printIndexUsage()
  175. os.Exit(1)
  176. }
  177. }
  178. func printIndexUsage() {
  179. fmt.Printf("Usage: %s index <subcommand> ... \n", os.Args[0])
  180. fmt.Printf("See '%s index <subcommand> --help' for information", os.Args[0])
  181. fmt.Printf(" on a specific command\n")
  182. fmt.Printf("valid subcommands:\n")
  183. fmt.Printf(" list list indexes\n")
  184. fmt.Printf(" add add index\n")
  185. fmt.Printf(" delete delete index\n")
  186. fmt.Printf(" refresh refresh index\n")
  187. }