main.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/cron"
  5. "log"
  6. "net/http"
  7. qu "qfw/util"
  8. "strings"
  9. "time"
  10. )
  11. var (
  12. sysconfig map[string]interface{} //配置文件
  13. port string
  14. idsArr []string
  15. dataTmp map[string]map[string]interface{}
  16. during,isErr int64
  17. )
  18. func init() {
  19. //加载配置文件
  20. log.Println("加载...")
  21. qu.ReadConfig(&sysconfig)
  22. port = sysconfig["port"].(string)
  23. arr := sysconfig["vpsIDs"].([]interface{})
  24. idsArr = qu.ObjArrToStringArr(arr)
  25. dataTmp = make(map[string]map[string]interface{},0)
  26. for _,v := range idsArr{
  27. id := qu.ObjToString(v)
  28. dataTmp[id] = map[string]interface{}{
  29. "isHeart":0,
  30. "isErrNum":0,
  31. "isProcess" : 0,
  32. "isVpsMail":0,
  33. "isPrpMail":0,
  34. }
  35. }
  36. during = qu.Int64All(sysconfig["during"])
  37. isErr = qu.Int64All(sysconfig["isErr"])
  38. log.Println("准备完毕...")
  39. }
  40. func main() {
  41. //http://monitor.spdata.jianyu360.com/,程序端口7811
  42. addr := ":"+port
  43. http.HandleFunc("/", handler)
  44. go http.ListenAndServe(addr, nil)
  45. //每隔1分钟执行一次:0 */1 * * * ? 每隔5秒执行一次:*/5 * * * * ?
  46. //spec :=fmt.Sprintf("0 */%d * * * ?",during)
  47. spec :=fmt.Sprintf("*/%d * * * * ?",during)
  48. c := cron.New()
  49. c.AddFunc(spec, func() { taskFinishing()})
  50. c.Start()
  51. time.Sleep(99999 * time.Hour)
  52. }
  53. func handler(w http.ResponseWriter, r *http.Request) {
  54. r.ParseForm() //解析参数,默认是不会解析的
  55. if r.Method == "GET" {
  56. vpsid ,process,isProMail:= "",int64(0),int64(0)
  57. for k, v := range r.Form {
  58. if k=="id" {
  59. vpsid = strings.Join(v, "")
  60. }else if k=="process" {
  61. process = qu.Int64All(strings.Join(v, ""))
  62. if process==0 {
  63. isProMail = 0
  64. }
  65. }else {
  66. }
  67. }
  68. if vpsid!="" { //改变-旧状态
  69. dataTmp[vpsid] = map[string]interface{}{
  70. "isHeart":1,
  71. "isErrNum":0,
  72. "isVpsMail":0, //收到心跳-vps邮件置为0,可以发
  73. "isProcess":process,
  74. "isProMail":isProMail,
  75. }
  76. }
  77. log.Println("接收Get请求:",dataTmp[vpsid])
  78. } else if r.Method == "POST" {
  79. } else {
  80. }
  81. }
  82. //不断监听处理
  83. func taskFinishing() {
  84. log.Println("执行...处理一次...")
  85. isVpsMailContent,isProMailContent:= "",""
  86. for _ , vpsid := range idsArr {
  87. //此标识-是否正常
  88. log.Println("原:",dataTmp[vpsid])
  89. isHeart,isProcess:= qu.Int64All(dataTmp[vpsid]["isHeart"]),qu.Int64All(dataTmp[vpsid]["isProcess"])
  90. isErrNum := int64(0)
  91. isVpsMail,isProMail := qu.Int64All(dataTmp[vpsid]["isVpsMail"]),qu.Int64All(dataTmp[vpsid]["isProMail"])
  92. if isVpsMail == 1 { //送过邮件了
  93. //log.Println("发过vps邮件","心跳:",isHeart,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
  94. continue
  95. }
  96. if isHeart == 0 { //未接收心跳反应,错误+1
  97. isErrNum = qu.Int64All(dataTmp[vpsid]["isErrNum"])
  98. isErrNum ++
  99. }
  100. if isErrNum > isErr { //错误超过一定次数,发邮件vps异常
  101. isErrNum = 0
  102. if isVpsMailContent == ""{
  103. isVpsMailContent = vpsid
  104. }else {
  105. isVpsMailContent = isVpsMailContent+","+vpsid
  106. }
  107. isVpsMail = 1
  108. }
  109. if isProcess == 1 && isProMail==0 {//下载器异常-未发送过下载器异常情况
  110. if isProMailContent == ""{
  111. isProMailContent = vpsid
  112. }else {
  113. isProMailContent = isProMailContent+","+vpsid
  114. }
  115. isProMail = 1
  116. isProcess = 0
  117. }
  118. log.Println("处理后:","心跳:",0,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
  119. dataTmp[vpsid] = map[string]interface{}{
  120. "isHeart":0,
  121. "isErrNum":isErrNum,
  122. "isProcess":isProcess,
  123. "isVpsMail":isVpsMail,
  124. "isProMail" : isProMail,
  125. }
  126. //log.Println("处理:",dataTmp[id])
  127. }
  128. if isVpsMailContent!=""{
  129. log.Println("发邮件vps异常...",isVpsMailContent)
  130. //sendErrMailApi("vpn异常",isVpsMailContent)
  131. }else {
  132. if isProMailContent !="" {
  133. log.Println("发邮件下载器异常...",isVpsMailContent)
  134. //sendErrMailApi("下载器异常",isProMailContent)
  135. }
  136. }
  137. }