|
@@ -14,36 +14,29 @@ var (
|
|
sysconfig map[string]interface{} //配置文件
|
|
sysconfig map[string]interface{} //配置文件
|
|
port string
|
|
port string
|
|
save_mgo *MongodbSim
|
|
save_mgo *MongodbSim
|
|
- idsArr []string
|
|
|
|
- dataTmp map[string]map[string]interface{}
|
|
|
|
|
|
+ idsArr,extArr []string
|
|
|
|
+ vpsTmp map[string]map[string]interface{}
|
|
|
|
+ extTmp map[string]interface{}
|
|
during,isErr int64
|
|
during,isErr int64
|
|
test map[string]interface{}
|
|
test map[string]interface{}
|
|
updatelock sync.Mutex
|
|
updatelock sync.Mutex
|
|
save_coll_name string
|
|
save_coll_name string
|
|
)
|
|
)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
func init() {
|
|
func init() {
|
|
//加载配置文件
|
|
//加载配置文件
|
|
log.Println("加载...")
|
|
log.Println("加载...")
|
|
qu.ReadConfig(&sysconfig)
|
|
qu.ReadConfig(&sysconfig)
|
|
port = sysconfig["port"].(string)
|
|
port = sysconfig["port"].(string)
|
|
- arr := sysconfig["vpsIDs"].([]interface{})
|
|
|
|
- idsArr = qu.ObjArrToStringArr(arr)
|
|
|
|
-
|
|
|
|
|
|
+ arr1 := sysconfig["vpsIDs"].([]interface{})
|
|
|
|
+ idsArr = qu.ObjArrToStringArr(arr1)
|
|
|
|
+ arr2 := sysconfig["extIDs"].([]interface{})
|
|
|
|
+ extArr = qu.ObjArrToStringArr(arr2)
|
|
|
|
|
|
-
|
|
|
|
- updatelock.Lock()
|
|
|
|
- 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,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- updatelock.Unlock()
|
|
|
|
|
|
+ resetRecordData()
|
|
|
|
|
|
during = qu.Int64All(sysconfig["during"])
|
|
during = qu.Int64All(sysconfig["during"])
|
|
isErr = qu.Int64All(sysconfig["isErr"])
|
|
isErr = qu.Int64All(sysconfig["isErr"])
|
|
@@ -56,13 +49,9 @@ func init() {
|
|
Size: qu.IntAllDef(saveconf["pool"], 5),
|
|
Size: qu.IntAllDef(saveconf["pool"], 5),
|
|
}
|
|
}
|
|
save_mgo.InitPool()
|
|
save_mgo.InitPool()
|
|
-
|
|
|
|
-
|
|
|
|
log.Println("准备完毕...")
|
|
log.Println("准备完毕...")
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
func main() {
|
|
func main() {
|
|
|
|
|
|
//http://monitor.spdata.jianyu360.com/,程序端口7811
|
|
//http://monitor.spdata.jianyu360.com/,程序端口7811
|
|
@@ -73,60 +62,39 @@ func main() {
|
|
//每隔1分钟执行一次:0 */1 * * * ? 每隔5秒执行一次:*/5 * * * * ?
|
|
//每隔1分钟执行一次:0 */1 * * * ? 每隔5秒执行一次:*/5 * * * * ?
|
|
|
|
|
|
spec :=fmt.Sprintf("30 */%d * * * ?",during)
|
|
spec :=fmt.Sprintf("30 */%d * * * ?",during)
|
|
- //spec =fmt.Sprintf("*/%d * * * * ?",during)
|
|
|
|
-
|
|
|
|
spec_reset := "0 0 0 * * ?"
|
|
spec_reset := "0 0 0 * * ?"
|
|
-
|
|
|
|
|
|
+ spec_extract :=fmt.Sprintf("20 */%d * * * ?",during)
|
|
c := cron.New()
|
|
c := cron.New()
|
|
c.AddFunc(spec, func() { taskFinishing()})
|
|
c.AddFunc(spec, func() { taskFinishing()})
|
|
c.AddFunc(spec_reset, func() { resetRecordData()})
|
|
c.AddFunc(spec_reset, func() { resetRecordData()})
|
|
|
|
+ c.AddFunc(spec_extract, func() { extractRunning()})
|
|
c.Start()
|
|
c.Start()
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
time.Sleep(99999 * time.Hour)
|
|
time.Sleep(99999 * time.Hour)
|
|
}
|
|
}
|
|
|
|
|
|
-func resetRecordData() {
|
|
|
|
- updatelock.Lock()
|
|
|
|
- log.Println("重置数据...")
|
|
|
|
- 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,
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- log.Println("重置数据...",len(dataTmp))
|
|
|
|
- updatelock.Unlock()
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
func handler(w http.ResponseWriter, r *http.Request) {
|
|
func handler(w http.ResponseWriter, r *http.Request) {
|
|
updatelock.Lock()
|
|
updatelock.Lock()
|
|
r.ParseForm() //解析参数,默认是不会解析的
|
|
r.ParseForm() //解析参数,默认是不会解析的
|
|
if r.Method == "GET" {
|
|
if r.Method == "GET" {
|
|
vpsid ,process,isProMail:= "",int64(0),int64(0)
|
|
vpsid ,process,isProMail:= "",int64(0),int64(0)
|
|
|
|
+ extid :=""
|
|
for k, v := range r.Form {
|
|
for k, v := range r.Form {
|
|
if k=="id" {
|
|
if k=="id" {
|
|
vpsid = strings.Join(v, "")
|
|
vpsid = strings.Join(v, "")
|
|
- isProMail = qu.Int64All(dataTmp[vpsid]["isProMail"])
|
|
|
|
|
|
+ isProMail = qu.Int64All(vpsTmp[vpsid]["isProMail"])
|
|
}else if k=="process" {
|
|
}else if k=="process" {
|
|
process = qu.Int64All(strings.Join(v, ""))
|
|
process = qu.Int64All(strings.Join(v, ""))
|
|
if process==0 {
|
|
if process==0 {
|
|
isProMail = 0
|
|
isProMail = 0
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ }else if k=="extract" {
|
|
|
|
+ extid = strings.Join(v, "")
|
|
}else {
|
|
}else {
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if vpsid!="" { //改变-旧状态
|
|
|
|
- dataTmp[vpsid] = map[string]interface{}{
|
|
|
|
|
|
+ if vpsid!="" {
|
|
|
|
+ vpsTmp[vpsid] = map[string]interface{}{
|
|
"isHeart":1,
|
|
"isHeart":1,
|
|
"isErrNum":0,
|
|
"isErrNum":0,
|
|
"isVpsMail":0, //收到心跳-vps邮件重置为0,可以发
|
|
"isVpsMail":0, //收到心跳-vps邮件重置为0,可以发
|
|
@@ -135,7 +103,9 @@ func handler(w http.ResponseWriter, r *http.Request) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- //log.Println("接收Get请求:",dataTmp[vpsid])
|
|
|
|
|
|
+ if extid!="" {
|
|
|
|
+ extTmp[extid] = time.Now().Unix()
|
|
|
|
+ }
|
|
|
|
|
|
} else if r.Method == "POST" {
|
|
} else if r.Method == "POST" {
|
|
|
|
|
|
@@ -146,25 +116,52 @@ func handler(w http.ResponseWriter, r *http.Request) {
|
|
updatelock.Unlock()
|
|
updatelock.Unlock()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//重置数据
|
|
|
|
+func resetRecordData() {
|
|
|
|
+ updatelock.Lock()
|
|
|
|
+ vpsTmp = make(map[string]map[string]interface{},0)
|
|
|
|
+ for _,v := range idsArr{
|
|
|
|
+ id := qu.ObjToString(v)
|
|
|
|
+ vpsTmp[id] = map[string]interface{}{
|
|
|
|
+ "isHeart":0,
|
|
|
|
+ "isErrNum":0,
|
|
|
|
+ "isProcess" : 0,
|
|
|
|
+ "isVpsMail":0,
|
|
|
|
+ "isProMail":0,
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.Println("重置数据vps...",len(vpsTmp))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ extTmp = make(map[string]interface{},0)
|
|
|
|
+ for _,v := range extArr{
|
|
|
|
+ extid := qu.ObjToString(v)
|
|
|
|
+ extTmp[extid] = time.Now().Unix()
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ log.Println("重置ext数据...")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ updatelock.Unlock()
|
|
|
|
+}
|
|
//不断监听处理
|
|
//不断监听处理
|
|
func taskFinishing() {
|
|
func taskFinishing() {
|
|
//加锁
|
|
//加锁
|
|
updatelock.Lock()
|
|
updatelock.Lock()
|
|
log.Println("...处理一次...")
|
|
log.Println("...处理一次...")
|
|
-
|
|
|
|
isVpsMailContent,isProMailContent:= "",""
|
|
isVpsMailContent,isProMailContent:= "",""
|
|
for _ , vpsid := range idsArr {
|
|
for _ , vpsid := range idsArr {
|
|
//此标识-是否正常
|
|
//此标识-是否正常
|
|
//log.Println("原:",dataTmp[vpsid])
|
|
//log.Println("原:",dataTmp[vpsid])
|
|
- isHeart,isProcess:= qu.Int64All(dataTmp[vpsid]["isHeart"]),qu.Int64All(dataTmp[vpsid]["isProcess"])
|
|
|
|
|
|
+ isHeart,isProcess:= qu.Int64All(vpsTmp[vpsid]["isHeart"]),qu.Int64All(vpsTmp[vpsid]["isProcess"])
|
|
isErrNum := int64(0)
|
|
isErrNum := int64(0)
|
|
- isVpsMail,isProMail := qu.Int64All(dataTmp[vpsid]["isVpsMail"]),qu.Int64All(dataTmp[vpsid]["isProMail"])
|
|
|
|
|
|
+ isVpsMail,isProMail := qu.Int64All(vpsTmp[vpsid]["isVpsMail"]),qu.Int64All(vpsTmp[vpsid]["isProMail"])
|
|
if isVpsMail == 1 { //送过邮件了
|
|
if isVpsMail == 1 { //送过邮件了
|
|
//log.Println("发过vps邮件","心跳:",isHeart,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
|
|
//log.Println("发过vps邮件","心跳:",isHeart,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
if isHeart == 0 { //未接收心跳反应,错误+1
|
|
if isHeart == 0 { //未接收心跳反应,错误+1
|
|
- isErrNum = qu.Int64All(dataTmp[vpsid]["isErrNum"])
|
|
|
|
|
|
+ isErrNum = qu.Int64All(vpsTmp[vpsid]["isErrNum"])
|
|
isErrNum ++
|
|
isErrNum ++
|
|
}
|
|
}
|
|
if isErrNum > isErr { //错误超过一定次数,发邮件vps异常
|
|
if isErrNum > isErr { //错误超过一定次数,发邮件vps异常
|
|
@@ -189,8 +186,7 @@ func taskFinishing() {
|
|
|
|
|
|
//log.Println("处理后:","心跳:",0,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
|
|
//log.Println("处理后:","心跳:",0,"次数:",isErrNum,"下载器:",isProcess,"vps邮件:",isVpsMail,"pro邮件:",isProMail)
|
|
|
|
|
|
-
|
|
|
|
- dataTmp[vpsid] = map[string]interface{}{
|
|
|
|
|
|
+ vpsTmp[vpsid] = map[string]interface{}{
|
|
"isHeart":0,
|
|
"isHeart":0,
|
|
"isErrNum":isErrNum,
|
|
"isErrNum":isErrNum,
|
|
"isProcess":isProcess,
|
|
"isProcess":isProcess,
|
|
@@ -212,7 +208,7 @@ func taskFinishing() {
|
|
"detail" : isVpsMailContent,
|
|
"detail" : isVpsMailContent,
|
|
})
|
|
})
|
|
|
|
|
|
- sendErrMailApi("vps",isVpsMailContent)
|
|
|
|
|
|
+ sendErrVpsMailApi("vps",isVpsMailContent)
|
|
}else {
|
|
}else {
|
|
if isProMailContent !="" {
|
|
if isProMailContent !="" {
|
|
log.Println("发邮件:下载器异常...",isProMailContent)
|
|
log.Println("发邮件:下载器异常...",isProMailContent)
|
|
@@ -224,10 +220,35 @@ func taskFinishing() {
|
|
"detail" : isProMailContent,
|
|
"detail" : isProMailContent,
|
|
})
|
|
})
|
|
|
|
|
|
- sendErrMailApi("下载器异常",isProMailContent)
|
|
|
|
|
|
+ sendErrVpsMailApi("下载器异常",isProMailContent)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
updatelock.Unlock()
|
|
updatelock.Unlock()
|
|
|
|
|
|
|
|
+}
|
|
|
|
+//抽取活跃监测
|
|
|
|
+func extractRunning() {
|
|
|
|
+ log.Println("...抽取活跃处理一次...")
|
|
|
|
+ isSend := false
|
|
|
|
+ for _,v := range extTmp{
|
|
|
|
+ t := qu.Int64All(v)
|
|
|
|
+ now_time := time.Now().Unix()
|
|
|
|
+ if now_time-t > int64(1800) {
|
|
|
|
+ isSend = true//有异常发邮件
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if isSend {
|
|
|
|
+ updatelock.Lock()
|
|
|
|
+ extTmp = make(map[string]interface{},0)
|
|
|
|
+ for _,v := range extArr{
|
|
|
|
+ extid := qu.ObjToString(v)
|
|
|
|
+ extTmp[extid] = time.Now().Unix()
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ //发送邮件
|
|
|
|
+ sendErrExtMailApi("抽取程序异常","抽取程序超半小时未响应...清检查")
|
|
|
|
+ updatelock.Unlock()
|
|
|
|
+ }
|
|
}
|
|
}
|