/
onTimeUpdate_controller.go
148 lines (137 loc) · 3.85 KB
/
onTimeUpdate_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package portal
import (
"sync"
"strconv"
"strings"
"time"
"github.com/Cepave/open-falcon-backend/modules/fe/g"
event "github.com/Cepave/open-falcon-backend/modules/fe/model/falcon_portal"
log "github.com/sirupsen/logrus"
)
type UpdatedEvents struct {
Events []event.EventCases
Enotes []event.EventNote
}
type UpdatedObjMutex struct {
sync.Mutex
UpdatedEvents
}
var (
storeEvents UpdatedObjMutex
)
func (this *PortalController) OnTimeFeeding() {
baseResp := this.BasicRespGen()
_, err := this.SessionCheck()
if err != nil {
log.Error(err.Error())
this.ResposeError(baseResp, err.Error())
return
}
username := this.GetString("cName", "")
isadmin, tplids, err := event.GetCasePermission(username)
if tplids == "" {
tplids = "-1"
}
events := []event.EventCases{}
events = storeEvents.Events
//not admin & no any related alarms
if !isadmin && tplids == "-1" {
events = []event.EventCases{}
} else if !isadmin && tplids != "-1" {
log.Debugf("this user is not admin, will use %s for query", tplids)
eventsTmp := []event.EventCases{}
//make a templete mapping for check the permission of this user
tplidsArr := strings.Split(tplids, ",")
log.Debugf("tplarr: %v", tplidsArr)
tplidMap := map[int]int{}
for _, tid := range tplidsArr {
tidint, err := strconv.Atoi(tid)
if err != nil {
log.Error(err.Error())
}
tplidMap[tidint] = tidint
}
for _, e := range events {
if _, ok := tplidMap[e.TemplateId]; ok {
eventsTmp = append(eventsTmp, e)
}
}
events = eventsTmp
}
alertTmpStore, endpoints, err := event.AlertsConvert(events)
alertswithInfo := event.GetAlertInfoFromDB(alertTmpStore, endpoints, g.Config().BossDB.ShowAll)
notes := storeEvents.Enotes
anyNew := false
if len(events) != 0 || len(notes) != 0 {
anyNew = true
}
baseResp.Data["events"] = alertswithInfo
baseResp.Data["notes"] = notes
baseResp.Data["any_new"] = anyNew
baseResp.Data["admin"] = isadmin
this.ServeApiJson(baseResp)
return
}
func CronForQuery(updatTo chan UpdatedEvents, pid chan string) {
defer func() {
if r := recover(); r != nil {
time.Sleep(time.Minute * 1)
pid <- "CronForQuery"
return
}
}()
for {
currentTime := time.Now().Unix()
startTime := (currentTime - int64(60*1))
log.Debugf("cron job for on time query: range -> %v ~ %v", startTime, currentTime)
events, err := event.GetEventCases(false, startTime, currentTime, "ALL", "ALL", "ALL", 500, 0, "root", "ALL", "")
if err != nil {
log.Errorf("crond get evnetCase go err: %v", err.Error())
}
enotes, err := event.GetNotes("", 1000, startTime, currentTime, false)
if err != nil {
log.Errorf("crond get GetNotes go err: %v", err.Error())
}
updatTo <- UpdatedEvents{events, enotes}
time.Sleep(time.Minute * 1)
}
}
func CronReciveUpdate(updatTo chan UpdatedEvents, pid chan string) {
defer func() {
if r := recover(); r != nil {
time.Sleep(time.Minute * 1)
pid <- "CronReciveUpdate"
return
}
}()
for {
select {
case updated := <-updatTo:
storeEvents.Lock()
storeEvents.UpdatedEvents = updated
storeEvents.Unlock()
}
}
}
func CornDaemonStart() {
log.Info("on time query cron job start!")
defer log.Error("cron stoped , on time feeding function will broke, please restart this application")
updateChann := make(chan UpdatedEvents)
supervisorChn := make(chan string)
go CronForQuery(updateChann, supervisorChn)
go CronReciveUpdate(updateChann, supervisorChn)
for {
select {
case sup := <-supervisorChn:
if sup == "CronForQuery" {
log.Errorf("%s dead will unknown reason, will restart the this rotuine", sup)
go CronForQuery(updateChann, supervisorChn)
} else if sup == "CornReceiveUpdate" {
log.Errorf("%s dead will unknown reason, will restart the this rotuine", sup)
go CronReciveUpdate(updateChann, supervisorChn)
} else {
log.Errorf("got worng params of supervisorChn -> %v .", sup)
}
}
}
}