-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathservice_api.go
119 lines (118 loc) · 3.17 KB
/
service_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
package patrol
func (self *Service) apiRequest(
request *API_Request,
) bool {
// CAS Attributes:
//
cas_valid := true
if request.CAS > 0 &&
request.CAS != self.o.GetCAS() {
// CAS does not match!
cas_valid = false
}
if cas_valid {
// keyvalue
if request.KeyValueReplace {
// replace
self.o.ReplaceKeyValue(request.KeyValue)
} else {
// merge
if len(request.KeyValue) > 0 {
self.o.SetKeyValue(request.KeyValue)
}
}
// toggle
if request.Toggle > 0 {
self.toggle(request.Toggle)
}
}
// Non-CAS Attributes:
return cas_valid
}
func (self *Service) toggle(
toggle uint8,
) {
if toggle == API_TOGGLE_STATE_ENABLE {
self.o.SetDisabled(false)
} else if toggle == API_TOGGLE_STATE_DISABLE {
self.o.SetDisabled(true)
self.o.SetRestart(false)
self.o.SetRunOnce(false)
self.o.SetRunOnceConsumed(false)
} else if toggle == API_TOGGLE_STATE_RESTART {
self.o.SetDisabled(false)
self.o.SetRestart(true)
self.o.SetRunOnce(false)
self.o.SetRunOnceConsumed(false)
} else if toggle == API_TOGGLE_STATE_RUNONCE_ENABLE {
self.o.SetRunOnce(true)
if !self.o.GetStarted().IsZero() {
// we're already running, we must consume run_once
self.o.SetRunOnceConsumed(true)
}
} else if toggle == API_TOGGLE_STATE_RUNONCE_DISABLE {
self.o.SetRunOnce(false)
self.o.SetRunOnceConsumed(false)
} else if toggle == API_TOGGLE_STATE_ENABLE_RUNONCE_ENABLE {
self.o.SetDisabled(false)
self.o.SetRunOnce(true)
if !self.o.GetStarted().IsZero() {
// we're already running, we must consume run_once
self.o.SetRunOnceConsumed(true)
}
} else if toggle == API_TOGGLE_STATE_ENABLE_RUNONCE_DISABLE {
self.o.SetDisabled(false)
self.o.SetRunOnce(false)
self.o.SetRunOnceConsumed(false)
}
}
func (self *Service) Snapshot() *API_Response {
self.o.RLock()
defer self.o.RUnlock()
return self.apiResponse(api_endpoint_snapshot)
}
func (self *Service) apiResponse(
endpoint uint8,
) *API_Response {
result := &API_Response{
InstanceID: self.instance_id,
Name: self.config.Name,
Disabled: self.o.IsDisabled(),
Restart: self.o.IsRestart(),
RunOnce: self.o.IsRunOnce(),
Secret: self.config.Secret != "",
CAS: self.o.GetCAS(),
}
if endpoint != api_endpoint_status {
// we don't need these values for individual status objects
result.ID = self.id
result.Group = "service"
// we need to read lock patrol
self.patrol.mu.RLock()
result.Shutdown = self.patrol.shutdown
self.patrol.mu.RUnlock()
}
if endpoint != api_endpoint_udp {
// we don't want either of these for UDP, it's too much data
//
// we're not going to include history in our snapshot, it's too much data to dereference
// if history is needed it should be taken additionally after snapshot
if endpoint != api_endpoint_snapshot {
result.History = self.getHistory()
}
result.KeyValue = self.o.GetKeyValue()
}
if !self.o.GetStarted().IsZero() {
result.Started = &Timestamp{
Time: self.o.GetStarted(),
TimestampFormat: self.patrol.config.Timestamp,
}
}
if !self.o.GetLastSeen().IsZero() {
result.LastSeen = &Timestamp{
Time: self.o.GetLastSeen(),
TimestampFormat: self.patrol.config.Timestamp,
}
}
return result
}