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