123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- package main
- import (
- "fmt"
- "github.com/cron"
- "log"
- "net/http"
- qu "qfw/util"
- "strings"
- "sync"
- "time"
- )
- var (
- sysconfig map[string]interface{} //配置文件
- port string
- save_mgo *MongodbSim
- idsArr []string
- dataTmp map[string]map[string]interface{}
- during,isErr int64
- test map[string]interface{}
- updatelock sync.Mutex
- save_coll_name string
- )
- func init() {
- //加载配置文件
- log.Println("加载...")
- qu.ReadConfig(&sysconfig)
- port = sysconfig["port"].(string)
- arr := sysconfig["vpsIDs"].([]interface{})
- idsArr = qu.ObjArrToStringArr(arr)
- dataTmp = make(map[string]map[string]interface{},0)
- for _,v := range idsArr{
- id := qu.ObjToString(v)
- dataTmp[id] = map[string]interface{}{
- "isHeart":0,
- "isErrNum":0,
- "isProcess" : 0,
- "isVpsMail":0,
- "isProMail":0,
- }
- }
- during = qu.Int64All(sysconfig["during"])
- isErr = qu.Int64All(sysconfig["isErr"])
- saveconf := sysconfig["save_mgodb"].(map[string]interface{})
- save_coll_name = qu.ObjToString(saveconf["coll"])
- save_mgo = &MongodbSim{
- MongodbAddr: saveconf["addr"].(string),
- DbName: saveconf["db"].(string),
- Size: qu.IntAllDef(saveconf["pool"], 5),
- }
- save_mgo.InitPool()
- log.Println("准备完毕...")
- }
- func main() {
- //http://monitor.spdata.jianyu360.com/,程序端口7811
- addr := ":"+port
- http.HandleFunc("/", handler)
- go http.ListenAndServe(addr, nil)
- //每隔1分钟执行一次:0 */1 * * * ? 每隔5秒执行一次:*/5 * * * * ?
- spec :=fmt.Sprintf("30 */%d * * * ?",during)
- //spec =fmt.Sprintf("*/%d * * * * ?",during)
- c := cron.New()
- c.AddFunc(spec, func() { taskFinishing()})
- c.Start()
- time.Sleep(99999 * time.Hour)
- }
- func handler(w http.ResponseWriter, r *http.Request) {
- updatelock.Lock()
- r.ParseForm() //解析参数,默认是不会解析的
- if r.Method == "GET" {
- vpsid ,process,isProMail:= "",int64(0),int64(0)
- for k, v := range r.Form {
- if k=="id" {
- vpsid = strings.Join(v, "")
- isProMail = qu.Int64All(dataTmp[vpsid]["isProMail"])
- }else if k=="process" {
- process = qu.Int64All(strings.Join(v, ""))
- if process==0 {
- isProMail = 0
- }
- }else {
- }
- }
- if vpsid!="" { //改变-旧状态
- dataTmp[vpsid] = map[string]interface{}{
- "isHeart":1,
- "isErrNum":0,
- "isVpsMail":0, //收到心跳-vps邮件重置为0,可以发
- "isProcess":process,
- "isProMail":isProMail,
- }
- }
- //log.Println("接收Get请求:",dataTmp[vpsid])
- } else if r.Method == "POST" {
- } else {
- }
- updatelock.Unlock()
- }
- //不断监听处理
- func taskFinishing() {
- //加锁
- updatelock.Lock()
- log.Println("...处理一次...")
- isVpsMailContent,isProMailContent:= "",""
- for _ , vpsid := range idsArr {
- //此标识-是否正常
- //log.Println("原:",dataTmp[vpsid])
- isHeart,isProcess:= qu.Int64All(dataTmp[vpsid]["isHeart"]),qu.Int64All(dataTmp[vpsid]["isProcess"])
- isErrNum := int64(0)
- isVpsMail,isProMail := qu.Int64All(dataTmp[vpsid]["isVpsMail"]),qu.Int64All(dataTmp[vpsid]["isProMail"])
- if isVpsMail == 1 { //送过邮件了
- //log.Println("发过vps邮件","心跳:",isHeart,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
- continue
- }
- if isHeart == 0 { //未接收心跳反应,错误+1
- isErrNum = qu.Int64All(dataTmp[vpsid]["isErrNum"])
- isErrNum ++
- }
- if isErrNum > isErr { //错误超过一定次数,发邮件vps异常
- isErrNum = 0
- if isVpsMailContent == ""{
- isVpsMailContent = vpsid
- }else {
- isVpsMailContent = isVpsMailContent+","+vpsid
- }
- isVpsMail = 1
- }
- if isProcess == 1 && isProMail==0 {//下载器异常-未发送过下载器异常情况
- if isProMailContent == ""{
- isProMailContent = vpsid
- }else {
- isProMailContent = isProMailContent+","+vpsid
- }
- isProMail = 1
- isProcess = 0
- }
- //log.Println("处理后:","心跳:",0,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
- dataTmp[vpsid] = map[string]interface{}{
- "isHeart":0,
- "isErrNum":isErrNum,
- "isProcess":isProcess,
- "isVpsMail":isVpsMail,
- "isProMail" : isProMail,
- }
- }
- //log.Println("处理后",isProMailContent)
- if isVpsMailContent!=""{
- log.Println("发邮件:vps异常...",isVpsMailContent)
- comeintime :=qu.Int64All(time.Now().Unix())//日志记录
- save_mgo.Save(save_coll_name, map[string]interface{}{
- "name":"vps",
- "comeintime":comeintime,
- "date":qu.FormatDateByInt64(&comeintime, qu.DATEFORMAT),
- "detail" : isVpsMailContent,
- })
- sendErrMailApi("vps",isVpsMailContent)
- }else {
- if isProMailContent !="" {
- log.Println("发邮件:下载器异常...",isProMailContent)
- comeintime :=qu.Int64All(time.Now().Unix())//日志记录
- save_mgo.Save(save_coll_name, map[string]interface{}{
- "name":"下载器",
- "comeintime":comeintime,
- "date":qu.FormatDateByInt64(&comeintime, qu.DATEFORMAT),
- "detail" : isProMailContent,
- })
- sendErrMailApi("下载器异常",isProMailContent)
- }
- }
- updatelock.Unlock()
- }
|