main.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net"
  9. "net/http"
  10. "os"
  11. "strings"
  12. "time"
  13. )
  14. var globalOpts struct {
  15. ctlSock string
  16. verbose bool
  17. debug bool
  18. }
  19. var ctl http.Client
  20. type commandFunc func([]string) error
  21. var cmdMap map[string]commandFunc
  22. func init() {
  23. cmdMap = map[string]commandFunc{
  24. // TODO: implement set and get of config at runtime
  25. //"set": setCmd,
  26. //"get": getCmd,
  27. "pause": pauseCmd,
  28. "filter": filterCmd,
  29. "reload": reloadCmd,
  30. "restart": restartCmd,
  31. "help": helpCmd,
  32. }
  33. }
  34. //func setCmd(ctlSock string, args []string) error {}
  35. //func getCmd(ctlSock string, args []string) error {}
  36. func filterCmd(args []string) error {
  37. filter := strings.Join(args[1:], " ")
  38. postBody := make(map[string][]string)
  39. postBody["where"] = []string{filter}
  40. if globalOpts.debug {
  41. fmt.Println("[DEBUG] postBody:", postBody)
  42. }
  43. resp, err := ctl.PostForm("http://unix/filter", postBody)
  44. if resp.StatusCode != 200 || globalOpts.verbose {
  45. defer resp.Body.Close()
  46. bodyBytes, err := ioutil.ReadAll(resp.Body)
  47. if err != nil {
  48. return err
  49. }
  50. fmt.Println(string(bodyBytes))
  51. }
  52. return err
  53. }
  54. func pauseCmd(args []string) error {
  55. var dontChangeAgain time.Duration
  56. flagset := flag.NewFlagSet(args[0], flag.ExitOnError)
  57. waitTime := flagset.Duration("wait-time", dontChangeAgain, "How long to wait before untoggling the state, defaults to never")
  58. flagset.Parse(args[1:])
  59. postBody := make(map[string][]string)
  60. if *waitTime != dontChangeAgain {
  61. postBody["waitTime"] = []string{fmt.Sprintf("%s", *waitTime)}
  62. }
  63. if globalOpts.debug {
  64. fmt.Println("[DEBUG] postBody:", postBody)
  65. }
  66. resp, err := ctl.PostForm("http://unix/pause/toggle", postBody)
  67. if globalOpts.verbose {
  68. defer resp.Body.Close()
  69. bodyBytes, err := ioutil.ReadAll(resp.Body)
  70. if err != nil {
  71. return err
  72. }
  73. fmt.Println(string(bodyBytes))
  74. }
  75. return err
  76. }
  77. func reloadCmd(args []string) error {
  78. return nil
  79. }
  80. func restartCmd(args []string) error {
  81. return nil
  82. }
  83. func helpCmd(args []string) error {
  84. usage(os.Stdout)
  85. os.Exit(0)
  86. return nil
  87. }
  88. func usage(w io.Writer) {
  89. fmt.Fprintf(w, "USAGE: %s [globalOpts] [SUBCOMMAND] [opts]\n", os.Args[0])
  90. fmt.Fprintf(w, "\nSUBCOMMANDS:\n\n")
  91. for command := range cmdMap {
  92. fmt.Fprintf(w, "\t%s\n", command)
  93. }
  94. }
  95. func parseAndRun(args []string) {
  96. cmdName := args[0]
  97. cmdToRun, ok := cmdMap[cmdName]
  98. if !ok {
  99. fmt.Fprintf(os.Stderr, "Unknown subcommand: %s\n", cmdName)
  100. usage(os.Stderr)
  101. os.Exit(2)
  102. }
  103. // from here: https://gist.github.com/teknoraver/5ffacb8757330715bcbcc90e6d46ac74
  104. ctl = http.Client{
  105. Transport: &http.Transport{
  106. DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
  107. return net.Dial("unix", globalOpts.ctlSock)
  108. },
  109. },
  110. }
  111. err := cmdToRun(args)
  112. if err != nil {
  113. fmt.Fprintf(os.Stderr, "Error:\n%s\n", err)
  114. os.Exit(1)
  115. }
  116. }
  117. func main() {
  118. flag.StringVar(&globalOpts.ctlSock, "ctl-socket", "/tmp/circologd-ctl.sock",
  119. "Path to a unix domain socket for the control server; leave empty to disable")
  120. flag.BoolVar(&globalOpts.verbose, "verbose", false, "Print more output")
  121. flag.BoolVar(&globalOpts.debug, "debug", false, "Print debugging info")
  122. flag.Parse()
  123. args := flag.Args()
  124. if len(args) == 0 {
  125. usage(os.Stderr)
  126. os.Exit(-1)
  127. }
  128. parseAndRun(args)
  129. }