]> granicus.if.org Git - icinga2/blob - components/livestatus/servicestable.cpp
livestatus: fix check_type (0..active, 1..passive)
[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_", boost::bind(&ServicesTable::HostAccessor, _1, objectAccessor));
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 Value& row, const Column::ObjectAccessor& parentObjectAccessor)
138 {
139         Value service;
140
141         if (parentObjectAccessor)
142                 service = parentObjectAccessor(row);
143         else
144                 service = row;
145
146         return static_cast<Service::Ptr>(service)->GetHost();
147 }
148
149 Value ServicesTable::ShortNameAccessor(const Value& row)
150 {
151         return static_cast<Service::Ptr>(row)->GetShortName();
152 }
153
154 Value ServicesTable::DisplayNameAccessor(const Value& row)
155 {
156         return static_cast<Service::Ptr>(row)->GetDisplayName();
157 }
158
159 Value ServicesTable::CheckCommandAccessor(const Value& row)
160 {
161         CheckCommand::Ptr checkcommand = static_cast<Service::Ptr>(row)->GetCheckCommand();
162
163         if (checkcommand)
164                 return checkcommand->GetName(); /* this is the name without '!' args */
165
166         return Value();
167 }
168
169 Value ServicesTable::CheckCommandExpandedAccessor(const Value& row)
170 {
171         CheckCommand::Ptr checkcommand = static_cast<Service::Ptr>(row)->GetCheckCommand();
172
173         if (checkcommand)
174                 return checkcommand->GetName(); /* this is the name without '!' args */
175
176         return Value();
177 }
178
179 Value ServicesTable::EventHandlerAccessor(const Value& row)
180 {
181         EventCommand::Ptr eventcommand = static_cast<Service::Ptr>(row)->GetEventCommand();
182
183         if (eventcommand)
184                 return eventcommand->GetName();
185
186         return Value();
187 }
188
189 Value ServicesTable::PluginOutputAccessor(const Value& row)
190 {
191         return static_cast<Service::Ptr>(row)->GetLastCheckOutput();
192 }
193
194 Value ServicesTable::LongPluginOutputAccessor(const Value& row)
195 {
196         return static_cast<Service::Ptr>(row)->GetLastCheckLongOutput();
197 }
198
199 Value ServicesTable::PerfDataAccessor(const Value& row)
200 {
201         return static_cast<Service::Ptr>(row)->GetLastCheckPerfData();
202 }
203
204 Value ServicesTable::NotificationPeriodAccessor(const Value& row)
205 {
206         /* TODO */
207         return Value();
208 }
209
210 Value ServicesTable::CheckPeriodAccessor(const Value& row)
211 {
212         TimePeriod::Ptr timeperiod = static_cast<Service::Ptr>(row)->GetCheckPeriod();
213
214         if (!timeperiod)
215                 return Value();
216
217         return timeperiod->GetName();
218 }
219
220 Value ServicesTable::NotesAccessor(const Value& row)
221 {
222         Dictionary::Ptr custom = static_cast<Service::Ptr>(row)->GetCustom();
223
224         if (!custom)
225                 return Value();
226
227         return custom->Get("notes");
228 }
229
230 Value ServicesTable::NotesExpandedAccessor(const Value& row)
231 {
232         /* TODO */
233         return Value();
234 }
235
236 Value ServicesTable::NotesUrlAccessor(const Value& row)
237 {
238         Dictionary::Ptr custom = static_cast<Service::Ptr>(row)->GetCustom();
239
240         if (!custom)
241                 return Value();
242
243         return custom->Get("notes_url");
244 }
245
246 Value ServicesTable::NotesUrlExpandedAccessor(const Value& row)
247 {
248         /* TODO */
249         return Value();
250 }
251
252 Value ServicesTable::ActionUrlAccessor(const Value& row)
253 {
254         Dictionary::Ptr custom = static_cast<Service::Ptr>(row)->GetCustom();
255
256         if (!custom)
257                 return Value();
258
259         return custom->Get("action_url");
260 }
261
262 Value ServicesTable::ActionUrlExpandedAccessor(const Value& row)
263 {
264         /* TODO */
265         return Value();
266 }
267
268 Value ServicesTable::IconImageAccessor(const Value& row)
269 {
270         Dictionary::Ptr custom = static_cast<Service::Ptr>(row)->GetCustom();
271
272         if (!custom)
273                 return Value();
274
275         return custom->Get("icon_image");
276 }
277
278 Value ServicesTable::IconImageExpandedAccessor(const Value& row)
279 {
280         /* TODO */
281         return Value();
282 }
283
284 Value ServicesTable::IconImageAltAccessor(const Value& row)
285 {
286         Dictionary::Ptr custom = static_cast<Service::Ptr>(row)->GetCustom();
287
288         if (!custom)
289                 return Value();
290
291         return custom->Get("icon_image_alt");
292 }
293
294 Value ServicesTable::InitialStateAccessor(const Value& row)
295 {
296         /* not supported */
297         return Value();
298 }
299
300 Value ServicesTable::MaxCheckAttemptsAccessor(const Value& row)
301 {
302         return static_cast<Service::Ptr>(row)->GetMaxCheckAttempts();
303 }
304
305 Value ServicesTable::CurrentAttemptAccessor(const Value& row)
306 {
307         return static_cast<Service::Ptr>(row)->GetCurrentCheckAttempt();
308 }
309
310 Value ServicesTable::StateAccessor(const Value& row)
311 {
312         return static_cast<Service::Ptr>(row)->GetState();
313 }
314
315 Value ServicesTable::HasBeenCheckedAccessor(const Value& row)
316 {
317         return (static_cast<Service::Ptr>(row)->HasBeenChecked() ? 1 : 0);
318 }
319
320 Value ServicesTable::LastStateAccessor(const Value& row)
321 {
322         return static_cast<Service::Ptr>(row)->GetLastState();
323 }
324
325 Value ServicesTable::LastHardStateAccessor(const Value& row)
326 {
327         return static_cast<Service::Ptr>(row)->GetLastHardState();
328 }
329
330 Value ServicesTable::StateTypeAccessor(const Value& row)
331 {
332         return static_cast<Service::Ptr>(row)->GetStateType();
333 }
334
335 Value ServicesTable::CheckTypeAccessor(const Value& row)
336 {
337         return (static_cast<Service::Ptr>(row)->GetEnableActiveChecks() ? 0 : 1);
338 }
339
340 Value ServicesTable::AcknowledgedAccessor(const Value& row)
341 {
342         Service::Ptr service = static_cast<Service::Ptr>(row);
343
344         /* important: lock acknowledgements */
345         ObjectLock olock(service);
346
347         return (service->IsAcknowledged() ? 1 : 0);
348 }
349
350 Value ServicesTable::AcknowledgementTypeAccessor(const Value& row)
351 {
352         Service::Ptr service = static_cast<Service::Ptr>(row);
353
354         /* important: lock acknowledgements */
355         ObjectLock olock(service);
356
357         return static_cast<int>(service->GetAcknowledgement());
358 }
359
360 Value ServicesTable::NoMoreNotificationsAccessor(const Value& row)
361 {
362         /* TODO: notification_interval == 0, volatile == false */
363         return Value();
364 }
365
366 Value ServicesTable::LastTimeOkAccessor(const Value& row)
367 {
368         /* TODO */
369         return Value();
370 }
371
372 Value ServicesTable::LastTimeWarningAccessor(const Value& row)
373 {
374         /* TODO */
375         return Value();
376 }
377
378 Value ServicesTable::LastTimeCriticalAccessor(const Value& row)
379 {
380         /* TODO */
381         return Value();
382 }
383
384 Value ServicesTable::LastTimeUnknownAccessor(const Value& row)
385 {
386         /* TODO */
387         return Value();
388 }
389
390 Value ServicesTable::LastCheckAccessor(const Value& row)
391 {
392         return static_cast<int>(static_cast<Service::Ptr>(row)->GetLastCheck());
393 }
394
395 Value ServicesTable::NextCheckAccessor(const Value& row)
396 {
397         return static_cast<int>(static_cast<Service::Ptr>(row)->GetNextCheck());
398 }
399
400 Value ServicesTable::LastNotificationAccessor(const Value& row)
401 {
402         /* TODO Host->Service->GetNotifications->(loop)->GetLastNotification() */
403         return Value();
404 }
405
406 Value ServicesTable::NextNotificationAccessor(const Value& row)
407 {
408         /* TODO Host->Service->GetNotifications->(loop)->GetLastNotification() */
409         return Value();
410 }
411
412 Value ServicesTable::CurrentNotificationNumberAccessor(const Value& row)
413 {
414         /* TODO Host->Service->GetNotifications->(loop) new attribute */
415         return Value();
416 }
417
418 Value ServicesTable::LastStateChangeAccessor(const Value& row)
419 {
420         return static_cast<int>(static_cast<Service::Ptr>(row)->GetLastStateChange());
421 }
422
423 Value ServicesTable::LastHardStateChangeAccessor(const Value& row)
424 {
425         return static_cast<int>(static_cast<Service::Ptr>(row)->GetLastHardStateChange());
426 }
427
428 Value ServicesTable::ScheduledDowntimeDepthAccessor(const Value& row)
429 {
430         return static_cast<Service::Ptr>(row)->GetDowntimeDepth();
431 }
432
433 Value ServicesTable::IsFlappingAccessor(const Value& row)
434 {
435         return static_cast<Service::Ptr>(row)->IsFlapping();
436 }
437
438 Value ServicesTable::ChecksEnabledAccessor(const Value& row)
439 {
440         return (static_cast<Service::Ptr>(row)->GetEnableActiveChecks() ? 1 : 0);
441 }
442
443 Value ServicesTable::AcceptPassiveChecksAccessor(const Value& row)
444 {
445         return (static_cast<Service::Ptr>(row)->GetEnablePassiveChecks() ? 1 : 0);
446 }
447
448 Value ServicesTable::EventHandlerEnabledAccessor(const Value& row)
449 {
450         /* TODO always enabled*/
451         return Value(1);
452 }
453
454 Value ServicesTable::NotificationsEnabledAccessor(const Value& row)
455 {
456         return (static_cast<Service::Ptr>(row)->GetEnableNotifications() ? 1 : 0);
457 }
458
459 Value ServicesTable::ProcessPerformanceDataAccessor(const Value& row)
460 {
461         /* TODO always enabled */
462         return Value(1);
463 }
464
465 Value ServicesTable::IsExecutingAccessor(const Value& row)
466 {
467         /* TODO does that make sense with Icinga2? */
468         return Value();
469 }
470
471 Value ServicesTable::ActiveChecksEnabledAccessor(const Value& row)
472 {
473         return (static_cast<Service::Ptr>(row)->GetEnableActiveChecks() ? 1 : 0);
474 }
475
476 Value ServicesTable::CheckOptionsAccessor(const Value& row)
477 {
478         /* TODO - forcexec, freshness, orphan, none */
479         return Value();
480 }
481
482 Value ServicesTable::FlapDetectionEnabledAccessor(const Value& row)
483 {
484         return (static_cast<Service::Ptr>(row)->GetEnableFlapping() ? 1 : 0);
485 }
486
487 Value ServicesTable::CheckFreshnessAccessor(const Value& row)
488 {
489         /* TODO */
490         return Value();
491 }
492
493 Value ServicesTable::ObsessOverServiceAccessor(const Value& row)
494 {
495         /* not supported */
496         return Value();
497 }
498
499 Value ServicesTable::ModifiedAttributesAccessor(const Value& row)
500 {
501         /* not supported */
502         return Value();
503 }
504
505 Value ServicesTable::ModifiedAttributesListAccessor(const Value& row)
506 {
507         /* not supported */
508         return Value();
509 }
510
511 Value ServicesTable::PnpgraphPresentAccessor(const Value& row)
512 {
513         /* not supported */
514         return Value();
515 }
516
517 Value ServicesTable::CheckIntervalAccessor(const Value& row)
518 {
519         return (static_cast<Service::Ptr>(row)->GetCheckInterval() / 60.0);
520 }
521
522 Value ServicesTable::RetryIntervalAccessor(const Value& row)
523 {
524         return (static_cast<Service::Ptr>(row)->GetRetryInterval() / 60.0);
525 }
526
527 Value ServicesTable::NotificationIntervalAccessor(const Value& row)
528 {
529         /* TODO Host->Services->GetNotifications->(loop)->GetNotificationInterval() */
530         return Value();
531 }
532
533 Value ServicesTable::FirstNotificationDelayAccessor(const Value& row)
534 {
535         /* not supported */
536         return Value();
537 }
538
539 Value ServicesTable::LowFlapThresholdAccessor(const Value& row)
540 {
541         /* TODO */
542         return Value();
543 }
544
545 Value ServicesTable::HighFlapThresholdAccessor(const Value& row)
546 {
547         /* TODO */
548         return Value();
549 }
550
551 Value ServicesTable::LatencyAccessor(const Value& row)
552 {
553         return (Service::CalculateLatency(static_cast<Service::Ptr>(row)->GetLastCheckResult()));
554 }
555
556 Value ServicesTable::ExecutionTimeAccessor(const Value& row)
557 {
558         return (Service::CalculateExecutionTime(static_cast<Service::Ptr>(row)->GetLastCheckResult()));
559 }
560
561 Value ServicesTable::PercentStateChangeAccessor(const Value& row)
562 {
563         return static_cast<Service::Ptr>(row)->GetFlappingCurrent();
564 }
565
566 Value ServicesTable::InCheckPeriodAccessor(const Value& row)
567 {
568         /* TODO */
569         return Value();
570 }
571
572 Value ServicesTable::InNotificationPeriodAccessor(const Value& row)
573 {
574         /* TODO */
575         return Value();
576 }
577
578 Value ServicesTable::ContactsAccessor(const Value& row)
579 {
580         /* TODO - host->service->notifications->users */
581 /*
582         std::set<User::Ptr> allUsers;
583         std::set<User::Ptr> users;
584
585         BOOST_FOREACH(const Notification::Ptr& notification, static_cast<Service::Ptr>(row)->GetNotifications()) {
586                 ObjectLock olock(notification);
587
588                 users = notification->GetUsers();
589
590                 std::copy(users.begin(), users.end(), std::inserter(allUsers, allUsers.begin()));
591
592                 BOOST_FOREACH(const UserGroup::Ptr& ug, notification->GetGroups()) {
593                         std::set<User::Ptr> members = ug->GetMembers();
594                         std::copy(members.begin(), members.end(), std::inserter(allUsers, allUsers.begin()));
595                 }
596         }
597 */
598         return Value();
599 }
600
601 Value ServicesTable::DowntimesAccessor(const Value& row)
602 {
603         /* TODO */
604         return Value();
605 }
606
607 Value ServicesTable::DowntimesWithInfoAccessor(const Value& row)
608 {
609         /* TODO */
610         return Value();
611 }
612
613 Value ServicesTable::CommentsAccessor(const Value& row)
614 {
615         /* TODO */
616         return Value();
617 }
618
619 Value ServicesTable::CommentsWithInfoAccessor(const Value& row)
620 {
621         /* TODO */
622         return Value();
623 }
624
625 Value ServicesTable::CommentsWithExtraInfoAccessor(const Value& row)
626 {
627         /* TODO */
628         return Value();
629 }
630
631 Value ServicesTable::CustomVariableNamesAccessor(const Value& row)
632 {
633         /* TODO */
634         return Value();
635 }
636
637 Value ServicesTable::CustomVariableValuesAccessor(const Value& row)
638 {
639         /* TODO */
640         return Value();
641 }
642
643 Value ServicesTable::CustomVariablesAccessor(const Value& row)
644 {
645         /*
646         Service::Ptr svc = static_cast<Service::Ptr>(row);
647
648         Dictionary::Ptr custom = svc->Get("custom");
649
650         if (!custom)
651                 return Value();
652
653         Dictionary::Ptr customvars = custom->ShallowClone();
654         customvars->Remove("notes");
655         customvars->Remove("action_url");
656         customvars->Remove("notes_url");
657         customvars->Remove("icon_image");
658         customvars->Remove("icon_image_alt");
659         customvars->Remove("statusmap_image");
660         customvars->Remove("2d_coords");
661
662         return customvars;
663         */
664         /* TODO */
665         return Value();
666 }
667
668 Value ServicesTable::GroupsAccessor(const Value& row)
669 {
670         /* TODO */
671         return Value();
672 }
673
674 Value ServicesTable::ContactGroupsAccessor(const Value& row)
675 {
676         /* TODO */
677         return Value();
678 }
679
680