]> granicus.if.org Git - icinga2/blob - components/livestatus/servicestable.cpp
Merge remote-tracking branch 'origin/master'
[icinga2] / components / livestatus / servicestable.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/)        *
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/servicestable.h"
21 #include "livestatus/hoststable.h"
22 #include "icinga/service.h"
23 #include "icinga/checkcommand.h"
24 #include "icinga/eventcommand.h"
25 #include "icinga/timeperiod.h"
26 #include "base/dynamictype.h"
27 #include "base/objectlock.h"
28 #include <boost/foreach.hpp>
29
30 using namespace icinga;
31 using namespace livestatus;
32
33 ServicesTable::ServicesTable(void)
34 {
35         AddColumns(this);
36 }
37
38 void ServicesTable::AddColumns(Table *table, const String& prefix,
39     const Column::ObjectAccessor& objectAccessor)
40 {
41         table->AddColumn(prefix + "description", Column(&ServicesTable::ShortNameAccessor, objectAccessor));
42         table->AddColumn(prefix + "display_name", Column(&ServicesTable::DisplayNameAccessor, objectAccessor));
43         table->AddColumn(prefix + "check_command", Column(&ServicesTable::CheckCommandAccessor, objectAccessor));
44         table->AddColumn(prefix + "check_command_expanded", Column(&ServicesTable::CheckCommandExpandedAccessor, objectAccessor));
45         table->AddColumn(prefix + "event_handler", Column(&ServicesTable::EventHandlerAccessor, objectAccessor));
46         table->AddColumn(prefix + "plugin_output", Column(&ServicesTable::PluginOutputAccessor, objectAccessor));
47         table->AddColumn(prefix + "long_plugin_output", Column(&ServicesTable::LongPluginOutputAccessor, objectAccessor));
48         table->AddColumn(prefix + "perf_data", Column(&ServicesTable::PerfDataAccessor, objectAccessor));
49         table->AddColumn(prefix + "notification_period", Column(&ServicesTable::NotificationPeriodAccessor, objectAccessor));
50         table->AddColumn(prefix + "check_period", Column(&ServicesTable::CheckPeriodAccessor, objectAccessor));
51         table->AddColumn(prefix + "notes", Column(&ServicesTable::NotesAccessor, objectAccessor));
52         table->AddColumn(prefix + "notes_expanded", Column(&ServicesTable::NotesExpandedAccessor, objectAccessor));
53         table->AddColumn(prefix + "notes_url", Column(&ServicesTable::NotesUrlAccessor, objectAccessor));
54         table->AddColumn(prefix + "notes_url_expanded", Column(&ServicesTable::NotesUrlExpandedAccessor, objectAccessor));
55         table->AddColumn(prefix + "action_url", Column(&ServicesTable::ActionUrlAccessor, objectAccessor));
56         table->AddColumn(prefix + "action_url_expanded", Column(&ServicesTable::ActionUrlExpandedAccessor, objectAccessor));
57         table->AddColumn(prefix + "icon_image", Column(&ServicesTable::IconImageAccessor, objectAccessor));
58         table->AddColumn(prefix + "icon_image_expanded", Column(&ServicesTable::IconImageExpandedAccessor, objectAccessor));
59         table->AddColumn(prefix + "icon_image_alt", Column(&ServicesTable::IconImageAltAccessor, objectAccessor));
60         table->AddColumn(prefix + "initial_state", Column(&ServicesTable::InitialStateAccessor, objectAccessor));
61         table->AddColumn(prefix + "max_check_attempts", Column(&ServicesTable::MaxCheckAttemptsAccessor, objectAccessor));
62         table->AddColumn(prefix + "current_attempt", Column(&ServicesTable::CurrentAttemptAccessor, objectAccessor));
63         table->AddColumn(prefix + "state", Column(&ServicesTable::StateAccessor, objectAccessor));
64         table->AddColumn(prefix + "has_been_checked", Column(&ServicesTable::HasBeenCheckedAccessor, objectAccessor));
65         table->AddColumn(prefix + "last_state", Column(&ServicesTable::LastStateAccessor, objectAccessor));
66         table->AddColumn(prefix + "last_hard_state", Column(&ServicesTable::LastHardStateAccessor, objectAccessor));
67         table->AddColumn(prefix + "state_type", Column(&ServicesTable::StateTypeAccessor, objectAccessor));
68         table->AddColumn(prefix + "check_type", Column(&ServicesTable::CheckTypeAccessor, objectAccessor));
69         table->AddColumn(prefix + "acknowledged", Column(&ServicesTable::AcknowledgedAccessor, objectAccessor));
70         table->AddColumn(prefix + "acknowledgement_type", Column(&ServicesTable::AcknowledgementTypeAccessor, objectAccessor));
71         table->AddColumn(prefix + "no_more_notifications", Column(&ServicesTable::NoMoreNotificationsAccessor, objectAccessor));
72         table->AddColumn(prefix + "last_time_ok", Column(&ServicesTable::LastTimeOkAccessor, objectAccessor));
73         table->AddColumn(prefix + "last_time_warning", Column(&ServicesTable::LastTimeWarningAccessor, objectAccessor));
74         table->AddColumn(prefix + "last_time_critical", Column(&ServicesTable::LastTimeCriticalAccessor, objectAccessor));
75         table->AddColumn(prefix + "last_time_unknown", Column(&ServicesTable::LastTimeUnknownAccessor, objectAccessor));
76         table->AddColumn(prefix + "last_check", Column(&ServicesTable::LastCheckAccessor, objectAccessor));
77         table->AddColumn(prefix + "next_check", Column(&ServicesTable::NextCheckAccessor, objectAccessor));
78         table->AddColumn(prefix + "last_notification", Column(&ServicesTable::LastNotificationAccessor, objectAccessor));
79         table->AddColumn(prefix + "next_notification", Column(&ServicesTable::NextNotificationAccessor, objectAccessor));
80         table->AddColumn(prefix + "current_notification_number", Column(&ServicesTable::CurrentNotificationNumberAccessor, objectAccessor));
81         table->AddColumn(prefix + "last_state_change", Column(&ServicesTable::LastStateChangeAccessor, objectAccessor));
82         table->AddColumn(prefix + "last_hard_state_change", Column(&ServicesTable::LastHardStateChangeAccessor, objectAccessor));
83         table->AddColumn(prefix + "scheduled_downtime_depth", Column(&ServicesTable::ScheduledDowntimeDepthAccessor, objectAccessor));
84         table->AddColumn(prefix + "is_flapping", Column(&ServicesTable::IsFlappingAccessor, objectAccessor));
85         table->AddColumn(prefix + "checks_enabled", Column(&ServicesTable::ChecksEnabledAccessor, objectAccessor));
86         table->AddColumn(prefix + "accept_passive_checks", Column(&ServicesTable::AcceptPassiveChecksAccessor, objectAccessor));
87         table->AddColumn(prefix + "event_handler_enabled", Column(&ServicesTable::EventHandlerEnabledAccessor, objectAccessor));
88         table->AddColumn(prefix + "notifications_enabled", Column(&ServicesTable::NotificationsEnabledAccessor, objectAccessor));
89         table->AddColumn(prefix + "process_performance_data", Column(&ServicesTable::ProcessPerformanceDataAccessor, objectAccessor));
90         table->AddColumn(prefix + "is_executing", Column(&ServicesTable::IsExecutingAccessor, objectAccessor));
91         table->AddColumn(prefix + "active_checks_enabled", Column(&ServicesTable::ActiveChecksEnabledAccessor, objectAccessor));
92         table->AddColumn(prefix + "check_options", Column(&ServicesTable::CheckOptionsAccessor, objectAccessor));
93         table->AddColumn(prefix + "flap_detection_enabled", Column(&ServicesTable::FlapDetectionEnabledAccessor, objectAccessor));
94         table->AddColumn(prefix + "check_freshness", Column(&ServicesTable::CheckFreshnessAccessor, objectAccessor));
95         table->AddColumn(prefix + "obsess_over_service", Column(&ServicesTable::ObsessOverServiceAccessor, objectAccessor));
96         table->AddColumn(prefix + "modified_attributes", Column(&ServicesTable::ModifiedAttributesAccessor, objectAccessor));
97         table->AddColumn(prefix + "modified_attributes_list", Column(&ServicesTable::ModifiedAttributesListAccessor, objectAccessor));
98         table->AddColumn(prefix + "pnpgraph_present", Column(&ServicesTable::PnpgraphPresentAccessor, objectAccessor));
99         table->AddColumn(prefix + "check_interval", Column(&ServicesTable::CheckIntervalAccessor, objectAccessor));
100         table->AddColumn(prefix + "retry_interval", Column(&ServicesTable::RetryIntervalAccessor, objectAccessor));
101         table->AddColumn(prefix + "notification_interval", Column(&ServicesTable::NotificationIntervalAccessor, objectAccessor));
102         table->AddColumn(prefix + "first_notification_delay", Column(&ServicesTable::FirstNotificationDelayAccessor, objectAccessor));
103         table->AddColumn(prefix + "low_flap_threshold", Column(&ServicesTable::LowFlapThresholdAccessor, objectAccessor));
104         table->AddColumn(prefix + "high_flap_threshold", Column(&ServicesTable::HighFlapThresholdAccessor, objectAccessor));
105         table->AddColumn(prefix + "latency", Column(&ServicesTable::LatencyAccessor, objectAccessor));
106         table->AddColumn(prefix + "execution_time", Column(&ServicesTable::ExecutionTimeAccessor, objectAccessor));
107         table->AddColumn(prefix + "percent_state_change", Column(&ServicesTable::PercentStateChangeAccessor, objectAccessor));
108         table->AddColumn(prefix + "in_check_period", Column(&ServicesTable::InCheckPeriodAccessor, objectAccessor));
109         table->AddColumn(prefix + "in_notification_period", Column(&ServicesTable::InNotificationPeriodAccessor, objectAccessor));
110         table->AddColumn(prefix + "contacts", Column(&ServicesTable::ContactsAccessor, objectAccessor));
111         table->AddColumn(prefix + "downtimes", Column(&ServicesTable::DowntimesAccessor, objectAccessor));
112         table->AddColumn(prefix + "downtimes_with_info", Column(&ServicesTable::DowntimesWithInfoAccessor, objectAccessor));
113         table->AddColumn(prefix + "comments", Column(&ServicesTable::CommentsAccessor, objectAccessor));
114         table->AddColumn(prefix + "comments_with_info", Column(&ServicesTable::CommentsWithInfoAccessor, objectAccessor));
115         table->AddColumn(prefix + "comments_with_extra_info", Column(&ServicesTable::CommentsWithExtraInfoAccessor, objectAccessor));
116         table->AddColumn(prefix + "custom_variable_names", Column(&ServicesTable::CustomVariableNamesAccessor, objectAccessor));
117         table->AddColumn(prefix + "custom_variable_values", Column(&ServicesTable::CustomVariableValuesAccessor, objectAccessor));
118         table->AddColumn(prefix + "custom_variables", Column(&ServicesTable::CustomVariablesAccessor, objectAccessor));
119         table->AddColumn(prefix + "groups", Column(&ServicesTable::GroupsAccessor, objectAccessor));
120         table->AddColumn(prefix + "contact_groups", Column(&ServicesTable::ContactGroupsAccessor, objectAccessor));
121
122         HostsTable::AddColumns(table, "host_", &ServicesTable::HostAccessor);
123 }
124
125 String ServicesTable::GetName(void) const
126 {
127         return "services";
128 }
129
130 void ServicesTable::FetchRows(const AddRowFunction& addRowFn)
131 {
132         BOOST_FOREACH(const DynamicObject::Ptr& object, DynamicType::GetObjects("Service")) {
133                 addRowFn(object);
134         }
135 }
136
137 Object::Ptr ServicesTable::HostAccessor(const Object::Ptr& object)
138 {
139         return static_pointer_cast<Service>(object)->GetHost();
140 }
141
142 Value ServicesTable::ShortNameAccessor(const Object::Ptr& object)
143 {
144         return static_pointer_cast<Service>(object)->GetShortName();
145 }
146
147 Value ServicesTable::DisplayNameAccessor(const Object::Ptr& object)
148 {
149         return static_pointer_cast<Service>(object)->GetDisplayName();
150 }
151
152 Value ServicesTable::CheckCommandAccessor(const Object::Ptr& object)
153 {
154         CheckCommand::Ptr checkcommand = static_pointer_cast<Service>(object)->GetCheckCommand();
155
156         if (checkcommand)
157                 return checkcommand->GetName(); /* this is the name without '!' args */
158
159         return Value();
160 }
161
162 Value ServicesTable::CheckCommandExpandedAccessor(const Object::Ptr& object)
163 {
164         CheckCommand::Ptr checkcommand = static_pointer_cast<Service>(object)->GetCheckCommand();
165
166         if (checkcommand)
167                 return checkcommand->GetName(); /* this is the name without '!' args */
168
169         return Value();
170 }
171
172 Value ServicesTable::EventHandlerAccessor(const Object::Ptr& object)
173 {
174         EventCommand::Ptr eventcommand = static_pointer_cast<Service>(object)->GetEventCommand();
175
176         if (eventcommand)
177                 return eventcommand->GetName();
178
179         return Value();
180 }
181
182 Value ServicesTable::PluginOutputAccessor(const Object::Ptr& object)
183 {
184         return static_pointer_cast<Service>(object)->GetLastCheckOutput();
185 }
186
187 Value ServicesTable::LongPluginOutputAccessor(const Object::Ptr& object)
188 {
189         return static_pointer_cast<Service>(object)->GetLastCheckLongOutput();
190 }
191
192 Value ServicesTable::PerfDataAccessor(const Object::Ptr& object)
193 {
194         return static_pointer_cast<Service>(object)->GetLastCheckPerfData();
195 }
196
197 Value ServicesTable::NotificationPeriodAccessor(const Object::Ptr& object)
198 {
199         /* TODO */
200         return Value();
201 }
202
203 Value ServicesTable::CheckPeriodAccessor(const Object::Ptr& object)
204 {
205         TimePeriod::Ptr timeperiod = static_pointer_cast<Service>(object)->GetCheckPeriod();
206
207         if (!timeperiod)
208                 return Value();
209
210         return timeperiod->GetName();
211 }
212
213 Value ServicesTable::NotesAccessor(const Object::Ptr& object)
214 {
215         Dictionary::Ptr custom = static_pointer_cast<Service>(object)->GetCustom();
216
217         if (!custom)
218                 return Value();
219
220         return custom->Get("notes");
221 }
222
223 Value ServicesTable::NotesExpandedAccessor(const Object::Ptr& object)
224 {
225         /* TODO */
226         return Value();
227 }
228
229 Value ServicesTable::NotesUrlAccessor(const Object::Ptr& object)
230 {
231         Dictionary::Ptr custom = static_pointer_cast<Service>(object)->GetCustom();
232
233         if (!custom)
234                 return Value();
235
236         return custom->Get("notes_url");
237 }
238
239 Value ServicesTable::NotesUrlExpandedAccessor(const Object::Ptr& object)
240 {
241         /* TODO */
242         return Value();
243 }
244
245 Value ServicesTable::ActionUrlAccessor(const Object::Ptr& object)
246 {
247         Dictionary::Ptr custom = static_pointer_cast<Service>(object)->GetCustom();
248
249         if (!custom)
250                 return Value();
251
252         return custom->Get("action_url");
253 }
254
255 Value ServicesTable::ActionUrlExpandedAccessor(const Object::Ptr& object)
256 {
257         /* TODO */
258         return Value();
259 }
260
261 Value ServicesTable::IconImageAccessor(const Object::Ptr& object)
262 {
263         Dictionary::Ptr custom = static_pointer_cast<Service>(object)->GetCustom();
264
265         if (!custom)
266                 return Value();
267
268         return custom->Get("icon_image");
269 }
270
271 Value ServicesTable::IconImageExpandedAccessor(const Object::Ptr& object)
272 {
273         /* TODO */
274         return Value();
275 }
276
277 Value ServicesTable::IconImageAltAccessor(const Object::Ptr& object)
278 {
279         Dictionary::Ptr custom = static_pointer_cast<Service>(object)->GetCustom();
280
281         if (!custom)
282                 return Value();
283
284         return custom->Get("icon_image_alt");
285 }
286
287 Value ServicesTable::InitialStateAccessor(const Object::Ptr& object)
288 {
289         /* not supported */
290         return Value();
291 }
292
293 Value ServicesTable::MaxCheckAttemptsAccessor(const Object::Ptr& object)
294 {
295         return static_pointer_cast<Service>(object)->GetMaxCheckAttempts();
296 }
297
298 Value ServicesTable::CurrentAttemptAccessor(const Object::Ptr& object)
299 {
300         return static_pointer_cast<Service>(object)->GetCurrentCheckAttempt();
301 }
302
303 Value ServicesTable::StateAccessor(const Object::Ptr& object)
304 {
305         return static_pointer_cast<Service>(object)->GetState();
306 }
307
308 Value ServicesTable::HasBeenCheckedAccessor(const Object::Ptr& object)
309 {
310         return (static_pointer_cast<Service>(object)->HasBeenChecked() ? 1 : 0);
311 }
312
313 Value ServicesTable::LastStateAccessor(const Object::Ptr& object)
314 {
315         return static_pointer_cast<Service>(object)->GetLastState();
316 }
317
318 Value ServicesTable::LastHardStateAccessor(const Object::Ptr& object)
319 {
320         return static_pointer_cast<Service>(object)->GetLastHardState();
321 }
322
323 Value ServicesTable::StateTypeAccessor(const Object::Ptr& object)
324 {
325         return static_pointer_cast<Service>(object)->GetStateType();
326 }
327
328 Value ServicesTable::CheckTypeAccessor(const Object::Ptr& object)
329 {
330         return (static_pointer_cast<Service>(object)->GetEnableActiveChecks() ? 1 : 0);
331 }
332
333 Value ServicesTable::AcknowledgedAccessor(const Object::Ptr& object)
334 {
335         Service::Ptr service = static_pointer_cast<Service>(object);
336
337         /* important: lock acknowledgements */
338         ObjectLock olock(service);
339
340         return (service->IsAcknowledged() ? 1 : 0);
341 }
342
343 Value ServicesTable::AcknowledgementTypeAccessor(const Object::Ptr& object)
344 {
345         Service::Ptr service = static_pointer_cast<Service>(object);
346
347         /* important: lock acknowledgements */
348         ObjectLock olock(service);
349
350         return static_cast<int>(service->GetAcknowledgement());
351 }
352
353 Value ServicesTable::NoMoreNotificationsAccessor(const Object::Ptr& object)
354 {
355         /* TODO: notification_interval == 0, volatile == false */
356         return Value();
357 }
358
359 Value ServicesTable::LastTimeOkAccessor(const Object::Ptr& object)
360 {
361         /* TODO */
362         return Value();
363 }
364
365 Value ServicesTable::LastTimeWarningAccessor(const Object::Ptr& object)
366 {
367         /* TODO */
368         return Value();
369 }
370
371 Value ServicesTable::LastTimeCriticalAccessor(const Object::Ptr& object)
372 {
373         /* TODO */
374         return Value();
375 }
376
377 Value ServicesTable::LastTimeUnknownAccessor(const Object::Ptr& object)
378 {
379         /* TODO */
380         return Value();
381 }
382
383 Value ServicesTable::LastCheckAccessor(const Object::Ptr& object)
384 {
385         return static_pointer_cast<Service>(object)->GetLastCheck();
386 }
387
388 Value ServicesTable::NextCheckAccessor(const Object::Ptr& object)
389 {
390         return static_pointer_cast<Service>(object)->GetNextCheck();
391 }
392
393 Value ServicesTable::LastNotificationAccessor(const Object::Ptr& object)
394 {
395         /* TODO Host->Service->GetNotifications->(loop)->GetLastNotification() */
396         return Value();
397 }
398
399 Value ServicesTable::NextNotificationAccessor(const Object::Ptr& object)
400 {
401         /* TODO Host->Service->GetNotifications->(loop)->GetLastNotification() */
402         return Value();
403 }
404
405 Value ServicesTable::CurrentNotificationNumberAccessor(const Object::Ptr& object)
406 {
407         /* TODO Host->Service->GetNotifications->(loop) new attribute */
408         return Value();
409 }
410
411 Value ServicesTable::LastStateChangeAccessor(const Object::Ptr& object)
412 {
413         return static_pointer_cast<Service>(object)->GetLastStateChange();
414 }
415
416 Value ServicesTable::LastHardStateChangeAccessor(const Object::Ptr& object)
417 {
418         return static_pointer_cast<Service>(object)->GetLastHardStateChange();
419 }
420
421 Value ServicesTable::ScheduledDowntimeDepthAccessor(const Object::Ptr& object)
422 {
423         return static_pointer_cast<Service>(object)->GetDowntimeDepth();
424 }
425
426 Value ServicesTable::IsFlappingAccessor(const Object::Ptr& object)
427 {
428         return static_pointer_cast<Service>(object)->IsFlapping();
429 }
430
431 Value ServicesTable::ChecksEnabledAccessor(const Object::Ptr& object)
432 {
433         return (static_pointer_cast<Service>(object)->GetEnableActiveChecks() ? 1 : 0);
434 }
435
436 Value ServicesTable::AcceptPassiveChecksAccessor(const Object::Ptr& object)
437 {
438         return (static_pointer_cast<Service>(object)->GetEnablePassiveChecks() ? 1 : 0);
439 }
440
441 Value ServicesTable::EventHandlerEnabledAccessor(const Object::Ptr& object)
442 {
443         /* TODO always enabled*/
444         return Value(1);
445 }
446
447 Value ServicesTable::NotificationsEnabledAccessor(const Object::Ptr& object)
448 {
449         return (static_pointer_cast<Service>(object)->GetEnableNotifications() ? 1 : 0);
450 }
451
452 Value ServicesTable::ProcessPerformanceDataAccessor(const Object::Ptr& object)
453 {
454         /* TODO always enabled */
455         return Value(1);
456 }
457
458 Value ServicesTable::IsExecutingAccessor(const Object::Ptr& object)
459 {
460         /* TODO does that make sense with Icinga2? */
461         return Value();
462 }
463
464 Value ServicesTable::ActiveChecksEnabledAccessor(const Object::Ptr& object)
465 {
466         return (static_pointer_cast<Service>(object)->GetEnableActiveChecks() ? 1 : 0);
467 }
468
469 Value ServicesTable::CheckOptionsAccessor(const Object::Ptr& object)
470 {
471         /* TODO - forcexec, freshness, orphan, none */
472         return Value();
473 }
474
475 Value ServicesTable::FlapDetectionEnabledAccessor(const Object::Ptr& object)
476 {
477         return (static_pointer_cast<Service>(object)->GetEnableFlapping() ? 1 : 0);
478 }
479
480 Value ServicesTable::CheckFreshnessAccessor(const Object::Ptr& object)
481 {
482         /* TODO */
483         return Value();
484 }
485
486 Value ServicesTable::ObsessOverServiceAccessor(const Object::Ptr& object)
487 {
488         /* not supported */
489         return Value();
490 }
491
492 Value ServicesTable::ModifiedAttributesAccessor(const Object::Ptr& object)
493 {
494         /* not supported */
495         return Value();
496 }
497
498 Value ServicesTable::ModifiedAttributesListAccessor(const Object::Ptr& object)
499 {
500         /* not supported */
501         return Value();
502 }
503
504 Value ServicesTable::PnpgraphPresentAccessor(const Object::Ptr& object)
505 {
506         /* not supported */
507         return Value();
508 }
509
510 Value ServicesTable::CheckIntervalAccessor(const Object::Ptr& object)
511 {
512         return (static_pointer_cast<Service>(object)->GetCheckInterval() / 60.0);
513 }
514
515 Value ServicesTable::RetryIntervalAccessor(const Object::Ptr& object)
516 {
517         return (static_pointer_cast<Service>(object)->GetRetryInterval() / 60.0);
518 }
519
520 Value ServicesTable::NotificationIntervalAccessor(const Object::Ptr& object)
521 {
522         /* TODO Host->Services->GetNotifications->(loop)->GetNotificationInterval() */
523         return Value();
524 }
525
526 Value ServicesTable::FirstNotificationDelayAccessor(const Object::Ptr& object)
527 {
528         /* not supported */
529         return Value();
530 }
531
532 Value ServicesTable::LowFlapThresholdAccessor(const Object::Ptr& object)
533 {
534         /* TODO */
535         return Value();
536 }
537
538 Value ServicesTable::HighFlapThresholdAccessor(const Object::Ptr& object)
539 {
540         /* TODO */
541         return Value();
542 }
543
544 Value ServicesTable::LatencyAccessor(const Object::Ptr& object)
545 {
546         return (Service::CalculateLatency(static_pointer_cast<Service>(object)->GetLastCheckResult()));
547 }
548
549 Value ServicesTable::ExecutionTimeAccessor(const Object::Ptr& object)
550 {
551         return (Service::CalculateExecutionTime(static_pointer_cast<Service>(object)->GetLastCheckResult()));
552 }
553
554 Value ServicesTable::PercentStateChangeAccessor(const Object::Ptr& object)
555 {
556         return static_pointer_cast<Service>(object)->GetFlappingCurrent();
557 }
558
559 Value ServicesTable::InCheckPeriodAccessor(const Object::Ptr& object)
560 {
561         /* TODO */
562         return Value();
563 }
564
565 Value ServicesTable::InNotificationPeriodAccessor(const Object::Ptr& object)
566 {
567         /* TODO */
568         return Value();
569 }
570
571 Value ServicesTable::ContactsAccessor(const Object::Ptr& object)
572 {
573         /* TODO - host->service->notifications->users */
574         std::set<User::Ptr> allUsers;
575         std::set<User::Ptr> users;
576
577         BOOST_FOREACH(const Notification::Ptr& notification, static_pointer_cast<Service>(object)->GetNotifications()) {
578                 ObjectLock olock(notification);
579
580                 users = notification->GetUsers();
581
582                 std::copy(users.begin(), users.end(), std::inserter(allUsers, allUsers.begin()));
583
584                 BOOST_FOREACH(const UserGroup::Ptr& ug, notification->GetGroups()) {
585                         std::set<User::Ptr> members = ug->GetMembers();
586                         std::copy(members.begin(), members.end(), std::inserter(allUsers, allUsers.begin()));
587                 }
588         }
589
590         return Value();
591 }
592
593 Value ServicesTable::DowntimesAccessor(const Object::Ptr& object)
594 {
595         /* TODO */
596         return Value();
597 }
598
599 Value ServicesTable::DowntimesWithInfoAccessor(const Object::Ptr& object)
600 {
601         /* TODO */
602         return Value();
603 }
604
605 Value ServicesTable::CommentsAccessor(const Object::Ptr& object)
606 {
607         /* TODO */
608         return Value();
609 }
610
611 Value ServicesTable::CommentsWithInfoAccessor(const Object::Ptr& object)
612 {
613         /* TODO */
614         return Value();
615 }
616
617 Value ServicesTable::CommentsWithExtraInfoAccessor(const Object::Ptr& object)
618 {
619         /* TODO */
620         return Value();
621 }
622
623 Value ServicesTable::CustomVariableNamesAccessor(const Object::Ptr& object)
624 {
625         /* TODO */
626         return Value();
627 }
628
629 Value ServicesTable::CustomVariableValuesAccessor(const Object::Ptr& object)
630 {
631         /* TODO */
632         return Value();
633 }
634
635 Value ServicesTable::CustomVariablesAccessor(const Object::Ptr& object)
636 {
637         /* TODO */
638         return Value();
639 }
640
641 Value ServicesTable::GroupsAccessor(const Object::Ptr& object)
642 {
643         /* TODO */
644         return Value();
645 }
646
647 Value ServicesTable::ContactGroupsAccessor(const Object::Ptr& object)
648 {
649         /* TODO */
650         return Value();
651 }
652
653