1 /******************************************************************************
3 * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org) *
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. *
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. *
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 ******************************************************************************/
20 #include "livestatus/hoststable.h"
21 #include "icinga/host.h"
22 #include "icinga/service.h"
23 #include "icinga/checkcommand.h"
24 #include "icinga/eventcommand.h"
25 #include "icinga/timeperiod.h"
26 #include "icinga/macroprocessor.h"
27 #include "icinga/icingaapplication.h"
28 #include "icinga/compatutility.h"
29 #include "base/dynamictype.h"
30 #include "base/objectlock.h"
31 #include "base/convert.h"
32 #include "base/utility.h"
33 #include <boost/algorithm/string/classification.hpp>
34 #include <boost/foreach.hpp>
35 #include <boost/tuple/tuple.hpp>
36 #include <boost/algorithm/string/replace.hpp>
37 #include <boost/algorithm/string/split.hpp>
39 using namespace icinga;
41 HostsTable::HostsTable(void)
46 void HostsTable::AddColumns(Table *table, const String& prefix,
47 const Column::ObjectAccessor& objectAccessor)
49 table->AddColumn(prefix + "name", Column(&HostsTable::NameAccessor, objectAccessor));
50 table->AddColumn(prefix + "display_name", Column(&HostsTable::DisplayNameAccessor, objectAccessor));
51 table->AddColumn(prefix + "alias", Column(&HostsTable::DisplayNameAccessor, objectAccessor));
52 table->AddColumn(prefix + "address", Column(&HostsTable::AddressAccessor, objectAccessor));
53 table->AddColumn(prefix + "address6", Column(&HostsTable::Address6Accessor, objectAccessor));
54 table->AddColumn(prefix + "check_command", Column(&HostsTable::CheckCommandAccessor, objectAccessor));
55 table->AddColumn(prefix + "check_command_expanded", Column(&HostsTable::CheckCommandExpandedAccessor, objectAccessor));
56 table->AddColumn(prefix + "event_handler", Column(&HostsTable::EventHandlerAccessor, objectAccessor));
57 table->AddColumn(prefix + "notification_period", Column(&HostsTable::NotificationPeriodAccessor, objectAccessor));
58 table->AddColumn(prefix + "check_period", Column(&HostsTable::CheckPeriodAccessor, objectAccessor));
59 table->AddColumn(prefix + "notes", Column(&HostsTable::NotesAccessor, objectAccessor));
60 table->AddColumn(prefix + "notes_expanded", Column(&HostsTable::NotesExpandedAccessor, objectAccessor));
61 table->AddColumn(prefix + "notes_url", Column(&HostsTable::NotesUrlAccessor, objectAccessor));
62 table->AddColumn(prefix + "notes_url_expanded", Column(&HostsTable::NotesUrlExpandedAccessor, objectAccessor));
63 table->AddColumn(prefix + "action_url", Column(&HostsTable::ActionUrlAccessor, objectAccessor));
64 table->AddColumn(prefix + "action_url_expanded", Column(&HostsTable::ActionUrlExpandedAccessor, objectAccessor));
65 table->AddColumn(prefix + "plugin_output", Column(&HostsTable::PluginOutputAccessor, objectAccessor));
66 table->AddColumn(prefix + "perf_data", Column(&HostsTable::PerfDataAccessor, objectAccessor));
67 table->AddColumn(prefix + "icon_image", Column(&HostsTable::IconImageAccessor, objectAccessor));
68 table->AddColumn(prefix + "icon_image_expanded", Column(&HostsTable::IconImageExpandedAccessor, objectAccessor));
69 table->AddColumn(prefix + "icon_image_alt", Column(&HostsTable::IconImageAltAccessor, objectAccessor));
70 table->AddColumn(prefix + "statusmap_image", Column(&HostsTable::StatusmapImageAccessor, objectAccessor));
71 table->AddColumn(prefix + "long_plugin_output", Column(&HostsTable::LongPluginOutputAccessor, objectAccessor));
72 table->AddColumn(prefix + "initial_state", Column(&Table::EmptyStringAccessor, objectAccessor));
73 table->AddColumn(prefix + "max_check_attempts", Column(&HostsTable::MaxCheckAttemptsAccessor, objectAccessor));
74 table->AddColumn(prefix + "flap_detection_enabled", Column(&HostsTable::FlapDetectionEnabledAccessor, objectAccessor));
75 table->AddColumn(prefix + "check_freshness", Column(&Table::OneAccessor, objectAccessor));
76 table->AddColumn(prefix + "process_performance_data", Column(&Table::ZeroAccessor, objectAccessor));
77 table->AddColumn(prefix + "accept_passive_checks", Column(&HostsTable::AcceptPassiveChecksAccessor, objectAccessor));
78 table->AddColumn(prefix + "event_handler_enabled", Column(&HostsTable::EventHandlerEnabledAccessor, objectAccessor));
79 table->AddColumn(prefix + "acknowledgement_type", Column(&HostsTable::AcknowledgementTypeAccessor, objectAccessor));
80 table->AddColumn(prefix + "check_type", Column(&HostsTable::CheckTypeAccessor, objectAccessor));
81 table->AddColumn(prefix + "last_state", Column(&HostsTable::LastStateAccessor, objectAccessor));
82 table->AddColumn(prefix + "last_hard_state", Column(&HostsTable::LastHardStateAccessor, objectAccessor));
83 table->AddColumn(prefix + "current_attempt", Column(&HostsTable::CurrentAttemptAccessor, objectAccessor));
84 table->AddColumn(prefix + "last_notification", Column(&HostsTable::LastNotificationAccessor, objectAccessor));
85 table->AddColumn(prefix + "next_notification", Column(&HostsTable::NextNotificationAccessor, objectAccessor));
86 table->AddColumn(prefix + "next_check", Column(&HostsTable::NextCheckAccessor, objectAccessor));
87 table->AddColumn(prefix + "last_hard_state_change", Column(&HostsTable::LastHardStateChangeAccessor, objectAccessor));
88 table->AddColumn(prefix + "has_been_checked", Column(&HostsTable::HasBeenCheckedAccessor, objectAccessor));
89 table->AddColumn(prefix + "current_notification_number", Column(&HostsTable::CurrentNotificationNumberAccessor, objectAccessor));
90 table->AddColumn(prefix + "pending_flex_downtime", Column(&Table::ZeroAccessor, objectAccessor));
91 table->AddColumn(prefix + "total_services", Column(&HostsTable::TotalServicesAccessor, objectAccessor));
92 table->AddColumn(prefix + "checks_enabled", Column(&HostsTable::ChecksEnabledAccessor, objectAccessor));
93 table->AddColumn(prefix + "notifications_enabled", Column(&HostsTable::NotificationsEnabledAccessor, objectAccessor));
94 table->AddColumn(prefix + "acknowledged", Column(&HostsTable::AcknowledgedAccessor, objectAccessor));
95 table->AddColumn(prefix + "state", Column(&HostsTable::StateAccessor, objectAccessor));
96 table->AddColumn(prefix + "state_type", Column(&HostsTable::StateTypeAccessor, objectAccessor));
97 table->AddColumn(prefix + "no_more_notifications", Column(&HostsTable::NoMoreNotificationsAccessor, objectAccessor));
98 table->AddColumn(prefix + "check_flapping_recovery_notification", Column(&Table::ZeroAccessor, objectAccessor));
99 table->AddColumn(prefix + "last_check", Column(&HostsTable::LastCheckAccessor, objectAccessor));
100 table->AddColumn(prefix + "last_state_change", Column(&HostsTable::LastStateChangeAccessor, objectAccessor));
101 table->AddColumn(prefix + "last_time_up", Column(&HostsTable::LastTimeUpAccessor, objectAccessor));
102 table->AddColumn(prefix + "last_time_down", Column(&HostsTable::LastTimeDownAccessor, objectAccessor));
103 table->AddColumn(prefix + "last_time_unreachable", Column(&HostsTable::LastTimeUnreachableAccessor, objectAccessor));
104 table->AddColumn(prefix + "is_flapping", Column(&HostsTable::IsFlappingAccessor, objectAccessor));
105 table->AddColumn(prefix + "scheduled_downtime_depth", Column(&HostsTable::ScheduledDowntimeDepthAccessor, objectAccessor));
106 table->AddColumn(prefix + "is_executing", Column(&Table::ZeroAccessor, objectAccessor));
107 table->AddColumn(prefix + "active_checks_enabled", Column(&HostsTable::ActiveChecksEnabledAccessor, objectAccessor));
108 table->AddColumn(prefix + "check_options", Column(&HostsTable::CheckOptionsAccessor, objectAccessor));
109 table->AddColumn(prefix + "obsess_over_host", Column(&Table::ZeroAccessor, objectAccessor));
110 table->AddColumn(prefix + "modified_attributes", Column(&HostsTable::ModifiedAttributesAccessor, objectAccessor));
111 table->AddColumn(prefix + "modified_attributes_list", Column(&HostsTable::ModifiedAttributesListAccessor, objectAccessor));
112 table->AddColumn(prefix + "check_interval", Column(&HostsTable::CheckIntervalAccessor, objectAccessor));
113 table->AddColumn(prefix + "retry_interval", Column(&HostsTable::RetryIntervalAccessor, objectAccessor));
114 table->AddColumn(prefix + "notification_interval", Column(&HostsTable::NotificationIntervalAccessor, objectAccessor));
115 table->AddColumn(prefix + "first_notification_delay", Column(&Table::EmptyStringAccessor, objectAccessor));
116 table->AddColumn(prefix + "low_flap_threshold", Column(&HostsTable::LowFlapThresholdAccessor, objectAccessor));
117 table->AddColumn(prefix + "high_flap_threshold", Column(&HostsTable::HighFlapThresholdAccessor, objectAccessor));
118 table->AddColumn(prefix + "x_3d", Column(&EmptyStringAccessor, objectAccessor));
119 table->AddColumn(prefix + "y_3d", Column(&EmptyStringAccessor, objectAccessor));
120 table->AddColumn(prefix + "z_3d", Column(&EmptyStringAccessor, objectAccessor));
121 table->AddColumn(prefix + "x_2d", Column(&HostsTable::X2dAccessor, objectAccessor));
122 table->AddColumn(prefix + "y_2d", Column(&HostsTable::Y2dAccessor, objectAccessor));
123 table->AddColumn(prefix + "latency", Column(&HostsTable::LatencyAccessor, objectAccessor));
124 table->AddColumn(prefix + "execution_time", Column(&HostsTable::ExecutionTimeAccessor, objectAccessor));
125 table->AddColumn(prefix + "percent_state_change", Column(&HostsTable::PercentStateChangeAccessor, objectAccessor));
126 table->AddColumn(prefix + "in_notification_period", Column(&HostsTable::InNotificationPeriodAccessor, objectAccessor));
127 table->AddColumn(prefix + "in_check_period", Column(&HostsTable::InCheckPeriodAccessor, objectAccessor));
128 table->AddColumn(prefix + "contacts", Column(&HostsTable::ContactsAccessor, objectAccessor));
129 table->AddColumn(prefix + "downtimes", Column(&HostsTable::DowntimesAccessor, objectAccessor));
130 table->AddColumn(prefix + "downtimes_with_info", Column(&HostsTable::DowntimesWithInfoAccessor, objectAccessor));
131 table->AddColumn(prefix + "comments", Column(&HostsTable::CommentsAccessor, objectAccessor));
132 table->AddColumn(prefix + "comments_with_info", Column(&HostsTable::CommentsWithInfoAccessor, objectAccessor));
133 table->AddColumn(prefix + "comments_with_extra_info", Column(&HostsTable::CommentsWithExtraInfoAccessor, objectAccessor));
134 table->AddColumn(prefix + "custom_variable_names", Column(&HostsTable::CustomVariableNamesAccessor, objectAccessor));
135 table->AddColumn(prefix + "custom_variable_values", Column(&HostsTable::CustomVariableValuesAccessor, objectAccessor));
136 table->AddColumn(prefix + "custom_variables", Column(&HostsTable::CustomVariablesAccessor, objectAccessor));
137 table->AddColumn(prefix + "filename", Column(&Table::EmptyStringAccessor, objectAccessor));
138 table->AddColumn(prefix + "parents", Column(&HostsTable::ParentsAccessor, objectAccessor));
139 table->AddColumn(prefix + "childs", Column(&HostsTable::ChildsAccessor, objectAccessor));
140 table->AddColumn(prefix + "num_services", Column(&HostsTable::NumServicesAccessor, objectAccessor));
141 table->AddColumn(prefix + "worst_service_state", Column(&HostsTable::WorstServiceStateAccessor, objectAccessor));
142 table->AddColumn(prefix + "num_services_ok", Column(&HostsTable::NumServicesOkAccessor, objectAccessor));
143 table->AddColumn(prefix + "num_services_warn", Column(&HostsTable::NumServicesWarnAccessor, objectAccessor));
144 table->AddColumn(prefix + "num_services_crit", Column(&HostsTable::NumServicesCritAccessor, objectAccessor));
145 table->AddColumn(prefix + "num_services_unknown", Column(&HostsTable::NumServicesUnknownAccessor, objectAccessor));
146 table->AddColumn(prefix + "num_services_pending", Column(&HostsTable::NumServicesPendingAccessor, objectAccessor));
147 table->AddColumn(prefix + "worst_service_hard_state", Column(&HostsTable::WorstServiceHardStateAccessor, objectAccessor));
148 table->AddColumn(prefix + "num_services_hard_ok", Column(&HostsTable::NumServicesHardOkAccessor, objectAccessor));
149 table->AddColumn(prefix + "num_services_hard_warn", Column(&HostsTable::NumServicesHardWarnAccessor, objectAccessor));
150 table->AddColumn(prefix + "num_services_hard_crit", Column(&HostsTable::NumServicesHardCritAccessor, objectAccessor));
151 table->AddColumn(prefix + "num_services_hard_unknown", Column(&HostsTable::NumServicesHardUnknownAccessor, objectAccessor));
152 table->AddColumn(prefix + "hard_state", Column(&HostsTable::HardStateAccessor, objectAccessor));
153 table->AddColumn(prefix + "pnpgraph_present", Column(&Table::ZeroAccessor, objectAccessor));
154 table->AddColumn(prefix + "staleness", Column(&HostsTable::StalenessAccessor, objectAccessor));
155 table->AddColumn(prefix + "groups", Column(&HostsTable::GroupsAccessor, objectAccessor));
156 table->AddColumn(prefix + "contact_groups", Column(&HostsTable::ContactGroupsAccessor, objectAccessor));
157 table->AddColumn(prefix + "services", Column(&HostsTable::ServicesAccessor, objectAccessor));
158 table->AddColumn(prefix + "services_with_state", Column(&HostsTable::ServicesWithStateAccessor, objectAccessor));
159 table->AddColumn(prefix + "services_with_info", Column(&HostsTable::ServicesWithInfoAccessor, objectAccessor));
162 String HostsTable::GetName(void) const
167 void HostsTable::FetchRows(const AddRowFunction& addRowFn)
169 BOOST_FOREACH(const Host::Ptr& host, DynamicType::GetObjects<Host>()) {
174 Value HostsTable::NameAccessor(const Value& row)
176 Host::Ptr host = static_cast<Host::Ptr>(row);
181 return host->GetName();
184 Value HostsTable::DisplayNameAccessor(const Value& row)
186 Host::Ptr host = static_cast<Host::Ptr>(row);
191 return host->GetDisplayName();
194 Value HostsTable::AddressAccessor(const Value& row)
196 Host::Ptr host = static_cast<Host::Ptr>(row);
202 return CompatUtility::GetHostAddress(host);
205 Value HostsTable::Address6Accessor(const Value& row)
207 Host::Ptr host = static_cast<Host::Ptr>(row);
212 return CompatUtility::GetHostAddress6(host);
215 Value HostsTable::CheckCommandAccessor(const Value& row)
217 Host::Ptr host = static_cast<Host::Ptr>(row);
222 CheckCommand::Ptr checkcommand = host->GetCheckCommand();
224 return checkcommand->GetName(); /* this is the name without '!' args */
229 Value HostsTable::CheckCommandExpandedAccessor(const Value& row)
231 /* use hostcheck service */
232 Host::Ptr host = static_cast<Host::Ptr>(row);
237 CheckCommand::Ptr checkcommand = host->GetCheckCommand();
239 return checkcommand->GetName(); /* this is the name without '!' args */
244 Value HostsTable::EventHandlerAccessor(const Value& row)
246 /* use hostcheck service */
247 Host::Ptr host = static_cast<Host::Ptr>(row);
252 EventCommand::Ptr eventcommand = host->GetEventCommand();
254 return eventcommand->GetName();
259 Value HostsTable::NotificationPeriodAccessor(const Value& row)
261 /* use hostcheck service */
262 Host::Ptr host = static_cast<Host::Ptr>(row);
267 return CompatUtility::GetCheckableNotificationNotificationPeriod(host);
270 Value HostsTable::CheckPeriodAccessor(const Value& row)
272 /* use hostcheck service */
273 Host::Ptr host = static_cast<Host::Ptr>(row);
278 return CompatUtility::GetCheckableCheckPeriod(host);
281 Value HostsTable::NotesAccessor(const Value& row)
283 Host::Ptr host = static_cast<Host::Ptr>(row);
288 return CompatUtility::GetCustomAttributeConfig(host, "notes");
291 Value HostsTable::NotesExpandedAccessor(const Value& row)
293 Host::Ptr host = static_cast<Host::Ptr>(row);
298 std::vector<MacroResolver::Ptr> resolvers;
300 resolvers.push_back(host);
301 resolvers.push_back(IcingaApplication::GetInstance());
303 Value value = CompatUtility::GetCustomAttributeConfig(host, "notes");
305 return MacroProcessor::ResolveMacros(value, resolvers, CheckResult::Ptr(), Utility::EscapeShellCmd);
308 Value HostsTable::NotesUrlAccessor(const Value& row)
310 Host::Ptr host = static_cast<Host::Ptr>(row);
315 return CompatUtility::GetCustomAttributeConfig(host, "notes_url");
318 Value HostsTable::NotesUrlExpandedAccessor(const Value& row)
320 Host::Ptr host = static_cast<Host::Ptr>(row);
325 std::vector<MacroResolver::Ptr> resolvers;
327 resolvers.push_back(host);
328 resolvers.push_back(IcingaApplication::GetInstance());
330 Value value = CompatUtility::GetCustomAttributeConfig(host, "notes_url");
332 return MacroProcessor::ResolveMacros(value, resolvers, CheckResult::Ptr(), Utility::EscapeShellCmd);
335 Value HostsTable::ActionUrlAccessor(const Value& row)
337 Host::Ptr host = static_cast<Host::Ptr>(row);
342 return CompatUtility::GetCustomAttributeConfig(host, "action_url");
345 Value HostsTable::ActionUrlExpandedAccessor(const Value& row)
347 Host::Ptr host = static_cast<Host::Ptr>(row);
352 std::vector<MacroResolver::Ptr> resolvers;
354 resolvers.push_back(host);
355 resolvers.push_back(IcingaApplication::GetInstance());
357 Value value = CompatUtility::GetCustomAttributeConfig(host, "action_url");
359 return MacroProcessor::ResolveMacros(value, resolvers, CheckResult::Ptr(), Utility::EscapeShellCmd);
362 Value HostsTable::PluginOutputAccessor(const Value& row)
364 /* use hostcheck service */
365 Host::Ptr host = static_cast<Host::Ptr>(row);
371 CheckResult::Ptr cr = host->GetLastCheckResult();
374 output = CompatUtility::GetCheckResultOutput(cr);
379 Value HostsTable::PerfDataAccessor(const Value&)
384 Value HostsTable::IconImageAccessor(const Value& row)
386 /* use hostcheck service */
387 Host::Ptr host = static_cast<Host::Ptr>(row);
392 return CompatUtility::GetCustomAttributeConfig(host, "icon_image");
395 Value HostsTable::IconImageExpandedAccessor(const Value& row)
397 Host::Ptr host = static_cast<Host::Ptr>(row);
402 std::vector<MacroResolver::Ptr> resolvers;
404 resolvers.push_back(host);
405 resolvers.push_back(IcingaApplication::GetInstance());
407 Value value = CompatUtility::GetCustomAttributeConfig(host, "icon_image");
409 return MacroProcessor::ResolveMacros(value, resolvers, CheckResult::Ptr(), Utility::EscapeShellCmd);
412 Value HostsTable::IconImageAltAccessor(const Value& row)
414 Host::Ptr host = static_cast<Host::Ptr>(row);
419 return CompatUtility::GetCustomAttributeConfig(host, "icon_image_alt");
422 Value HostsTable::StatusmapImageAccessor(const Value& row)
424 Host::Ptr host = static_cast<Host::Ptr>(row);
429 return CompatUtility::GetCustomAttributeConfig(host, "statusmap_image");
432 Value HostsTable::LongPluginOutputAccessor(const Value& row)
434 /* use hostcheck service */
435 Host::Ptr host = static_cast<Host::Ptr>(row);
441 CheckResult::Ptr cr = host->GetLastCheckResult();
444 long_output = CompatUtility::GetCheckResultLongOutput(cr);
449 Value HostsTable::MaxCheckAttemptsAccessor(const Value& row)
451 /* use hostcheck service */
452 Host::Ptr host = static_cast<Host::Ptr>(row);
457 return host->GetMaxCheckAttempts();
460 Value HostsTable::FlapDetectionEnabledAccessor(const Value& row)
462 /* use hostcheck service */
463 Host::Ptr host = static_cast<Host::Ptr>(row);
468 return CompatUtility::GetCheckableFlapDetectionEnabled(host);
471 Value HostsTable::AcceptPassiveChecksAccessor(const Value& row)
473 /* use hostcheck service */
474 Host::Ptr host = static_cast<Host::Ptr>(row);
479 return CompatUtility::GetCheckablePassiveChecksEnabled(host);
482 Value HostsTable::EventHandlerEnabledAccessor(const Value& row)
484 /* use hostcheck service */
485 Host::Ptr host = static_cast<Host::Ptr>(row);
490 return CompatUtility::GetCheckableEventHandlerEnabled(host);
493 Value HostsTable::AcknowledgementTypeAccessor(const Value& row)
495 /* use hostcheck service */
496 Host::Ptr host = static_cast<Host::Ptr>(row);
501 return CompatUtility::GetCheckableAcknowledgementType(host);
504 Value HostsTable::CheckTypeAccessor(const Value& row)
506 /* use hostcheck service */
507 Host::Ptr host = static_cast<Host::Ptr>(row);
512 return CompatUtility::GetCheckableCheckType(host);
515 Value HostsTable::LastStateAccessor(const Value& row)
517 Host::Ptr host = static_cast<Host::Ptr>(row);
522 return host->GetLastState();
525 Value HostsTable::LastHardStateAccessor(const Value& row)
527 Host::Ptr host = static_cast<Host::Ptr>(row);
532 return host->GetLastHardState();
535 Value HostsTable::CurrentAttemptAccessor(const Value& row)
537 /* use hostcheck service */
538 Host::Ptr host = static_cast<Host::Ptr>(row);
543 return host->GetCheckAttempt();
546 Value HostsTable::LastNotificationAccessor(const Value& row)
548 /* use hostcheck service */
549 Host::Ptr host = static_cast<Host::Ptr>(row);
554 return CompatUtility::GetCheckableNotificationLastNotification(host);
557 Value HostsTable::NextNotificationAccessor(const Value& row)
559 /* use hostcheck service */
560 Host::Ptr host = static_cast<Host::Ptr>(row);
565 return CompatUtility::GetCheckableNotificationNextNotification(host);
568 Value HostsTable::NextCheckAccessor(const Value& row)
570 /* use hostcheck service */
571 Host::Ptr host = static_cast<Host::Ptr>(row);
576 return static_cast<int>(host->GetNextCheck());
579 Value HostsTable::LastHardStateChangeAccessor(const Value& row)
581 /* use hostcheck service */
582 Host::Ptr host = static_cast<Host::Ptr>(row);
587 return static_cast<int>(host->GetLastHardStateChange());
590 Value HostsTable::HasBeenCheckedAccessor(const Value& row)
592 /* use hostcheck service */
593 Host::Ptr host = static_cast<Host::Ptr>(row);
598 return CompatUtility::GetCheckableHasBeenChecked(host);
601 Value HostsTable::CurrentNotificationNumberAccessor(const Value& row)
603 /* use hostcheck service */
604 Host::Ptr host = static_cast<Host::Ptr>(row);
609 return CompatUtility::GetCheckableNotificationNotificationNumber(host);
612 Value HostsTable::TotalServicesAccessor(const Value& row)
614 Host::Ptr host = static_cast<Host::Ptr>(row);
619 return host->GetTotalServices();
622 Value HostsTable::ChecksEnabledAccessor(const Value& row)
624 /* use hostcheck service */
625 Host::Ptr host = static_cast<Host::Ptr>(row);
630 return CompatUtility::GetCheckableActiveChecksEnabled(host);
633 Value HostsTable::NotificationsEnabledAccessor(const Value& row)
635 /* use hostcheck service */
636 Host::Ptr host = static_cast<Host::Ptr>(row);
641 return CompatUtility::GetCheckableNotificationsEnabled(host);
644 Value HostsTable::AcknowledgedAccessor(const Value& row)
646 /* use hostcheck service */
647 Host::Ptr host = static_cast<Host::Ptr>(row);
652 return CompatUtility::GetCheckableIsAcknowledged(host);
655 Value HostsTable::StateAccessor(const Value& row)
657 /* use hostcheck service */
658 Host::Ptr host = static_cast<Host::Ptr>(row);
663 return host->IsReachable() ? host->GetState() : 2;
666 Value HostsTable::StateTypeAccessor(const Value& row)
668 /* use hostcheck service */
669 Host::Ptr host = static_cast<Host::Ptr>(row);
674 return host->GetStateType();
677 Value HostsTable::NoMoreNotificationsAccessor(const Value& row)
679 /* use hostcheck service */
680 Host::Ptr host = static_cast<Host::Ptr>(row);
685 return CompatUtility::GetCheckableNoMoreNotifications(host);
688 Value HostsTable::LastCheckAccessor(const Value& row)
690 /* use hostcheck service */
691 Host::Ptr host = static_cast<Host::Ptr>(row);
696 return static_cast<int>(host->GetLastCheck());
699 Value HostsTable::LastStateChangeAccessor(const Value& row)
701 /* use hostcheck service */
702 Host::Ptr host = static_cast<Host::Ptr>(row);
707 return static_cast<int>(host->GetLastStateChange());
710 Value HostsTable::LastTimeUpAccessor(const Value& row)
712 /* use hostcheck service */
713 Host::Ptr host = static_cast<Host::Ptr>(row);
718 return static_cast<int>(host->GetLastStateUp());
721 Value HostsTable::LastTimeDownAccessor(const Value& row)
723 /* use hostcheck service */
724 Host::Ptr host = static_cast<Host::Ptr>(row);
729 return static_cast<int>(host->GetLastStateDown());
732 Value HostsTable::LastTimeUnreachableAccessor(const Value& row)
734 /* use hostcheck service */
735 Host::Ptr host = static_cast<Host::Ptr>(row);
740 return static_cast<int>(host->GetLastStateUnreachable());
743 Value HostsTable::IsFlappingAccessor(const Value& row)
745 /* use hostcheck service */
746 Host::Ptr host = static_cast<Host::Ptr>(row);
751 return host->IsFlapping();
754 Value HostsTable::ScheduledDowntimeDepthAccessor(const Value& row)
756 /* use hostcheck service */
757 Host::Ptr host = static_cast<Host::Ptr>(row);
762 return host->GetDowntimeDepth();
765 Value HostsTable::ActiveChecksEnabledAccessor(const Value& row)
767 /* duplicate of ChecksEnableAccessor */
768 /* use hostcheck service */
769 Host::Ptr host = static_cast<Host::Ptr>(row);
774 return CompatUtility::GetCheckableActiveChecksEnabled(host);
777 Value HostsTable::CheckOptionsAccessor(const Value& row)
779 /* TODO - forcexec, freshness, orphan, none */
783 Value HostsTable::ModifiedAttributesAccessor(const Value& row)
785 /* use hostcheck service */
786 Host::Ptr host = static_cast<Host::Ptr>(row);
791 return host->GetModifiedAttributes();
794 Value HostsTable::ModifiedAttributesListAccessor(const Value& row)
800 Value HostsTable::CheckIntervalAccessor(const Value& row)
802 /* use hostcheck service */
803 Host::Ptr host = static_cast<Host::Ptr>(row);
808 return CompatUtility::GetCheckableCheckInterval(host);
811 Value HostsTable::RetryIntervalAccessor(const Value& row)
813 /* use hostcheck service */
814 Host::Ptr host = static_cast<Host::Ptr>(row);
819 return CompatUtility::GetCheckableRetryInterval(host);
822 Value HostsTable::NotificationIntervalAccessor(const Value& row)
824 /* use hostcheck service */
825 Host::Ptr host = static_cast<Host::Ptr>(row);
830 return CompatUtility::GetCheckableNotificationNotificationInterval(host);
833 Value HostsTable::LowFlapThresholdAccessor(const Value& row)
835 /* use hostcheck service */
836 Host::Ptr host = static_cast<Host::Ptr>(row);
841 return CompatUtility::GetCheckableLowFlapThreshold(host);
844 Value HostsTable::HighFlapThresholdAccessor(const Value& row)
846 /* use hostcheck service */
847 Host::Ptr host = static_cast<Host::Ptr>(row);
852 return CompatUtility::GetCheckableHighFlapThreshold(host);
855 Value HostsTable::X2dAccessor(const Value& row)
857 Host::Ptr host = static_cast<Host::Ptr>(row);
862 return CompatUtility::GetHost2dCoordX(host);
865 Value HostsTable::Y2dAccessor(const Value& row)
867 Host::Ptr host = static_cast<Host::Ptr>(row);
872 return CompatUtility::GetHost2dCoordY(host);
875 Value HostsTable::LatencyAccessor(const Value& row)
877 /* use hostcheck service */
878 Host::Ptr host = static_cast<Host::Ptr>(row);
883 return (Service::CalculateLatency(host->GetLastCheckResult()));
886 Value HostsTable::ExecutionTimeAccessor(const Value& row)
888 /* use hostcheck service */
889 Host::Ptr host = static_cast<Host::Ptr>(row);
894 return (Service::CalculateExecutionTime(host->GetLastCheckResult()));
897 Value HostsTable::PercentStateChangeAccessor(const Value& row)
899 /* use hostcheck service */
900 Host::Ptr host = static_cast<Host::Ptr>(row);
905 return CompatUtility::GetCheckablePercentStateChange(host);
908 Value HostsTable::InNotificationPeriodAccessor(const Value& row)
910 /* use hostcheck service */
911 Host::Ptr host = static_cast<Host::Ptr>(row);
916 return CompatUtility::GetCheckableInNotificationPeriod(host);
919 Value HostsTable::InCheckPeriodAccessor(const Value& row)
921 /* use hostcheck service */
922 Host::Ptr host = static_cast<Host::Ptr>(row);
927 return CompatUtility::GetCheckableInCheckPeriod(host);
930 Value HostsTable::ContactsAccessor(const Value& row)
932 /* use hostcheck service */
933 Host::Ptr host = static_cast<Host::Ptr>(row);
938 Array::Ptr contact_names = make_shared<Array>();
940 BOOST_FOREACH(const User::Ptr& user, CompatUtility::GetCheckableNotificationUsers(host)) {
941 contact_names->Add(user->GetName());
944 return contact_names;
947 Value HostsTable::DowntimesAccessor(const Value& row)
949 /* use hostcheck service */
950 Host::Ptr host = static_cast<Host::Ptr>(row);
955 Dictionary::Ptr downtimes = host->GetDowntimes();
957 Array::Ptr ids = make_shared<Array>();
959 ObjectLock olock(downtimes);
962 Downtime::Ptr downtime;
963 BOOST_FOREACH(tie(id, downtime), downtimes) {
968 if (downtime->IsExpired())
971 ids->Add(downtime->GetLegacyId());
977 Value HostsTable::DowntimesWithInfoAccessor(const Value& row)
979 /* use hostcheck service */
980 Host::Ptr host = static_cast<Host::Ptr>(row);
985 Dictionary::Ptr downtimes = host->GetDowntimes();
987 Array::Ptr ids = make_shared<Array>();
989 ObjectLock olock(downtimes);
992 Downtime::Ptr downtime;
993 BOOST_FOREACH(tie(id, downtime), downtimes) {
998 if (downtime->IsExpired())
1001 Array::Ptr downtime_info = make_shared<Array>();
1002 downtime_info->Add(downtime->GetLegacyId());
1003 downtime_info->Add(downtime->GetAuthor());
1004 downtime_info->Add(downtime->GetComment());
1005 ids->Add(downtime_info);
1011 Value HostsTable::CommentsAccessor(const Value& row)
1013 /* use hostcheck service */
1014 Host::Ptr host = static_cast<Host::Ptr>(row);
1019 Dictionary::Ptr comments = host->GetComments();
1021 Array::Ptr ids = make_shared<Array>();
1023 ObjectLock olock(comments);
1026 Comment::Ptr comment;
1027 BOOST_FOREACH(tie(id, comment), comments) {
1032 if (comment->IsExpired())
1035 ids->Add(comment->GetLegacyId());
1041 Value HostsTable::CommentsWithInfoAccessor(const Value& row)
1043 /* use hostcheck service */
1044 Host::Ptr host = static_cast<Host::Ptr>(row);
1049 Dictionary::Ptr comments = host->GetComments();
1051 Array::Ptr ids = make_shared<Array>();
1053 ObjectLock olock(comments);
1056 Comment::Ptr comment;
1057 BOOST_FOREACH(tie(id, comment), comments) {
1062 if (comment->IsExpired())
1065 Array::Ptr comment_info = make_shared<Array>();
1066 comment_info->Add(comment->GetLegacyId());
1067 comment_info->Add(comment->GetAuthor());
1068 comment_info->Add(comment->GetText());
1069 ids->Add(comment_info);
1075 Value HostsTable::CommentsWithExtraInfoAccessor(const Value& row)
1077 /* use hostcheck service */
1078 Host::Ptr host = static_cast<Host::Ptr>(row);
1083 Dictionary::Ptr comments = host->GetComments();
1085 Array::Ptr ids = make_shared<Array>();
1087 ObjectLock olock(comments);
1090 Comment::Ptr comment;
1091 BOOST_FOREACH(tie(id, comment), comments) {
1096 if (comment->IsExpired())
1099 Array::Ptr comment_info = make_shared<Array>();
1100 comment_info->Add(comment->GetLegacyId());
1101 comment_info->Add(comment->GetAuthor());
1102 comment_info->Add(comment->GetText());
1103 comment_info->Add(comment->GetEntryType());
1104 comment_info->Add(static_cast<int>(comment->GetEntryTime()));
1105 ids->Add(comment_info);
1111 Value HostsTable::CustomVariableNamesAccessor(const Value& row)
1113 Host::Ptr host = static_cast<Host::Ptr>(row);
1118 Dictionary::Ptr vars;
1121 ObjectLock olock(host);
1122 vars = CompatUtility::GetCustomAttributeConfig(host);
1128 Array::Ptr cv = make_shared<Array>();
1132 BOOST_FOREACH(tie(key, value), vars) {
1139 Value HostsTable::CustomVariableValuesAccessor(const Value& row)
1141 Host::Ptr host = static_cast<Host::Ptr>(row);
1146 Dictionary::Ptr vars;
1149 ObjectLock olock(host);
1150 vars = CompatUtility::GetCustomAttributeConfig(host);
1156 Array::Ptr cv = make_shared<Array>();
1160 BOOST_FOREACH(tie(key, value), vars) {
1167 Value HostsTable::CustomVariablesAccessor(const Value& row)
1169 Host::Ptr host = static_cast<Host::Ptr>(row);
1174 Dictionary::Ptr vars;
1177 ObjectLock olock(host);
1178 vars = CompatUtility::GetCustomAttributeConfig(host);
1184 Array::Ptr cv = make_shared<Array>();
1188 BOOST_FOREACH(tie(key, value), vars) {
1189 Array::Ptr key_val = make_shared<Array>();
1191 key_val->Add(value);
1198 Value HostsTable::ParentsAccessor(const Value& row)
1200 Host::Ptr host = static_cast<Host::Ptr>(row);
1205 Array::Ptr parents = make_shared<Array>();
1207 BOOST_FOREACH(const Checkable::Ptr& parent, host->GetParents()) {
1208 Host::Ptr parent_host = dynamic_pointer_cast<Host>(parent);
1213 parents->Add(parent_host->GetName());
1219 Value HostsTable::ChildsAccessor(const Value& row)
1221 Host::Ptr host = static_cast<Host::Ptr>(row);
1226 Array::Ptr childs = make_shared<Array>();
1228 BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) {
1229 Host::Ptr child_host = dynamic_pointer_cast<Host>(child);
1234 childs->Add(child_host->GetName());
1240 Value HostsTable::NumServicesAccessor(const Value& row)
1242 /* duplicate of TotalServices */
1243 Host::Ptr host = static_cast<Host::Ptr>(row);
1248 return host->GetTotalServices();
1251 Value HostsTable::WorstServiceStateAccessor(const Value& row)
1253 Host::Ptr host = static_cast<Host::Ptr>(row);
1258 Value worst_service = StateOK;
1260 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1261 if (service->GetState() > worst_service)
1262 worst_service = service->GetState();
1265 return worst_service;
1268 Value HostsTable::NumServicesOkAccessor(const Value& row)
1270 Host::Ptr host = static_cast<Host::Ptr>(row);
1275 int num_services = 0;
1277 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1278 if (service->GetState() == StateOK)
1282 return num_services;
1285 Value HostsTable::NumServicesWarnAccessor(const Value& row)
1287 Host::Ptr host = static_cast<Host::Ptr>(row);
1292 int num_services = 0;
1294 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1295 if (service->GetState() == StateWarning)
1299 return num_services;
1302 Value HostsTable::NumServicesCritAccessor(const Value& row)
1304 Host::Ptr host = static_cast<Host::Ptr>(row);
1309 int num_services = 0;
1311 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1312 if (service->GetState() == StateCritical)
1316 return num_services;
1319 Value HostsTable::NumServicesUnknownAccessor(const Value& row)
1321 Host::Ptr host = static_cast<Host::Ptr>(row);
1326 int num_services = 0;
1328 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1329 if (service->GetState() == StateUnknown)
1333 return num_services;
1336 Value HostsTable::NumServicesPendingAccessor(const Value& row)
1338 Host::Ptr host = static_cast<Host::Ptr>(row);
1343 int num_services = 0;
1345 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1346 if (!service->GetLastCheckResult())
1350 return num_services;
1353 Value HostsTable::WorstServiceHardStateAccessor(const Value& row)
1355 Host::Ptr host = static_cast<Host::Ptr>(row);
1360 Value worst_service = StateOK;
1362 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1363 if (service->GetStateType() == StateTypeHard) {
1364 if (service->GetState() > worst_service)
1365 worst_service = service->GetState();
1369 return worst_service;
1372 Value HostsTable::NumServicesHardOkAccessor(const Value& row)
1374 Host::Ptr host = static_cast<Host::Ptr>(row);
1379 int num_services = 0;
1381 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1382 if (service->GetStateType() == StateTypeHard && service->GetState() == StateOK)
1386 return num_services;
1389 Value HostsTable::NumServicesHardWarnAccessor(const Value& row)
1391 Host::Ptr host = static_cast<Host::Ptr>(row);
1396 int num_services = 0;
1398 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1399 if (service->GetStateType() == StateTypeHard && service->GetState() == StateWarning)
1403 return num_services;
1406 Value HostsTable::NumServicesHardCritAccessor(const Value& row)
1408 Host::Ptr host = static_cast<Host::Ptr>(row);
1413 int num_services = 0;
1415 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1416 if (service->GetStateType() == StateTypeHard && service->GetState() == StateCritical)
1420 return num_services;
1423 Value HostsTable::NumServicesHardUnknownAccessor(const Value& row)
1425 Host::Ptr host = static_cast<Host::Ptr>(row);
1430 int num_services = 0;
1432 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1433 if (service->GetStateType() == StateTypeHard && service->GetState() == StateUnknown)
1437 return num_services;
1440 Value HostsTable::HardStateAccessor(const Value& row)
1442 /* use hostcheck service */
1443 Host::Ptr host = static_cast<Host::Ptr>(row);
1448 if (host->GetState() == HostUp)
1450 else if (host->GetStateType() == StateTypeHard)
1451 return host->GetState();
1453 return host->GetLastHardState();
1456 Value HostsTable::StalenessAccessor(const Value& row)
1458 /* use hostcheck service */
1459 Host::Ptr host = static_cast<Host::Ptr>(row);
1464 return CompatUtility::GetCheckableStaleness(host);
1467 Value HostsTable::GroupsAccessor(const Value& row)
1469 Host::Ptr host = static_cast<Host::Ptr>(row);
1474 Array::Ptr groups = host->GetGroups();
1482 Value HostsTable::ContactGroupsAccessor(const Value& row)
1484 /* use hostcheck service */
1485 Host::Ptr host = static_cast<Host::Ptr>(row);
1490 Array::Ptr contactgroup_names = make_shared<Array>();
1492 BOOST_FOREACH(const UserGroup::Ptr& usergroup, CompatUtility::GetCheckableNotificationUserGroups(host)) {
1493 contactgroup_names->Add(usergroup->GetName());
1496 return contactgroup_names;
1499 Value HostsTable::ServicesAccessor(const Value& row)
1501 Host::Ptr host = static_cast<Host::Ptr>(row);
1506 Array::Ptr services = make_shared<Array>();
1508 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1509 services->Add(service->GetShortName());
1515 Value HostsTable::ServicesWithStateAccessor(const Value& row)
1517 Host::Ptr host = static_cast<Host::Ptr>(row);
1522 Array::Ptr services = make_shared<Array>();
1524 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1525 Array::Ptr svc_add = make_shared<Array>();
1527 svc_add->Add(service->GetShortName());
1528 svc_add->Add(service->GetState());
1529 svc_add->Add(service->HasBeenChecked() ? 1 : 0);
1530 services->Add(svc_add);
1536 Value HostsTable::ServicesWithInfoAccessor(const Value& row)
1538 Host::Ptr host = static_cast<Host::Ptr>(row);
1543 Array::Ptr services = make_shared<Array>();
1545 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
1546 Array::Ptr svc_add = make_shared<Array>();
1548 svc_add->Add(service->GetShortName());
1549 svc_add->Add(service->GetState());
1550 svc_add->Add(service->HasBeenChecked() ? 1 : 0);
1553 CheckResult::Ptr cr = service->GetLastCheckResult();
1556 output = CompatUtility::GetCheckResultOutput(cr);
1558 svc_add->Add(output);
1559 services->Add(svc_add);