A simple monitoring solution written in Go (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.

181 lines
4.0 KiB

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. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "git.binarythought.com/cdramey/alrm/config"
  7. "git.binarythought.com/cdramey/alrm/server"
  8. "git.binarythought.com/cdramey/alrm/client"
  9. "os"
  10. "strings"
  11. )
  12. func main() {
  13. cfgpath := flag.String("c", "", "path to configuration file")
  14. debuglvl := flag.Int("d", 0, "debug level")
  15. flag.Usage = printUsage
  16. flag.Parse()
  17. if *cfgpath == "" {
  18. searchpaths := []string{"/etc/alrmrc", "./alrmrc"}
  19. for _, sp := range searchpaths {
  20. if _, err := os.Stat(sp); err == nil {
  21. *cfgpath = sp
  22. break
  23. }
  24. }
  25. if *cfgpath == "" {
  26. fmt.Fprintf(os.Stderr, "cannot find configuration\n")
  27. os.Exit(1)
  28. }
  29. }
  30. command := strings.ToLower(flag.Arg(0))
  31. switch command {
  32. case "config":
  33. if *debuglvl > 0 {
  34. fmt.Printf("checking config %s .. \n", *cfgpath)
  35. }
  36. cfg, err := config.ReadConfig(*cfgpath, *debuglvl)
  37. if err != nil {
  38. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  39. os.Exit(1)
  40. }
  41. if *debuglvl > 0 {
  42. o, err := json.MarshalIndent(cfg, "", " ")
  43. if err != nil {
  44. fmt.Fprintf(os.Stderr, "JSON error: %s\n", err.Error())
  45. os.Exit(1)
  46. }
  47. fmt.Printf("%s\n", string(o))
  48. }
  49. fmt.Printf("config is OK\n")
  50. case "alarm":
  51. an := flag.Arg(1)
  52. if an == "" {
  53. fmt.Fprintf(os.Stderr, "alarm name required\n")
  54. os.Exit(1)
  55. }
  56. cfg, err := config.ReadConfig(*cfgpath, 0)
  57. if err != nil {
  58. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  59. os.Exit(1)
  60. }
  61. al, exists := cfg.Alarms[an]
  62. if !exists {
  63. fmt.Fprintf(os.Stderr, "group or host is not defined\n")
  64. os.Exit(1)
  65. }
  66. err = al.Alarm(
  67. "test group", "test host", "test check",
  68. fmt.Errorf("test alarm message"),
  69. )
  70. if err != nil {
  71. fmt.Fprintf(os.Stderr, "alarm failed: %s\n", err.Error())
  72. os.Exit(1)
  73. }
  74. fmt.Printf("alarm sounded successfully\n")
  75. case "check":
  76. cn := flag.Arg(1)
  77. if cn == "" {
  78. fmt.Fprintf(os.Stderr, "check host or group name required\n")
  79. os.Exit(1)
  80. }
  81. cfg, err := config.ReadConfig(*cfgpath, 0)
  82. if err != nil {
  83. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  84. os.Exit(1)
  85. }
  86. gr, exists := cfg.Groups[cn]
  87. if !exists {
  88. fmt.Fprintf(os.Stderr, "group or host is not defined\n")
  89. os.Exit(1)
  90. }
  91. err = gr.Check(*debuglvl)
  92. if err != nil {
  93. fmt.Fprintf(os.Stderr, "check failed: %s\n", err.Error())
  94. os.Exit(1)
  95. }
  96. fmt.Printf("check successful\n")
  97. case "server":
  98. for {
  99. cfg, err := config.ReadConfig(*cfgpath, *debuglvl)
  100. if err != nil {
  101. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  102. os.Exit(1)
  103. }
  104. srv := server.NewServer(cfg)
  105. r, err := srv.Start()
  106. if err != nil {
  107. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  108. os.Exit(1)
  109. }
  110. if !r {
  111. return
  112. }
  113. }
  114. case "shutdown":
  115. cfg, err := config.ReadConfig(*cfgpath, 0)
  116. if err != nil {
  117. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  118. os.Exit(1)
  119. }
  120. err = client.Shutdown(cfg)
  121. if err != nil {
  122. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  123. os.Exit(1)
  124. }
  125. case "restart":
  126. cfg, err := config.ReadConfig(*cfgpath, 0)
  127. if err != nil {
  128. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  129. os.Exit(1)
  130. }
  131. err = client.Restart(cfg)
  132. if err != nil {
  133. fmt.Fprintf(os.Stderr, "%s\n", err.Error())
  134. os.Exit(1)
  135. }
  136. case "help", "":
  137. printUsage()
  138. default:
  139. fmt.Fprintf(os.Stderr, "unknown command: %s\n", command)
  140. os.Exit(1)
  141. }
  142. }
  143. func printUsage() {
  144. fmt.Printf("Usage: %s [args] <action> ...\n", os.Args[0])
  145. fmt.Printf("Arguments:\n")
  146. fmt.Printf(" -c <path> : path to configuration file\n")
  147. fmt.Printf(" -d <level> : debug level (0-9, higher for more debugging)\n")
  148. fmt.Printf("Actions:\n")
  149. fmt.Printf(" verify configuration: %s [args] config\n", os.Args[0])
  150. fmt.Printf(" run a check manually: %s [args] check <host/group>\n", os.Args[0])
  151. fmt.Printf(" test an alarm: %s [args] alarm <name>\n", os.Args[0])
  152. fmt.Printf(" start server (forground): %s [args] server\n", os.Args[0])
  153. fmt.Printf(" shutdown server: %s [args] shutdown\n", os.Args[0])
  154. fmt.Printf(" restart server: %s [args] restart\n", os.Args[0])
  155. }