-
Notifications
You must be signed in to change notification settings - Fork 4
/
patrol_api.go
175 lines (172 loc) · 3.96 KB
/
patrol_api.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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package patrol
import (
"strings"
)
const (
api_endpoint_none = iota
api_endpoint_http
api_endpoint_udp
api_endpoint_status
api_endpoint_snapshot
)
func (self *Patrol) API(
request *API_Request,
) *API_Response {
// do not validate endpoint
return self.api(
api_endpoint_none,
request,
)
}
func (self *Patrol) api(
endpoint uint8,
request *API_Request,
) *API_Response {
if !request.IsValid() {
return &API_Response{
Errors: []string{
"Request NIL",
},
}
}
if request.Ping && (request.Group == "service" ||
request.Group == "services") {
// services don't support Ping currently
return &API_Response{
Errors: []string{
"Services don't support Ping",
},
}
}
request.ID = strings.ToLower(request.ID)
request.Group = strings.ToLower(request.Group)
if request.Group == "app" ||
request.Group == "apps" {
// handle response
a, ok := self.apps[request.ID]
if !ok {
return &API_Response{
Errors: []string{
"Unknown App",
},
}
}
// empty secret?
if a.config.Secret != "" && request.Secret == "" {
// regular request
a.o.Lock()
// NO MODIFICATIONS!!!
// we're going to set CAS invalid just incase our request contained modification data
response := a.apiResponse(endpoint)
a.o.Unlock()
response.CASInvalid = true
return response
}
// validate secret
if a.config.Secret != "" &&
a.config.Secret != request.Secret {
return &API_Response{
Errors: []string{
"Secret Invalid",
},
}
}
// validate endpoint
// validate ping
if request.Ping {
if a.config.KeepAlive != APP_KEEPALIVE_HTTP &&
a.config.KeepAlive != APP_KEEPALIVE_UDP {
// unknown ping method
return &API_Response{
Errors: []string{
"Ping Not Supported",
},
}
}
// validate ping endpoint
if endpoint != api_endpoint_none {
if (a.config.KeepAlive == APP_KEEPALIVE_HTTP && endpoint != api_endpoint_http) ||
(a.config.KeepAlive == APP_KEEPALIVE_UDP && endpoint != api_endpoint_udp) {
return &API_Response{
Errors: []string{
"Invalid Ping Endpoint",
},
}
}
}
}
// validate PID
// PID is the only attribute that is required to be sent with a Ping
if request.PID > 0 {
if a.config.KeepAlive != APP_KEEPALIVE_HTTP &&
a.config.KeepAlive != APP_KEEPALIVE_UDP {
// unknown ping method
return &API_Response{
Errors: []string{
"PID Not Supported",
},
}
}
if !request.Ping {
// bad ping method
return &API_Response{
Errors: []string{
"PID Requires Ping",
},
}
}
}
a.o.Lock()
// we need to process our response before we update our object
// we're interested in returning our previous state, since we know what our new state will be
response := a.apiResponse(endpoint)
// handle request
response.CASInvalid = !a.apiRequest(request)
a.o.Unlock()
return response
} else if request.Group == "service" ||
request.Group == "services" {
// handle response
s, ok := self.services[request.ID]
if !ok {
return &API_Response{
Errors: []string{
"Unknown Service",
},
}
}
// empty secret?
if s.config.Secret != "" && request.Secret == "" {
// regular request
s.o.Lock()
// NO MODIFICATIONS!!!
// we're going to set CAS invalid just incase our request contained modification data
response := s.apiResponse(endpoint)
s.o.Unlock()
response.CASInvalid = true
return response
}
// validate secret
if s.config.Secret != "" &&
s.config.Secret != request.Secret {
return &API_Response{
Errors: []string{
"Secret Invalid",
},
}
}
s.o.Lock()
// we need to process our response before we update our object
// we're interested in returning our previous state, since we know what our new state will be
response := s.apiResponse(endpoint)
// handle request
response.CASInvalid = !s.apiRequest(request)
s.o.Unlock()
return response
}
return &API_Response{
Errors: []string{
"Unknown Group",
},
}
}