1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "livestatus/servicegroupstable.hpp"
4 #include "icinga/servicegroup.hpp"
5 #include "base/configtype.hpp"
6
7 using namespace icinga;
8
ServiceGroupsTable()9 ServiceGroupsTable::ServiceGroupsTable()
10 {
11 AddColumns(this);
12 }
13
AddColumns(Table * table,const String & prefix,const Column::ObjectAccessor & objectAccessor)14 void ServiceGroupsTable::AddColumns(Table *table, const String& prefix,
15 const Column::ObjectAccessor& objectAccessor)
16 {
17 table->AddColumn(prefix + "name", Column(&ServiceGroupsTable::NameAccessor, objectAccessor));
18 table->AddColumn(prefix + "alias", Column(&ServiceGroupsTable::AliasAccessor, objectAccessor));
19 table->AddColumn(prefix + "notes", Column(&ServiceGroupsTable::NotesAccessor, objectAccessor));
20 table->AddColumn(prefix + "notes_url", Column(&ServiceGroupsTable::NotesUrlAccessor, objectAccessor));
21 table->AddColumn(prefix + "action_url", Column(&ServiceGroupsTable::ActionUrlAccessor, objectAccessor));
22 table->AddColumn(prefix + "members", Column(&ServiceGroupsTable::MembersAccessor, objectAccessor));
23 table->AddColumn(prefix + "members_with_state", Column(&ServiceGroupsTable::MembersWithStateAccessor, objectAccessor));
24 table->AddColumn(prefix + "worst_service_state", Column(&ServiceGroupsTable::WorstServiceStateAccessor, objectAccessor));
25 table->AddColumn(prefix + "num_services", Column(&ServiceGroupsTable::NumServicesAccessor, objectAccessor));
26 table->AddColumn(prefix + "num_services_ok", Column(&ServiceGroupsTable::NumServicesOkAccessor, objectAccessor));
27 table->AddColumn(prefix + "num_services_warn", Column(&ServiceGroupsTable::NumServicesWarnAccessor, objectAccessor));
28 table->AddColumn(prefix + "num_services_crit", Column(&ServiceGroupsTable::NumServicesCritAccessor, objectAccessor));
29 table->AddColumn(prefix + "num_services_unknown", Column(&ServiceGroupsTable::NumServicesUnknownAccessor, objectAccessor));
30 table->AddColumn(prefix + "num_services_pending", Column(&ServiceGroupsTable::NumServicesPendingAccessor, objectAccessor));
31 table->AddColumn(prefix + "num_services_hard_ok", Column(&ServiceGroupsTable::NumServicesHardOkAccessor, objectAccessor));
32 table->AddColumn(prefix + "num_services_hard_warn", Column(&ServiceGroupsTable::NumServicesHardWarnAccessor, objectAccessor));
33 table->AddColumn(prefix + "num_services_hard_crit", Column(&ServiceGroupsTable::NumServicesHardCritAccessor, objectAccessor));
34 table->AddColumn(prefix + "num_services_hard_unknown", Column(&ServiceGroupsTable::NumServicesHardUnknownAccessor, objectAccessor));
35 }
36
GetName() const37 String ServiceGroupsTable::GetName() const
38 {
39 return "servicegroups";
40 }
41
GetPrefix() const42 String ServiceGroupsTable::GetPrefix() const
43 {
44 return "servicegroup";
45 }
46
FetchRows(const AddRowFunction & addRowFn)47 void ServiceGroupsTable::FetchRows(const AddRowFunction& addRowFn)
48 {
49 for (const ServiceGroup::Ptr& sg : ConfigType::GetObjectsByType<ServiceGroup>()) {
50 if (!addRowFn(sg, LivestatusGroupByNone, Empty))
51 return;
52 }
53 }
54
NameAccessor(const Value & row)55 Value ServiceGroupsTable::NameAccessor(const Value& row)
56 {
57 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
58
59 if (!sg)
60 return Empty;
61
62 return sg->GetName();
63 }
64
AliasAccessor(const Value & row)65 Value ServiceGroupsTable::AliasAccessor(const Value& row)
66 {
67 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
68
69 if (!sg)
70 return Empty;
71
72 return sg->GetDisplayName();
73 }
74
NotesAccessor(const Value & row)75 Value ServiceGroupsTable::NotesAccessor(const Value& row)
76 {
77 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
78
79 if (!sg)
80 return Empty;
81
82 return sg->GetNotes();
83 }
84
NotesUrlAccessor(const Value & row)85 Value ServiceGroupsTable::NotesUrlAccessor(const Value& row)
86 {
87 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
88
89 if (!sg)
90 return Empty;
91
92 return sg->GetNotesUrl();
93 }
94
ActionUrlAccessor(const Value & row)95 Value ServiceGroupsTable::ActionUrlAccessor(const Value& row)
96 {
97 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
98
99 if (!sg)
100 return Empty;
101
102 return sg->GetActionUrl();
103 }
104
MembersAccessor(const Value & row)105 Value ServiceGroupsTable::MembersAccessor(const Value& row)
106 {
107 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
108
109 if (!sg)
110 return Empty;
111
112 ArrayData result;
113
114 for (const Service::Ptr& service : sg->GetMembers()) {
115 result.push_back(new Array({
116 service->GetHost()->GetName(),
117 service->GetShortName()
118 }));
119 }
120
121 return new Array(std::move(result));
122 }
123
MembersWithStateAccessor(const Value & row)124 Value ServiceGroupsTable::MembersWithStateAccessor(const Value& row)
125 {
126 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
127
128 if (!sg)
129 return Empty;
130
131 ArrayData result;
132
133 for (const Service::Ptr& service : sg->GetMembers()) {
134 result.push_back(new Array({
135 service->GetHost()->GetName(),
136 service->GetShortName(),
137 service->GetHost()->GetState(),
138 service->GetState()
139 }));
140 }
141
142 return new Array(std::move(result));
143 }
144
WorstServiceStateAccessor(const Value & row)145 Value ServiceGroupsTable::WorstServiceStateAccessor(const Value& row)
146 {
147 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
148
149 if (!sg)
150 return Empty;
151
152 Value worst_service = ServiceOK;
153
154 for (const Service::Ptr& service : sg->GetMembers()) {
155 if (service->GetState() > worst_service)
156 worst_service = service->GetState();
157 }
158
159 return worst_service;
160 }
161
NumServicesAccessor(const Value & row)162 Value ServiceGroupsTable::NumServicesAccessor(const Value& row)
163 {
164 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
165
166 if (!sg)
167 return Empty;
168
169 return sg->GetMembers().size();
170 }
171
NumServicesOkAccessor(const Value & row)172 Value ServiceGroupsTable::NumServicesOkAccessor(const Value& row)
173 {
174 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
175
176 if (!sg)
177 return Empty;
178
179 int num_services = 0;
180
181 for (const Service::Ptr& service : sg->GetMembers()) {
182 if (service->GetState() == ServiceOK)
183 num_services++;
184 }
185
186 return num_services;
187 }
188
NumServicesWarnAccessor(const Value & row)189 Value ServiceGroupsTable::NumServicesWarnAccessor(const Value& row)
190 {
191 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
192
193 if (!sg)
194 return Empty;
195
196 int num_services = 0;
197
198 for (const Service::Ptr& service : sg->GetMembers()) {
199 if (service->GetState() == ServiceWarning)
200 num_services++;
201 }
202
203 return num_services;
204 }
205
NumServicesCritAccessor(const Value & row)206 Value ServiceGroupsTable::NumServicesCritAccessor(const Value& row)
207 {
208 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
209
210 if (!sg)
211 return Empty;
212
213 int num_services = 0;
214
215 for (const Service::Ptr& service : sg->GetMembers()) {
216 if (service->GetState() == ServiceCritical)
217 num_services++;
218 }
219
220 return num_services;
221 }
222
NumServicesUnknownAccessor(const Value & row)223 Value ServiceGroupsTable::NumServicesUnknownAccessor(const Value& row)
224 {
225 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
226
227 if (!sg)
228 return Empty;
229
230 int num_services = 0;
231
232 for (const Service::Ptr& service : sg->GetMembers()) {
233 if (service->GetState() == ServiceUnknown)
234 num_services++;
235 }
236
237 return num_services;
238 }
239
NumServicesPendingAccessor(const Value & row)240 Value ServiceGroupsTable::NumServicesPendingAccessor(const Value& row)
241 {
242 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
243
244 if (!sg)
245 return Empty;
246
247 int num_services = 0;
248
249 for (const Service::Ptr& service : sg->GetMembers()) {
250 if (!service->GetLastCheckResult())
251 num_services++;
252 }
253
254 return num_services;
255 }
256
NumServicesHardOkAccessor(const Value & row)257 Value ServiceGroupsTable::NumServicesHardOkAccessor(const Value& row)
258 {
259 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
260
261 if (!sg)
262 return Empty;
263
264 int num_services = 0;
265
266 for (const Service::Ptr& service : sg->GetMembers()) {
267 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceOK)
268 num_services++;
269 }
270
271 return num_services;
272 }
273
NumServicesHardWarnAccessor(const Value & row)274 Value ServiceGroupsTable::NumServicesHardWarnAccessor(const Value& row)
275 {
276 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
277
278 if (!sg)
279 return Empty;
280
281 int num_services = 0;
282
283 for (const Service::Ptr& service : sg->GetMembers()) {
284 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceWarning)
285 num_services++;
286 }
287
288 return num_services;
289 }
290
NumServicesHardCritAccessor(const Value & row)291 Value ServiceGroupsTable::NumServicesHardCritAccessor(const Value& row)
292 {
293 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
294
295 if (!sg)
296 return Empty;
297
298 int num_services = 0;
299
300 for (const Service::Ptr& service : sg->GetMembers()) {
301 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceCritical)
302 num_services++;
303 }
304
305 return num_services;
306 }
307
NumServicesHardUnknownAccessor(const Value & row)308 Value ServiceGroupsTable::NumServicesHardUnknownAccessor(const Value& row)
309 {
310 ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
311
312 if (!sg)
313 return Empty;
314
315 int num_services = 0;
316
317 for (const Service::Ptr& service : sg->GetMembers()) {
318 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceUnknown)
319 num_services++;
320 }
321
322 return num_services;
323 }
324