main.go 4.9 KB

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