123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- package main
- import (
- "fmt"
- "github.com/cron"
- "log"
- "net/http"
- qu "qfw/util"
- "strings"
- "time"
- )
- var (
- sysconfig map[string]interface{} //配置文件
- port string
- idsArr []string
- dataTmp map[string]map[string]interface{}
- during,isErr int64
- )
- 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,
- "isPrpMail":0,
- }
- }
- during = qu.Int64All(sysconfig["during"])
- isErr = qu.Int64All(sysconfig["isErr"])
- 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("0 */%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) {
- 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, "")
- }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 {
- }
- }
- //不断监听处理
- func taskFinishing() {
- 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("处理:",dataTmp[id])
- }
- if isVpsMailContent!=""{
- log.Println("发邮件vps异常...",isVpsMailContent)
- //sendErrMailApi("vpn异常",isVpsMailContent)
- }else {
- if isProMailContent !="" {
- log.Println("发邮件下载器异常...",isVpsMailContent)
- //sendErrMailApi("下载器异常",isProMailContent)
- }
- }
- }
|