]> granicus.if.org Git - icinga2/blob - lib/livestatus/hoststable.cpp
Merge pull request #5555 from Icinga/feature/ecc-certs
[icinga2] / lib / livestatus / hoststable.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/)  *
4  *                                                                            *
5  * This program is free software; you can redistribute it and/or              *
6  * modify it under the terms of the GNU General Public License                *
7  * as published by the Free Software Foundation; either version 2             *
8  * of the License, or (at your option) any later version.                     *
9  *                                                                            *
10  * This program is distributed in the hope that it will be useful,            *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
13  * GNU General Public License for more details.                               *
14  *                                                                            *
15  * You should have received a copy of the GNU General Public License          *
16  * along with this program; if not, write to the Free Software Foundation     *
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
18  ******************************************************************************/
19
20 #include "livestatus/hoststable.hpp"
21 #include "livestatus/hostgroupstable.hpp"
22 #include "livestatus/endpointstable.hpp"
23 #include "icinga/host.hpp"
24 #include "icinga/service.hpp"
25 #include "icinga/hostgroup.hpp"
26 #include "icinga/checkcommand.hpp"
27 #include "icinga/eventcommand.hpp"
28 #include "icinga/timeperiod.hpp"
29 #include "icinga/macroprocessor.hpp"
30 #include "icinga/icingaapplication.hpp"
31 #include "icinga/compatutility.hpp"
32 #include "base/configtype.hpp"
33 #include "base/objectlock.hpp"
34 #include "base/json.hpp"
35 #include "base/convert.hpp"
36 #include "base/utility.hpp"
37 #include <boost/tuple/tuple.hpp>
38 #include <boost/algorithm/string/replace.hpp>
39
40 using namespace icinga;
41
42 HostsTable::HostsTable(LivestatusGroupByType type)
43     :Table(type)
44 {
45         AddColumns(this);
46 }
47
48 void HostsTable::AddColumns(Table *table, const String& prefix,
49     const Column::ObjectAccessor& objectAccessor)
50 {
51         table->AddColumn(prefix + "name", Column(&HostsTable::NameAccessor, objectAccessor));
52         table->AddColumn(prefix + "host_name", Column(&HostsTable::NameAccessor, objectAccessor)); //ugly compatibility hack
53         table->AddColumn(prefix + "display_name", Column(&HostsTable::DisplayNameAccessor, objectAccessor));
54         table->AddColumn(prefix + "alias", Column(&HostsTable::DisplayNameAccessor, objectAccessor));
55         table->AddColumn(prefix + "address", Column(&HostsTable::AddressAccessor, objectAccessor));
56         table->AddColumn(prefix + "address6", Column(&HostsTable::Address6Accessor, objectAccessor));
57         table->AddColumn(prefix + "check_command", Column(&HostsTable::CheckCommandAccessor, objectAccessor));
58         table->AddColumn(prefix + "check_command_expanded", Column(&HostsTable::CheckCommandExpandedAccessor, objectAccessor));
59         table->AddColumn(prefix + "event_handler", Column(&HostsTable::EventHandlerAccessor, objectAccessor));
60         table->AddColumn(prefix + "notification_period", Column(&Table::EmptyStringAccessor, objectAccessor));
61         table->AddColumn(prefix + "check_period", Column(&HostsTable::CheckPeriodAccessor, objectAccessor));
62         table->AddColumn(prefix + "notes", Column(&HostsTable::NotesAccessor, objectAccessor));
63         table->AddColumn(prefix + "notes_expanded", Column(&HostsTable::NotesExpandedAccessor, objectAccessor));
64         table->AddColumn(prefix + "notes_url", Column(&HostsTable::NotesUrlAccessor, objectAccessor));
65         table->AddColumn(prefix + "notes_url_expanded", Column(&HostsTable::NotesUrlExpandedAccessor, objectAccessor));
66         table->AddColumn(prefix + "action_url", Column(&HostsTable::ActionUrlAccessor, objectAccessor));
67         table->AddColumn(prefix + "action_url_expanded", Column(&HostsTable::ActionUrlExpandedAccessor, objectAccessor));
68         table->AddColumn(prefix + "plugin_output", Column(&HostsTable::PluginOutputAccessor, objectAccessor));
69         table->AddColumn(prefix + "perf_data", Column(&HostsTable::PerfDataAccessor, objectAccessor));
70         table->AddColumn(prefix + "icon_image", Column(&HostsTable::IconImageAccessor, objectAccessor));
71         table->AddColumn(prefix + "icon_image_expanded", Column(&HostsTable::IconImageExpandedAccessor, objectAccessor));
72         table->AddColumn(prefix + "icon_image_alt", Column(&HostsTable::IconImageAltAccessor, objectAccessor));
73         table->AddColumn(prefix + "statusmap_image", Column(&Table::EmptyStringAccessor, objectAccessor));
74         table->AddColumn(prefix + "long_plugin_output", Column(&HostsTable::LongPluginOutputAccessor, objectAccessor));
75         table->AddColumn(prefix + "initial_state", Column(&Table::EmptyStringAccessor, objectAccessor));
76         table->AddColumn(prefix + "max_check_attempts", Column(&HostsTable::MaxCheckAttemptsAccessor, objectAccessor));
77         table->AddColumn(prefix + "flap_detection_enabled", Column(&HostsTable::FlapDetectionEnabledAccessor, objectAccessor));
78         table->AddColumn(prefix + "check_freshness", Column(&Table::OneAccessor, objectAccessor));
79         table->AddColumn(prefix + "process_performance_data", Column(&Table::ZeroAccessor, objectAccessor));
80         table->AddColumn(prefix + "accept_passive_checks", Column(&HostsTable::AcceptPassiveChecksAccessor, objectAccessor));
81         table->AddColumn(prefix + "event_handler_enabled", Column(&HostsTable::EventHandlerEnabledAccessor, objectAccessor));
82         table->AddColumn(prefix + "acknowledgement_type", Column(&HostsTable::AcknowledgementTypeAccessor, objectAccessor));
83         table->AddColumn(prefix + "check_type", Column(&HostsTable::CheckTypeAccessor, objectAccessor));
84         table->AddColumn(prefix + "last_state", Column(&HostsTable::LastStateAccessor, objectAccessor));
85         table->AddColumn(prefix + "last_hard_state", Column(&HostsTable::LastHardStateAccessor, objectAccessor));
86         table->AddColumn(prefix + "current_attempt", Column(&HostsTable::CurrentAttemptAccessor, objectAccessor));
87         table->AddColumn(prefix + "last_notification", Column(&HostsTable::LastNotificationAccessor, objectAccessor));
88         table->AddColumn(prefix + "next_notification", Column(&HostsTable::NextNotificationAccessor, objectAccessor));
89         table->AddColumn(prefix + "next_check", Column(&HostsTable::NextCheckAccessor, objectAccessor));
90         table->AddColumn(prefix + "last_hard_state_change", Column(&HostsTable::LastHardStateChangeAccessor, objectAccessor));
91         table->AddColumn(prefix + "has_been_checked", Column(&HostsTable::HasBeenCheckedAccessor, objectAccessor));
92         table->AddColumn(prefix + "current_notification_number", Column(&HostsTable::CurrentNotificationNumberAccessor, objectAccessor));
93         table->AddColumn(prefix + "pending_flex_downtime", Column(&Table::ZeroAccessor, objectAccessor));
94         table->AddColumn(prefix + "total_services", Column(&HostsTable::TotalServicesAccessor, objectAccessor));
95         table->AddColumn(prefix + "checks_enabled", Column(&HostsTable::ChecksEnabledAccessor, objectAccessor));
96         table->AddColumn(prefix + "notifications_enabled", Column(&HostsTable::NotificationsEnabledAccessor, objectAccessor));
97         table->AddColumn(prefix + "acknowledged", Column(&HostsTable::AcknowledgedAccessor, objectAccessor));
98         table->AddColumn(prefix + "state", Column(&HostsTable::StateAccessor, objectAccessor));
99         table->AddColumn(prefix + "state_type", Column(&HostsTable::StateTypeAccessor, objectAccessor));
100         table->AddColumn(prefix + "no_more_notifications", Column(&HostsTable::NoMoreNotificationsAccessor, objectAccessor));
101         table->AddColumn(prefix + "check_flapping_recovery_notification", Column(&Table::ZeroAccessor, objectAccessor));
102         table->AddColumn(prefix + "last_check", Column(&HostsTable::LastCheckAccessor, objectAccessor));
103         table->AddColumn(prefix + "last_state_change", Column(&HostsTable::LastStateChangeAccessor, objectAccessor));
104         table->AddColumn(prefix + "last_time_up", Column(&HostsTable::LastTimeUpAccessor, objectAccessor));
105         table->AddColumn(prefix + "last_time_down", Column(&HostsTable::LastTimeDownAccessor, objectAccessor));
106         table->AddColumn(prefix + "last_time_unreachable", Column(&HostsTable::LastTimeUnreachableAccessor, objectAccessor));
107         table->AddColumn(prefix + "is_flapping", Column(&HostsTable::IsFlappingAccessor, objectAccessor));
108         table->AddColumn(prefix + "scheduled_downtime_depth", Column(&HostsTable::ScheduledDowntimeDepthAccessor, objectAccessor));
109         table->AddColumn(prefix + "is_executing", Column(&Table::ZeroAccessor, objectAccessor));
110         table->AddColumn(prefix + "active_checks_enabled", Column(&HostsTable::ActiveChecksEnabledAccessor, objectAccessor));
111         table->AddColumn(prefix + "check_options", Column(&HostsTable::CheckOptionsAccessor, objectAccessor));
112         table->AddColumn(prefix + "obsess_over_host", Column(&Table::ZeroAccessor, objectAccessor));
113         table->AddColumn(prefix + "modified_attributes", Column(&Table::ZeroAccessor, objectAccessor));
114         table->AddColumn(prefix + "modified_attributes_list", Column(&Table::ZeroAccessor, objectAccessor));
115         table->AddColumn(prefix + "check_interval", Column(&HostsTable::CheckIntervalAccessor, objectAccessor));
116         table->AddColumn(prefix + "retry_interval", Column(&HostsTable::RetryIntervalAccessor, objectAccessor));
117         table->AddColumn(prefix + "notification_interval", Column(&HostsTable::NotificationIntervalAccessor, objectAccessor));
118         table->AddColumn(prefix + "first_notification_delay", Column(&Table::EmptyStringAccessor, objectAccessor));
119         table->AddColumn(prefix + "low_flap_threshold", Column(&HostsTable::LowFlapThresholdAccessor, objectAccessor));
120         table->AddColumn(prefix + "high_flap_threshold", Column(&HostsTable::HighFlapThresholdAccessor, objectAccessor));
121         table->AddColumn(prefix + "x_3d", Column(&EmptyStringAccessor, objectAccessor));
122         table->AddColumn(prefix + "y_3d", Column(&EmptyStringAccessor, objectAccessor));
123         table->AddColumn(prefix + "z_3d", Column(&EmptyStringAccessor, objectAccessor));
124         table->AddColumn(prefix + "x_2d", Column(&Table::EmptyStringAccessor, objectAccessor));
125         table->AddColumn(prefix + "y_2d", Column(&Table::EmptyStringAccessor, objectAccessor));
126         table->AddColumn(prefix + "latency", Column(&HostsTable::LatencyAccessor, objectAccessor));
127         table->AddColumn(prefix + "execution_time", Column(&HostsTable::ExecutionTimeAccessor, objectAccessor));
128         table->AddColumn(prefix + "percent_state_change", Column(&HostsTable::PercentStateChangeAccessor, objectAccessor));
129         table->AddColumn(prefix + "in_notification_period", Column(&HostsTable::InNotificationPeriodAccessor, objectAccessor));
130         table->AddColumn(prefix + "in_check_period", Column(&HostsTable::InCheckPeriodAccessor, objectAccessor));
131         table->AddColumn(prefix + "contacts", Column(&HostsTable::ContactsAccessor, objectAccessor));
132         table->AddColumn(prefix + "downtimes", Column(&HostsTable::DowntimesAccessor, objectAccessor));
133         table->AddColumn(prefix + "downtimes_with_info", Column(&HostsTable::DowntimesWithInfoAccessor, objectAccessor));
134         table->AddColumn(prefix + "comments", Column(&HostsTable::CommentsAccessor, objectAccessor));
135         table->AddColumn(prefix + "comments_with_info", Column(&HostsTable::CommentsWithInfoAccessor, objectAccessor));
136         table->AddColumn(prefix + "comments_with_extra_info", Column(&HostsTable::CommentsWithExtraInfoAccessor, objectAccessor));
137         table->AddColumn(prefix + "custom_variable_names", Column(&HostsTable::CustomVariableNamesAccessor, objectAccessor));
138         table->AddColumn(prefix + "custom_variable_values", Column(&HostsTable::CustomVariableValuesAccessor, objectAccessor));
139         table->AddColumn(prefix + "custom_variables", Column(&HostsTable::CustomVariablesAccessor, objectAccessor));
140         table->AddColumn(prefix + "filename", Column(&Table::EmptyStringAccessor, objectAccessor));
141         table->AddColumn(prefix + "parents", Column(&HostsTable::ParentsAccessor, objectAccessor));
142         table->AddColumn(prefix + "childs", Column(&HostsTable::ChildsAccessor, objectAccessor));
143         table->AddColumn(prefix + "num_services", Column(&HostsTable::NumServicesAccessor, objectAccessor));
144         table->AddColumn(prefix + "worst_service_state", Column(&HostsTable::WorstServiceStateAccessor, objectAccessor));
145         table->AddColumn(prefix + "num_services_ok", Column(&HostsTable::NumServicesOkAccessor, objectAccessor));
146         table->AddColumn(prefix + "num_services_warn", Column(&HostsTable::NumServicesWarnAccessor, objectAccessor));
147         table->AddColumn(prefix + "num_services_crit", Column(&HostsTable::NumServicesCritAccessor, objectAccessor));
148         table->AddColumn(prefix + "num_services_unknown", Column(&HostsTable::NumServicesUnknownAccessor, objectAccessor));
149         table->AddColumn(prefix + "num_services_pending", Column(&HostsTable::NumServicesPendingAccessor, objectAccessor));
150         table->AddColumn(prefix + "worst_service_hard_state", Column(&HostsTable::WorstServiceHardStateAccessor, objectAccessor));
151         table->AddColumn(prefix + "num_services_hard_ok", Column(&HostsTable::NumServicesHardOkAccessor, objectAccessor));
152         table->AddColumn(prefix + "num_services_hard_warn", Column(&HostsTable::NumServicesHardWarnAccessor, objectAccessor));
153         table->AddColumn(prefix + "num_services_hard_crit", Column(&HostsTable::NumServicesHardCritAccessor, objectAccessor));
154         table->AddColumn(prefix + "num_services_hard_unknown", Column(&HostsTable::NumServicesHardUnknownAccessor, objectAccessor));
155         table->AddColumn(prefix + "hard_state", Column(&HostsTable::HardStateAccessor, objectAccessor));
156         table->AddColumn(prefix + "pnpgraph_present", Column(&Table::ZeroAccessor, objectAccessor));
157         table->AddColumn(prefix + "staleness", Column(&HostsTable::StalenessAccessor, objectAccessor));
158         table->AddColumn(prefix + "groups", Column(&HostsTable::GroupsAccessor, objectAccessor));
159         table->AddColumn(prefix + "contact_groups", Column(&HostsTable::ContactGroupsAccessor, objectAccessor));
160         table->AddColumn(prefix + "services", Column(&HostsTable::ServicesAccessor, objectAccessor));
161         table->AddColumn(prefix + "services_with_state", Column(&HostsTable::ServicesWithStateAccessor, objectAccessor));
162         table->AddColumn(prefix + "services_with_info", Column(&HostsTable::ServicesWithInfoAccessor, objectAccessor));
163         table->AddColumn(prefix + "check_source", Column(&HostsTable::CheckSourceAccessor, objectAccessor));
164         table->AddColumn(prefix + "is_reachable", Column(&HostsTable::IsReachableAccessor, objectAccessor));
165         table->AddColumn(prefix + "cv_is_json", Column(&HostsTable::CVIsJsonAccessor, objectAccessor));
166         table->AddColumn(prefix + "original_attributes", Column(&HostsTable::OriginalAttributesAccessor, objectAccessor));
167
168         /* add additional group by values received through the object accessor */
169         if (table->GetGroupByType() == LivestatusGroupByHostGroup) {
170                 /* _1 = row, _2 = groupByType, _3 = groupByObject */
171                 Log(LogDebug, "Livestatus")
172                     << "Processing hosts group by hostgroup table.";
173                 HostGroupsTable::AddColumns(table, "hostgroup_", boost::bind(&HostsTable::HostGroupAccessor, _1, _2, _3));
174         }
175 }
176
177 String HostsTable::GetName(void) const
178 {
179         return "hosts";
180 }
181
182 String HostsTable::GetPrefix(void) const
183 {
184         return "host";
185 }
186
187 void HostsTable::FetchRows(const AddRowFunction& addRowFn)
188 {
189         if (GetGroupByType() == LivestatusGroupByHostGroup) {
190                 for (const HostGroup::Ptr& hg : ConfigType::GetObjectsByType<HostGroup>()) {
191                         for (const Host::Ptr& host : hg->GetMembers()) {
192                                 /* the caller must know which groupby type and value are set for this row */
193                                 if (!addRowFn(host, LivestatusGroupByHostGroup, hg))
194                                         return;
195                         }
196                 }
197         } else {
198                 for (const Host::Ptr& host : ConfigType::GetObjectsByType<Host>()) {
199                         if (!addRowFn(host, LivestatusGroupByNone, Empty))
200                                 return;
201                 }
202         }
203 }
204
205 Object::Ptr HostsTable::HostGroupAccessor(const Value& row, LivestatusGroupByType groupByType, const Object::Ptr& groupByObject)
206 {
207         /* return the current group by value set from within FetchRows()
208          * this is the hostgrouo object used for the table join inside
209          * in AddColumns()
210          */
211         if (groupByType == LivestatusGroupByHostGroup)
212                 return groupByObject;
213
214         return Object::Ptr();
215 }
216
217 Value HostsTable::NameAccessor(const Value& row)
218 {
219         Host::Ptr host = static_cast<Host::Ptr>(row);
220
221         if (!host)
222                 return Empty;
223
224         return host->GetName();
225 }
226
227 Value HostsTable::DisplayNameAccessor(const Value& row)
228 {
229         Host::Ptr host = static_cast<Host::Ptr>(row);
230
231         if (!host)
232                 return Empty;
233
234         return host->GetDisplayName();
235 }
236
237 Value HostsTable::AddressAccessor(const Value& row)
238 {
239         Host::Ptr host = static_cast<Host::Ptr>(row);
240
241         if (!host)
242                 return Empty;
243
244         return host->GetAddress();
245 }
246
247 Value HostsTable::Address6Accessor(const Value& row)
248 {
249         Host::Ptr host = static_cast<Host::Ptr>(row);
250
251         if (!host)
252                 return Empty;
253
254         return host->GetAddress6();
255 }
256
257 Value HostsTable::CheckCommandAccessor(const Value& row)
258 {
259         Host::Ptr host = static_cast<Host::Ptr>(row);
260
261         if (!host)
262                 return Empty;
263
264         CheckCommand::Ptr checkcommand = host->GetCheckCommand();
265         if (checkcommand)
266                 return CompatUtility::GetCommandName(checkcommand) + "!" + CompatUtility::GetCheckableCommandArgs(host);
267
268         return Empty;
269 }
270
271 Value HostsTable::CheckCommandExpandedAccessor(const Value& row)
272 {
273         Host::Ptr host = static_cast<Host::Ptr>(row);
274
275         if (!host)
276                 return Empty;
277
278         CheckCommand::Ptr checkcommand = host->GetCheckCommand();
279         if (checkcommand)
280                 return CompatUtility::GetCommandName(checkcommand) + "!" + CompatUtility::GetCheckableCommandArgs(host);
281
282         return Empty;
283 }
284
285 Value HostsTable::EventHandlerAccessor(const Value& row)
286 {
287         Host::Ptr host = static_cast<Host::Ptr>(row);
288
289         if (!host)
290                 return Empty;
291
292         EventCommand::Ptr eventcommand = host->GetEventCommand();
293         if (eventcommand)
294                 return CompatUtility::GetCommandName(eventcommand);
295
296         return Empty;
297 }
298
299 Value HostsTable::CheckPeriodAccessor(const Value& row)
300 {
301         Host::Ptr host = static_cast<Host::Ptr>(row);
302
303         if (!host)
304                 return Empty;
305
306         return CompatUtility::GetCheckableCheckPeriod(host);
307 }
308
309 Value HostsTable::NotesAccessor(const Value& row)
310 {
311         Host::Ptr host = static_cast<Host::Ptr>(row);
312
313         if (!host)
314                 return Empty;
315
316         return host->GetNotes();
317 }
318
319 Value HostsTable::NotesExpandedAccessor(const Value& row)
320 {
321         Host::Ptr host = static_cast<Host::Ptr>(row);
322
323         if (!host)
324                 return Empty;
325
326         MacroProcessor::ResolverList resolvers;
327         resolvers.push_back(std::make_pair("host", host));
328         resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
329
330         return MacroProcessor::ResolveMacros(host->GetNotes(), resolvers, CheckResult::Ptr());
331 }
332
333 Value HostsTable::NotesUrlAccessor(const Value& row)
334 {
335         Host::Ptr host = static_cast<Host::Ptr>(row);
336
337         if (!host)
338                 return Empty;
339
340         return host->GetNotesUrl();
341 }
342
343 Value HostsTable::NotesUrlExpandedAccessor(const Value& row)
344 {
345         Host::Ptr host = static_cast<Host::Ptr>(row);
346
347         if (!host)
348                 return Empty;
349
350         MacroProcessor::ResolverList resolvers;
351         resolvers.push_back(std::make_pair("host", host));
352         resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
353
354         return MacroProcessor::ResolveMacros(host->GetNotesUrl(), resolvers);
355 }
356
357 Value HostsTable::ActionUrlAccessor(const Value& row)
358 {
359         Host::Ptr host = static_cast<Host::Ptr>(row);
360
361         if (!host)
362                 return Empty;
363
364         return host->GetActionUrl();
365 }
366
367 Value HostsTable::ActionUrlExpandedAccessor(const Value& row)
368 {
369         Host::Ptr host = static_cast<Host::Ptr>(row);
370
371         if (!host)
372                 return Empty;
373
374         MacroProcessor::ResolverList resolvers;
375         resolvers.push_back(std::make_pair("host", host));
376         resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
377
378         return MacroProcessor::ResolveMacros(host->GetActionUrl(), resolvers);
379 }
380
381 Value HostsTable::PluginOutputAccessor(const Value& row)
382 {
383         Host::Ptr host = static_cast<Host::Ptr>(row);
384
385         if (!host)
386                 return Empty;
387
388         String output;
389         CheckResult::Ptr cr = host->GetLastCheckResult();
390
391         if (cr)
392                 output = CompatUtility::GetCheckResultOutput(cr);
393
394         return output;
395 }
396
397 Value HostsTable::PerfDataAccessor(const Value& row)
398 {
399         Host::Ptr host = static_cast<Host::Ptr>(row);
400
401         if (!host)
402                 return Empty;
403
404         String perfdata;
405         CheckResult::Ptr cr = host->GetLastCheckResult();
406
407         if (cr)
408                 perfdata = CompatUtility::GetCheckResultPerfdata(cr);
409
410         return perfdata;
411 }
412
413 Value HostsTable::IconImageAccessor(const Value& row)
414 {
415         Host::Ptr host = static_cast<Host::Ptr>(row);
416
417         if (!host)
418                 return Empty;
419
420         return host->GetIconImage();
421 }
422
423 Value HostsTable::IconImageExpandedAccessor(const Value& row)
424 {
425         Host::Ptr host = static_cast<Host::Ptr>(row);
426
427         if (!host)
428                 return Empty;
429
430         MacroProcessor::ResolverList resolvers;
431         resolvers.push_back(std::make_pair("host", host));
432         resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
433
434         return MacroProcessor::ResolveMacros(host->GetIconImage(), resolvers);
435 }
436
437 Value HostsTable::IconImageAltAccessor(const Value& row)
438 {
439         Host::Ptr host = static_cast<Host::Ptr>(row);
440
441         if (!host)
442                 return Empty;
443
444         return host->GetIconImageAlt();
445 }
446
447 Value HostsTable::LongPluginOutputAccessor(const Value& row)
448 {
449         Host::Ptr host = static_cast<Host::Ptr>(row);
450
451         if (!host)
452                 return Empty;
453
454         String long_output;
455         CheckResult::Ptr cr = host->GetLastCheckResult();
456
457         if (cr)
458                 long_output = CompatUtility::GetCheckResultLongOutput(cr);
459
460         return long_output;
461 }
462
463 Value HostsTable::MaxCheckAttemptsAccessor(const Value& row)
464 {
465         Host::Ptr host = static_cast<Host::Ptr>(row);
466
467         if (!host)
468                 return Empty;
469
470         return host->GetMaxCheckAttempts();
471 }
472
473 Value HostsTable::FlapDetectionEnabledAccessor(const Value& row)
474 {
475         Host::Ptr host = static_cast<Host::Ptr>(row);
476
477         if (!host)
478                 return Empty;
479
480         return CompatUtility::GetCheckableFlapDetectionEnabled(host);
481 }
482
483 Value HostsTable::AcceptPassiveChecksAccessor(const Value& row)
484 {
485         Host::Ptr host = static_cast<Host::Ptr>(row);
486
487         if (!host)
488                 return Empty;
489
490         return CompatUtility::GetCheckablePassiveChecksEnabled(host);
491 }
492
493 Value HostsTable::EventHandlerEnabledAccessor(const Value& row)
494 {
495         Host::Ptr host = static_cast<Host::Ptr>(row);
496
497         if (!host)
498                 return Empty;
499
500         return CompatUtility::GetCheckableEventHandlerEnabled(host);
501 }
502
503 Value HostsTable::AcknowledgementTypeAccessor(const Value& row)
504 {
505         Host::Ptr host = static_cast<Host::Ptr>(row);
506
507         if (!host)
508                 return Empty;
509
510         ObjectLock olock(host);
511         return CompatUtility::GetCheckableAcknowledgementType(host);
512 }
513
514 Value HostsTable::CheckTypeAccessor(const Value& row)
515 {
516         Host::Ptr host = static_cast<Host::Ptr>(row);
517
518         if (!host)
519                 return Empty;
520
521         return CompatUtility::GetCheckableCheckType(host);
522 }
523
524 Value HostsTable::LastStateAccessor(const Value& row)
525 {
526         Host::Ptr host = static_cast<Host::Ptr>(row);
527
528         if (!host)
529                 return Empty;
530
531         return host->GetLastState();
532 }
533
534 Value HostsTable::LastHardStateAccessor(const Value& row)
535 {
536         Host::Ptr host = static_cast<Host::Ptr>(row);
537
538         if (!host)
539                 return Empty;
540
541         return host->GetLastHardState();
542 }
543
544 Value HostsTable::CurrentAttemptAccessor(const Value& row)
545 {
546         Host::Ptr host = static_cast<Host::Ptr>(row);
547
548         if (!host)
549                 return Empty;
550
551         return host->GetCheckAttempt();
552 }
553
554 Value HostsTable::LastNotificationAccessor(const Value& row)
555 {
556         Host::Ptr host = static_cast<Host::Ptr>(row);
557
558         if (!host)
559                 return Empty;
560
561         return CompatUtility::GetCheckableNotificationLastNotification(host);
562 }
563
564 Value HostsTable::NextNotificationAccessor(const Value& row)
565 {
566         Host::Ptr host = static_cast<Host::Ptr>(row);
567
568         if (!host)
569                 return Empty;
570
571         return CompatUtility::GetCheckableNotificationNextNotification(host);
572 }
573
574 Value HostsTable::NextCheckAccessor(const Value& row)
575 {
576         Host::Ptr host = static_cast<Host::Ptr>(row);
577
578         if (!host)
579                 return Empty;
580
581         return static_cast<int>(host->GetNextCheck());
582 }
583
584 Value HostsTable::LastHardStateChangeAccessor(const Value& row)
585 {
586         Host::Ptr host = static_cast<Host::Ptr>(row);
587
588         if (!host)
589                 return Empty;
590
591         return static_cast<int>(host->GetLastHardStateChange());
592 }
593
594 Value HostsTable::HasBeenCheckedAccessor(const Value& row)
595 {
596         Host::Ptr host = static_cast<Host::Ptr>(row);
597
598         if (!host)
599                 return Empty;
600
601         return CompatUtility::GetCheckableHasBeenChecked(host);
602 }
603
604 Value HostsTable::CurrentNotificationNumberAccessor(const Value& row)
605 {
606         Host::Ptr host = static_cast<Host::Ptr>(row);
607
608         if (!host)
609                 return Empty;
610
611         return CompatUtility::GetCheckableNotificationNotificationNumber(host);
612 }
613
614 Value HostsTable::TotalServicesAccessor(const Value& row)
615 {
616         Host::Ptr host = static_cast<Host::Ptr>(row);
617
618         if (!host)
619                 return Empty;
620
621         return host->GetTotalServices();
622 }
623
624 Value HostsTable::ChecksEnabledAccessor(const Value& row)
625 {
626         Host::Ptr host = static_cast<Host::Ptr>(row);
627
628         if (!host)
629                 return Empty;
630
631         return CompatUtility::GetCheckableActiveChecksEnabled(host);
632 }
633
634 Value HostsTable::NotificationsEnabledAccessor(const Value& row)
635 {
636         Host::Ptr host = static_cast<Host::Ptr>(row);
637
638         if (!host)
639                 return Empty;
640
641         return CompatUtility::GetCheckableNotificationsEnabled(host);
642 }
643
644 Value HostsTable::AcknowledgedAccessor(const Value& row)
645 {
646         Host::Ptr host = static_cast<Host::Ptr>(row);
647
648         if (!host)
649                 return Empty;
650
651         ObjectLock olock(host);
652         return CompatUtility::GetCheckableIsAcknowledged(host);
653 }
654
655 Value HostsTable::StateAccessor(const Value& row)
656 {
657         Host::Ptr host = static_cast<Host::Ptr>(row);
658
659         if (!host)
660                 return Empty;
661
662         return host->IsReachable() ? host->GetState() : 2;
663 }
664
665 Value HostsTable::StateTypeAccessor(const Value& row)
666 {
667         Host::Ptr host = static_cast<Host::Ptr>(row);
668
669         if (!host)
670                 return Empty;
671
672         return host->GetStateType();
673 }
674
675 Value HostsTable::NoMoreNotificationsAccessor(const Value& row)
676 {
677         Host::Ptr host = static_cast<Host::Ptr>(row);
678
679         if (!host)
680                 return Empty;
681
682         return CompatUtility::GetCheckableNoMoreNotifications(host);
683 }
684
685 Value HostsTable::LastCheckAccessor(const Value& row)
686 {
687         Host::Ptr host = static_cast<Host::Ptr>(row);
688
689         if (!host)
690                 return Empty;
691
692         return static_cast<int>(host->GetLastCheck());
693 }
694
695 Value HostsTable::LastStateChangeAccessor(const Value& row)
696 {
697         Host::Ptr host = static_cast<Host::Ptr>(row);
698
699         if (!host)
700                 return Empty;
701
702         return static_cast<int>(host->GetLastStateChange());
703 }
704
705 Value HostsTable::LastTimeUpAccessor(const Value& row)
706 {
707         Host::Ptr host = static_cast<Host::Ptr>(row);
708
709         if (!host)
710                 return Empty;
711
712         return static_cast<int>(host->GetLastStateUp());
713 }
714
715 Value HostsTable::LastTimeDownAccessor(const Value& row)
716 {
717         Host::Ptr host = static_cast<Host::Ptr>(row);
718
719         if (!host)
720                 return Empty;
721
722         return static_cast<int>(host->GetLastStateDown());
723 }
724
725 Value HostsTable::LastTimeUnreachableAccessor(const Value& row)
726 {
727         Host::Ptr host = static_cast<Host::Ptr>(row);
728
729         if (!host)
730                 return Empty;
731
732         return static_cast<int>(host->GetLastStateUnreachable());
733 }
734
735 Value HostsTable::IsFlappingAccessor(const Value& row)
736 {
737         Host::Ptr host = static_cast<Host::Ptr>(row);
738
739         if (!host)
740                 return Empty;
741
742         return host->IsFlapping();
743 }
744
745 Value HostsTable::ScheduledDowntimeDepthAccessor(const Value& row)
746 {
747         Host::Ptr host = static_cast<Host::Ptr>(row);
748
749         if (!host)
750                 return Empty;
751
752         return host->GetDowntimeDepth();
753 }
754
755 Value HostsTable::ActiveChecksEnabledAccessor(const Value& row)
756 {
757         Host::Ptr host = static_cast<Host::Ptr>(row);
758
759         if (!host)
760                 return Empty;
761
762         return CompatUtility::GetCheckableActiveChecksEnabled(host);
763 }
764
765 Value HostsTable::CheckOptionsAccessor(const Value&)
766 {
767         /* TODO - forcexec, freshness, orphan, none */
768         return Empty;
769 }
770
771 Value HostsTable::CheckIntervalAccessor(const Value& row)
772 {
773         Host::Ptr host = static_cast<Host::Ptr>(row);
774
775         if (!host)
776                 return Empty;
777
778         return CompatUtility::GetCheckableCheckInterval(host);
779 }
780
781 Value HostsTable::RetryIntervalAccessor(const Value& row)
782 {
783         Host::Ptr host = static_cast<Host::Ptr>(row);
784
785         if (!host)
786                 return Empty;
787
788         return CompatUtility::GetCheckableRetryInterval(host);
789 }
790
791 Value HostsTable::NotificationIntervalAccessor(const Value& row)
792 {
793         Host::Ptr host = static_cast<Host::Ptr>(row);
794
795         if (!host)
796                 return Empty;
797
798         return CompatUtility::GetCheckableNotificationNotificationInterval(host);
799 }
800
801 Value HostsTable::LowFlapThresholdAccessor(const Value& row)
802 {
803         Host::Ptr host = static_cast<Host::Ptr>(row);
804
805         if (!host)
806                 return Empty;
807
808         return CompatUtility::GetCheckableLowFlapThreshold(host);
809 }
810
811 Value HostsTable::HighFlapThresholdAccessor(const Value& row)
812 {
813         Host::Ptr host = static_cast<Host::Ptr>(row);
814
815         if (!host)
816                 return Empty;
817
818         return CompatUtility::GetCheckableHighFlapThreshold(host);
819 }
820
821 Value HostsTable::LatencyAccessor(const Value& row)
822 {
823         Host::Ptr host = static_cast<Host::Ptr>(row);
824
825         if (!host)
826                 return Empty;
827
828         CheckResult::Ptr cr = host->GetLastCheckResult();
829
830         if (!cr)
831                 return Empty;
832
833         return cr->CalculateLatency();
834 }
835
836 Value HostsTable::ExecutionTimeAccessor(const Value& row)
837 {
838         Host::Ptr host = static_cast<Host::Ptr>(row);
839
840         if (!host)
841                 return Empty;
842
843         CheckResult::Ptr cr = host->GetLastCheckResult();
844
845         if (!cr)
846                 return Empty;
847
848         return cr->CalculateExecutionTime();
849 }
850
851 Value HostsTable::PercentStateChangeAccessor(const Value& row)
852 {
853         Host::Ptr host = static_cast<Host::Ptr>(row);
854
855         if (!host)
856                 return Empty;
857
858         return CompatUtility::GetCheckablePercentStateChange(host);
859 }
860
861 Value HostsTable::InNotificationPeriodAccessor(const Value& row)
862 {
863         Host::Ptr host = static_cast<Host::Ptr>(row);
864
865         if (!host)
866                 return Empty;
867
868         return CompatUtility::GetCheckableInNotificationPeriod(host);
869 }
870
871 Value HostsTable::InCheckPeriodAccessor(const Value& row)
872 {
873         Host::Ptr host = static_cast<Host::Ptr>(row);
874
875         if (!host)
876                 return Empty;
877
878         return CompatUtility::GetCheckableInCheckPeriod(host);
879 }
880
881 Value HostsTable::ContactsAccessor(const Value& row)
882 {
883         Host::Ptr host = static_cast<Host::Ptr>(row);
884
885         if (!host)
886                 return Empty;
887
888         Array::Ptr contact_names = new Array();
889
890         for (const User::Ptr& user : CompatUtility::GetCheckableNotificationUsers(host)) {
891                 contact_names->Add(user->GetName());
892         }
893
894         return contact_names;
895 }
896
897 Value HostsTable::DowntimesAccessor(const Value& row)
898 {
899         Host::Ptr host = static_cast<Host::Ptr>(row);
900
901         if (!host)
902                 return Empty;
903
904         Array::Ptr results = new Array();
905
906         for (const Downtime::Ptr& downtime : host->GetDowntimes()) {
907                 if (downtime->IsExpired())
908                         continue;
909
910                 results->Add(downtime->GetLegacyId());
911         }
912
913         return results;
914 }
915
916 Value HostsTable::DowntimesWithInfoAccessor(const Value& row)
917 {
918         Host::Ptr host = static_cast<Host::Ptr>(row);
919
920         if (!host)
921                 return Empty;
922
923         Array::Ptr results = new Array();
924
925         for (const Downtime::Ptr& downtime : host->GetDowntimes()) {
926                 if (downtime->IsExpired())
927                         continue;
928
929                 Array::Ptr downtime_info = new Array();
930                 downtime_info->Add(downtime->GetLegacyId());
931                 downtime_info->Add(downtime->GetAuthor());
932                 downtime_info->Add(downtime->GetComment());
933                 results->Add(downtime_info);
934         }
935
936         return results;
937 }
938
939 Value HostsTable::CommentsAccessor(const Value& row)
940 {
941         Host::Ptr host = static_cast<Host::Ptr>(row);
942
943         if (!host)
944                 return Empty;
945
946         Array::Ptr results = new Array();
947         for (const Comment::Ptr& comment : host->GetComments()) {
948                 if (comment->IsExpired())
949                         continue;
950
951                 results->Add(comment->GetLegacyId());
952         }
953
954         return results;
955 }
956
957 Value HostsTable::CommentsWithInfoAccessor(const Value& row)
958 {
959         Host::Ptr host = static_cast<Host::Ptr>(row);
960
961         if (!host)
962                 return Empty;
963
964         Array::Ptr results = new Array();
965
966         for (const Comment::Ptr& comment : host->GetComments()) {
967                 if (comment->IsExpired())
968                         continue;
969
970                 Array::Ptr comment_info = new Array();
971                 comment_info->Add(comment->GetLegacyId());
972                 comment_info->Add(comment->GetAuthor());
973                 comment_info->Add(comment->GetText());
974                 results->Add(comment_info);
975         }
976
977         return results;
978 }
979
980 Value HostsTable::CommentsWithExtraInfoAccessor(const Value& row)
981 {
982         Host::Ptr host = static_cast<Host::Ptr>(row);
983
984         if (!host)
985                 return Empty;
986
987         Array::Ptr results = new Array();
988
989         for (const Comment::Ptr& comment : host->GetComments()) {
990                 if (comment->IsExpired())
991                         continue;
992
993                 Array::Ptr comment_info = new Array();
994                 comment_info->Add(comment->GetLegacyId());
995                 comment_info->Add(comment->GetAuthor());
996                 comment_info->Add(comment->GetText());
997                 comment_info->Add(comment->GetEntryType());
998                 comment_info->Add(static_cast<int>(comment->GetEntryTime()));
999                 results->Add(comment_info);
1000         }
1001
1002         return results;
1003 }
1004
1005 Value HostsTable::CustomVariableNamesAccessor(const Value& row)
1006 {
1007         Host::Ptr host = static_cast<Host::Ptr>(row);
1008
1009         if (!host)
1010                 return Empty;
1011
1012         Dictionary::Ptr vars;
1013
1014         {
1015                 ObjectLock olock(host);
1016                 vars = CompatUtility::GetCustomAttributeConfig(host);
1017         }
1018
1019         Array::Ptr cv = new Array();
1020
1021         if (!vars)
1022                 return cv;
1023
1024         ObjectLock olock(vars);
1025         for (const Dictionary::Pair& kv : vars) {
1026                 cv->Add(kv.first);
1027         }
1028
1029         return cv;
1030 }
1031
1032 Value HostsTable::CustomVariableValuesAccessor(const Value& row)
1033 {
1034         Host::Ptr host = static_cast<Host::Ptr>(row);
1035
1036         if (!host)
1037                 return Empty;
1038
1039         Dictionary::Ptr vars;
1040
1041         {
1042                 ObjectLock olock(host);
1043                 vars = CompatUtility::GetCustomAttributeConfig(host);
1044         }
1045
1046         Array::Ptr cv = new Array();
1047
1048         if (!vars)
1049                 return cv;
1050
1051         ObjectLock olock(vars);
1052         for (const Dictionary::Pair& kv : vars) {
1053                 if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
1054                         cv->Add(JsonEncode(kv.second));
1055                 else
1056                         cv->Add(kv.second);
1057         }
1058
1059         return cv;
1060 }
1061
1062 Value HostsTable::CustomVariablesAccessor(const Value& row)
1063 {
1064         Host::Ptr host = static_cast<Host::Ptr>(row);
1065
1066         if (!host)
1067                 return Empty;
1068
1069         Dictionary::Ptr vars;
1070
1071         {
1072                 ObjectLock olock(host);
1073                 vars = CompatUtility::GetCustomAttributeConfig(host);
1074         }
1075
1076         Array::Ptr cv = new Array();
1077
1078         if (!vars)
1079                 return cv;
1080
1081         ObjectLock olock(vars);
1082         for (const Dictionary::Pair& kv : vars) {
1083                 Array::Ptr key_val = new Array();
1084                 key_val->Add(kv.first);
1085
1086                 if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
1087                         key_val->Add(JsonEncode(kv.second));
1088                 else
1089                         key_val->Add(kv.second);
1090
1091                 cv->Add(key_val);
1092         }
1093
1094         return cv;
1095 }
1096
1097 Value HostsTable::CVIsJsonAccessor(const Value& row)
1098 {
1099         Host::Ptr host = static_cast<Host::Ptr>(row);
1100
1101         if (!host)
1102                 return Empty;
1103
1104         Dictionary::Ptr vars;
1105
1106         {
1107                 ObjectLock olock(host);
1108                 vars = CompatUtility::GetCustomAttributeConfig(host);
1109         }
1110
1111         if (!vars)
1112                 return Empty;
1113
1114         bool cv_is_json = false;
1115
1116         ObjectLock olock(vars);
1117         for (const Dictionary::Pair& kv : vars) {
1118                 if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
1119                         cv_is_json = true;
1120         }
1121
1122         return cv_is_json;
1123 }
1124
1125 Value HostsTable::ParentsAccessor(const Value& row)
1126 {
1127         Host::Ptr host = static_cast<Host::Ptr>(row);
1128
1129         if (!host)
1130                 return Empty;
1131
1132         Array::Ptr parents = new Array();
1133
1134         for (const Checkable::Ptr& parent : host->GetParents()) {
1135                 Host::Ptr parent_host = dynamic_pointer_cast<Host>(parent);
1136
1137                 if (!parent_host)
1138                         continue;
1139
1140                 parents->Add(parent_host->GetName());
1141         }
1142
1143         return parents;
1144 }
1145
1146 Value HostsTable::ChildsAccessor(const Value& row)
1147 {
1148         Host::Ptr host = static_cast<Host::Ptr>(row);
1149
1150         if (!host)
1151                 return Empty;
1152
1153         Array::Ptr childs = new Array();
1154
1155         for (const Checkable::Ptr& child : host->GetChildren()) {
1156                 Host::Ptr child_host = dynamic_pointer_cast<Host>(child);
1157
1158                 if (!child_host)
1159                         continue;
1160
1161                 childs->Add(child_host->GetName());
1162         }
1163
1164         return childs;
1165 }
1166
1167 Value HostsTable::NumServicesAccessor(const Value& row)
1168 {
1169         /* duplicate of TotalServices */
1170         Host::Ptr host = static_cast<Host::Ptr>(row);
1171
1172         if (!host)
1173                 return Empty;
1174
1175         return host->GetTotalServices();
1176 }
1177
1178 Value HostsTable::WorstServiceStateAccessor(const Value& row)
1179 {
1180         Host::Ptr host = static_cast<Host::Ptr>(row);
1181
1182         if (!host)
1183                 return Empty;
1184
1185         Value worst_service = ServiceOK;
1186
1187         for (const Service::Ptr& service : host->GetServices()) {
1188                 if (service->GetState() > worst_service)
1189                         worst_service = service->GetState();
1190         }
1191
1192         return worst_service;
1193 }
1194
1195 Value HostsTable::NumServicesOkAccessor(const Value& row)
1196 {
1197         Host::Ptr host = static_cast<Host::Ptr>(row);
1198
1199         if (!host)
1200                 return Empty;
1201
1202         int num_services = 0;
1203
1204         for (const Service::Ptr& service : host->GetServices()) {
1205                 if (service->GetState() == ServiceOK)
1206                         num_services++;
1207         }
1208
1209         return num_services;
1210 }
1211
1212 Value HostsTable::NumServicesWarnAccessor(const Value& row)
1213 {
1214         Host::Ptr host = static_cast<Host::Ptr>(row);
1215
1216         if (!host)
1217                 return Empty;
1218
1219         int num_services = 0;
1220
1221         for (const Service::Ptr& service : host->GetServices()) {
1222                 if (service->GetState() == ServiceWarning)
1223                         num_services++;
1224         }
1225
1226         return num_services;
1227 }
1228
1229 Value HostsTable::NumServicesCritAccessor(const Value& row)
1230 {
1231         Host::Ptr host = static_cast<Host::Ptr>(row);
1232
1233         if (!host)
1234                 return Empty;
1235
1236         int num_services = 0;
1237
1238         for (const Service::Ptr& service : host->GetServices()) {
1239                 if (service->GetState() == ServiceCritical)
1240                         num_services++;
1241         }
1242
1243         return num_services;
1244 }
1245
1246 Value HostsTable::NumServicesUnknownAccessor(const Value& row)
1247 {
1248         Host::Ptr host = static_cast<Host::Ptr>(row);
1249
1250         if (!host)
1251                 return Empty;
1252
1253         int num_services = 0;
1254
1255         for (const Service::Ptr& service : host->GetServices()) {
1256                 if (service->GetState() == ServiceUnknown)
1257                         num_services++;
1258         }
1259
1260         return num_services;
1261 }
1262
1263 Value HostsTable::NumServicesPendingAccessor(const Value& row)
1264 {
1265         Host::Ptr host = static_cast<Host::Ptr>(row);
1266
1267         if (!host)
1268                 return Empty;
1269
1270         int num_services = 0;
1271
1272         for (const Service::Ptr& service : host->GetServices()) {
1273                 if (!service->GetLastCheckResult())
1274                         num_services++;
1275         }
1276
1277         return num_services;
1278 }
1279
1280 Value HostsTable::WorstServiceHardStateAccessor(const Value& row)
1281 {
1282         Host::Ptr host = static_cast<Host::Ptr>(row);
1283
1284         if (!host)
1285                 return Empty;
1286
1287         Value worst_service = ServiceOK;
1288
1289         for (const Service::Ptr& service : host->GetServices()) {
1290                 if (service->GetStateType() == StateTypeHard) {
1291                         if (service->GetState() > worst_service)
1292                                 worst_service = service->GetState();
1293                 }
1294         }
1295
1296         return worst_service;
1297 }
1298
1299 Value HostsTable::NumServicesHardOkAccessor(const Value& row)
1300 {
1301         Host::Ptr host = static_cast<Host::Ptr>(row);
1302
1303         if (!host)
1304                 return Empty;
1305
1306         int num_services = 0;
1307
1308         for (const Service::Ptr& service : host->GetServices()) {
1309                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceOK)
1310                         num_services++;
1311         }
1312
1313         return num_services;
1314 }
1315
1316 Value HostsTable::NumServicesHardWarnAccessor(const Value& row)
1317 {
1318         Host::Ptr host = static_cast<Host::Ptr>(row);
1319
1320         if (!host)
1321                 return Empty;
1322
1323         int num_services = 0;
1324
1325         for (const Service::Ptr& service : host->GetServices()) {
1326                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceWarning)
1327                         num_services++;
1328         }
1329
1330         return num_services;
1331 }
1332
1333 Value HostsTable::NumServicesHardCritAccessor(const Value& row)
1334 {
1335         Host::Ptr host = static_cast<Host::Ptr>(row);
1336
1337         if (!host)
1338                 return Empty;
1339
1340         int num_services = 0;
1341
1342         for (const Service::Ptr& service : host->GetServices()) {
1343                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceCritical)
1344                         num_services++;
1345         }
1346
1347         return num_services;
1348 }
1349
1350 Value HostsTable::NumServicesHardUnknownAccessor(const Value& row)
1351 {
1352         Host::Ptr host = static_cast<Host::Ptr>(row);
1353
1354         if (!host)
1355                 return Empty;
1356
1357         int num_services = 0;
1358
1359         for (const Service::Ptr& service : host->GetServices()) {
1360                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceUnknown)
1361                         num_services++;
1362         }
1363
1364         return num_services;
1365 }
1366
1367 Value HostsTable::HardStateAccessor(const Value& row)
1368 {
1369         Host::Ptr host = static_cast<Host::Ptr>(row);
1370
1371         if (!host)
1372                 return Empty;
1373
1374         if (host->GetState() == HostUp)
1375                 return HostUp;
1376         else if (host->GetStateType() == StateTypeHard)
1377                 return host->GetState();
1378
1379         return host->GetLastHardState();
1380 }
1381
1382 Value HostsTable::StalenessAccessor(const Value& row)
1383 {
1384         Host::Ptr host = static_cast<Host::Ptr>(row);
1385
1386         if (!host)
1387                 return Empty;
1388
1389         return CompatUtility::GetCheckableStaleness(host);
1390 }
1391
1392 Value HostsTable::GroupsAccessor(const Value& row)
1393 {
1394         Host::Ptr host = static_cast<Host::Ptr>(row);
1395
1396         if (!host)
1397                 return Empty;
1398
1399         Array::Ptr groups = host->GetGroups();
1400
1401         if (!groups)
1402                 return Empty;
1403
1404         return groups;
1405 }
1406
1407 Value HostsTable::ContactGroupsAccessor(const Value& row)
1408 {
1409         Host::Ptr host = static_cast<Host::Ptr>(row);
1410
1411         if (!host)
1412                 return Empty;
1413
1414         Array::Ptr contactgroup_names = new Array();
1415
1416         for (const UserGroup::Ptr& usergroup : CompatUtility::GetCheckableNotificationUserGroups(host)) {
1417                 contactgroup_names->Add(usergroup->GetName());
1418         }
1419
1420         return contactgroup_names;
1421 }
1422
1423 Value HostsTable::ServicesAccessor(const Value& row)
1424 {
1425         Host::Ptr host = static_cast<Host::Ptr>(row);
1426
1427         if (!host)
1428                 return Empty;
1429
1430         std::vector<Service::Ptr> rservices = host->GetServices();
1431
1432         Array::Ptr services = new Array();
1433         services->Reserve(rservices.size());
1434
1435         for (const Service::Ptr& service : rservices) {
1436                 services->Add(service->GetShortName());
1437         }
1438
1439         return services;
1440 }
1441
1442 Value HostsTable::ServicesWithStateAccessor(const Value& row)
1443 {
1444         Host::Ptr host = static_cast<Host::Ptr>(row);
1445
1446         if (!host)
1447                 return Empty;
1448
1449         std::vector<Service::Ptr> rservices = host->GetServices();
1450
1451         Array::Ptr services = new Array();
1452         services->Reserve(rservices.size());
1453
1454         for (const Service::Ptr& service : rservices) {
1455                 Array::Ptr svc_add = new Array();
1456
1457                 svc_add->Add(service->GetShortName());
1458                 svc_add->Add(service->GetState());
1459                 svc_add->Add(service->HasBeenChecked() ? 1 : 0);
1460                 services->Add(svc_add);
1461         }
1462
1463         return services;
1464 }
1465
1466 Value HostsTable::ServicesWithInfoAccessor(const Value& row)
1467 {
1468         Host::Ptr host = static_cast<Host::Ptr>(row);
1469
1470         if (!host)
1471                 return Empty;
1472
1473         std::vector<Service::Ptr> rservices = host->GetServices();
1474
1475         Array::Ptr services = new Array();
1476         services->Reserve(rservices.size());
1477
1478         for (const Service::Ptr& service : rservices) {
1479                 Array::Ptr svc_add = new Array();
1480
1481                 svc_add->Add(service->GetShortName());
1482                 svc_add->Add(service->GetState());
1483                 svc_add->Add(service->HasBeenChecked() ? 1 : 0);
1484
1485                 String output;
1486                 CheckResult::Ptr cr = service->GetLastCheckResult();
1487
1488                 if (cr)
1489                         output = CompatUtility::GetCheckResultOutput(cr);
1490
1491                 svc_add->Add(output);
1492                 services->Add(svc_add);
1493         }
1494
1495         return services;
1496 }
1497
1498 Value HostsTable::CheckSourceAccessor(const Value& row)
1499 {
1500         Host::Ptr host = static_cast<Host::Ptr>(row);
1501
1502         if (!host)
1503                 return Empty;
1504
1505         CheckResult::Ptr cr = host->GetLastCheckResult();
1506
1507         if (cr)
1508                 return cr->GetCheckSource();
1509
1510         return Empty;
1511 }
1512
1513 Value HostsTable::IsReachableAccessor(const Value& row)
1514 {
1515         Host::Ptr host = static_cast<Host::Ptr>(row);
1516
1517         if (!host)
1518                 return Empty;
1519
1520         return host->IsReachable();
1521 }
1522
1523 Value HostsTable::OriginalAttributesAccessor(const Value& row)
1524 {
1525         Host::Ptr host = static_cast<Host::Ptr>(row);
1526
1527         if (!host)
1528                 return Empty;
1529
1530         return JsonEncode(host->GetOriginalAttributes());
1531 }