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.

65 lines
1.7 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package alert
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/sfreiberg/gotwilio"
  6. "github.com/tendermint/tendermint/config"
  7. )
  8. var lastAlertUnix int64 = 0
  9. var alertCountSince int = 0
  10. // Sends a critical alert message to administrators.
  11. func Alert(message string) {
  12. log.Error("<!> ALERT <!>\n" + message)
  13. now := time.Now().Unix()
  14. if now-lastAlertUnix > int64(config.App().GetInt("Alert.MinInterval")) {
  15. message = fmt.Sprintf("%v:%v", config.App().GetString("Network"), message)
  16. if alertCountSince > 0 {
  17. message = fmt.Sprintf("%v (+%v more since)", message, alertCountSince)
  18. alertCountSince = 0
  19. }
  20. if len(config.App().GetString("Alert.TwilioSid")) > 0 {
  21. go sendTwilio(message)
  22. }
  23. if len(config.App().GetString("Alert.EmailRecipients")) > 0 {
  24. go sendEmail(message)
  25. }
  26. } else {
  27. alertCountSince++
  28. }
  29. }
  30. func sendTwilio(message string) {
  31. defer func() {
  32. if err := recover(); err != nil {
  33. log.Error("sendTwilio error", "error", err)
  34. }
  35. }()
  36. if len(message) > 50 {
  37. message = message[:50]
  38. }
  39. twilio := gotwilio.NewTwilioClient(config.App().GetString("Alert.TwilioSid"), config.App().GetString("Alert.TwilioToken"))
  40. res, exp, err := twilio.SendSMS(config.App().GetString("Alert.TwilioFrom"), config.App().GetString("Alert.TwilioTo"), message, "", "")
  41. if exp != nil || err != nil {
  42. log.Error("sendTwilio error", "res", res, "exp", exp, "error", err)
  43. }
  44. }
  45. func sendEmail(message string) {
  46. defer func() {
  47. if err := recover(); err != nil {
  48. log.Error("sendEmail error", "error", err)
  49. }
  50. }()
  51. subject := message
  52. if len(subject) > 80 {
  53. subject = subject[:80]
  54. }
  55. err := SendEmail(subject, message, config.App().GetStringSlice("Alert.EmailRecipients"))
  56. if err != nil {
  57. log.Error("sendEmail error", "error", err, "message", message)
  58. }
  59. }