@@ -15,14 +15,20 @@ import (
15
15
16
16
func NewBeatService (apiClient * service.JMService ) * BeatService {
17
17
return & BeatService {
18
- sessMap : make (map [string ]struct {} ),
18
+ sessMap : make (map [string ]* SessionToken ),
19
19
apiClient : apiClient ,
20
20
taskChan : make (chan * model.TerminalTask , 5 ),
21
21
}
22
22
}
23
23
24
+ type SessionToken struct {
25
+ model.Session
26
+ TokenId string
27
+ invalid bool
28
+ }
29
+
24
30
type BeatService struct {
25
- sessMap map [string ]struct {}
31
+ sessMap map [string ]* SessionToken
26
32
27
33
apiClient * service.JMService
28
34
@@ -88,18 +94,14 @@ func (b *BeatService) receiveWsTask(ws *websocket.Conn, done chan struct{}) {
88
94
}
89
95
if len (tasks ) != 0 {
90
96
for i := range tasks {
91
- select {
92
- case b .taskChan <- & tasks [i ]:
93
- default :
94
- logger .Infof ("Discard task %v" , tasks [i ])
95
- }
97
+ b .sendTask (& tasks [i ])
96
98
}
97
99
}
98
100
}
99
101
}
100
102
101
103
func (b * BeatService ) GetStatusData () interface {} {
102
- sessions := b .getSessions ()
104
+ sessions := b .getSessionIds ()
103
105
payload := model.HeartbeatData {
104
106
SessionOnlineIds : sessions ,
105
107
CpuUsed : common .CpuLoad1Usage (),
@@ -113,7 +115,7 @@ func (b *BeatService) GetStatusData() interface{} {
113
115
}
114
116
}
115
117
116
- func (b * BeatService ) getSessions () []string {
118
+ func (b * BeatService ) getSessionIds () []string {
117
119
b .Lock ()
118
120
defer b .Unlock ()
119
121
sids := make ([]string , 0 , len (b .sessMap ))
@@ -123,12 +125,20 @@ func (b *BeatService) getSessions() []string {
123
125
return sids
124
126
}
125
127
126
- var empty = struct {}{}
128
+ func (b * BeatService ) StoreSessionId (sess * SessionToken ) {
129
+ b .Lock ()
130
+ defer b .Unlock ()
131
+ b .sessMap [sess .ID ] = sess
132
+ }
127
133
128
- func (b * BeatService ) StoreSessionId ( sid string ) {
134
+ func (b * BeatService ) GetSessions () [] * SessionToken {
129
135
b .Lock ()
130
136
defer b .Unlock ()
131
- b .sessMap [sid ] = empty
137
+ sids := make ([]* SessionToken , 0 , len (b .sessMap ))
138
+ for sid := range b .sessMap {
139
+ sids = append (sids , b .sessMap [sid ])
140
+ }
141
+ return sids
132
142
}
133
143
134
144
func (b * BeatService ) RemoveSessionId (sid string ) {
@@ -144,3 +154,57 @@ func (b *BeatService) GetTerminalTaskChan() <-chan *model.TerminalTask {
144
154
func (b * BeatService ) FinishTask (taskId string ) error {
145
155
return b .apiClient .FinishTask (taskId )
146
156
}
157
+
158
+ func (b * BeatService ) KeepCheckTokens () {
159
+ for {
160
+ time .Sleep (5 * time .Minute )
161
+ sessions := b .GetSessions ()
162
+ tokens := make (map [string ]model.TokenCheckStatus , len (sessions ))
163
+ for _ , s := range sessions {
164
+ ret , ok := tokens [s .TokenId ]
165
+ if ok {
166
+ b .handleTokenCheck (s , & ret )
167
+ continue
168
+ }
169
+ ret , err := b .apiClient .CheckTokenStatus (s .TokenId )
170
+ if err != nil && ret .Code == "" {
171
+ logger .Errorf ("Check token status failed: %s" , err )
172
+ continue
173
+ }
174
+ tokens [s .TokenId ] = ret
175
+ b .handleTokenCheck (s , & ret )
176
+ }
177
+ }
178
+ }
179
+
180
+ func (b * BeatService ) sendTask (task * model.TerminalTask ) {
181
+ select {
182
+ case b .taskChan <- task :
183
+ default :
184
+ logger .Errorf ("Discard task %v" , task )
185
+ }
186
+ }
187
+
188
+ func (b * BeatService ) handleTokenCheck (session * SessionToken , tokenStatus * model.TokenCheckStatus ) {
189
+ var action string
190
+ switch tokenStatus .Code {
191
+ case model .CodePermOk :
192
+ action = model .TaskPermValid
193
+ if ! session .invalid {
194
+ return
195
+ }
196
+ session .invalid = false
197
+ default :
198
+ if session .invalid {
199
+ return
200
+ }
201
+ session .invalid = true
202
+ action = model .TaskPermExpired
203
+ }
204
+ task := model.TerminalTask {
205
+ Name : action ,
206
+ Args : session .ID ,
207
+ TokenStatus : * tokenStatus ,
208
+ }
209
+ b .sendTask (& task )
210
+ }
0 commit comments