main.go 2.7 KB

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