]> granicus.if.org Git - icinga2/blob - lib/livestatus/contactstable.cpp
Docs: Explain across midnight time periods with an overlapping range
[icinga2] / lib / livestatus / contactstable.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "livestatus/contactstable.hpp"
4 #include "icinga/user.hpp"
5 #include "icinga/timeperiod.hpp"
6 #include "icinga/compatutility.hpp"
7 #include "base/configtype.hpp"
8 #include "base/objectlock.hpp"
9 #include "base/json.hpp"
10 #include "base/utility.hpp"
11
12 using namespace icinga;
13
14 ContactsTable::ContactsTable()
15 {
16         AddColumns(this);
17 }
18
19 void ContactsTable::AddColumns(Table *table, const String& prefix,
20         const Column::ObjectAccessor& objectAccessor)
21 {
22         table->AddColumn(prefix + "name", Column(&ContactsTable::NameAccessor, objectAccessor));
23         table->AddColumn(prefix + "alias", Column(&ContactsTable::NameAccessor, objectAccessor));
24         table->AddColumn(prefix + "email", Column(&ContactsTable::EmailAccessor, objectAccessor));
25         table->AddColumn(prefix + "pager", Column(&ContactsTable::PagerAccessor, objectAccessor));
26         table->AddColumn(prefix + "host_notification_period", Column(&ContactsTable::HostNotificationPeriodAccessor, objectAccessor));
27         table->AddColumn(prefix + "service_notification_period", Column(&ContactsTable::ServiceNotificationPeriodAccessor, objectAccessor));
28         table->AddColumn(prefix + "can_submit_commands", Column(&Table::OneAccessor, objectAccessor));
29         table->AddColumn(prefix + "host_notifications_enabled", Column(&ContactsTable::HostNotificationsEnabledAccessor, objectAccessor));
30         table->AddColumn(prefix + "service_notifications_enabled", Column(&ContactsTable::ServiceNotificationsEnabledAccessor, objectAccessor));
31         table->AddColumn(prefix + "in_host_notification_period", Column(&ContactsTable::InHostNotificationPeriodAccessor, objectAccessor));
32         table->AddColumn(prefix + "in_service_notification_period", Column(&ContactsTable::InServiceNotificationPeriodAccessor, objectAccessor));
33         table->AddColumn(prefix + "vars_variable_names", Column(&ContactsTable::CustomVariableNamesAccessor, objectAccessor));
34         table->AddColumn(prefix + "vars_variable_values", Column(&ContactsTable::CustomVariableValuesAccessor, objectAccessor));
35         table->AddColumn(prefix + "vars_variables", Column(&ContactsTable::CustomVariablesAccessor, objectAccessor));
36         table->AddColumn(prefix + "modified_attributes", Column(&Table::ZeroAccessor, objectAccessor));
37         table->AddColumn(prefix + "modified_attributes_list", Column(&Table::ZeroAccessor, objectAccessor));
38         table->AddColumn(prefix + "cv_is_json", Column(&ContactsTable::CVIsJsonAccessor, objectAccessor));
39
40 }
41
42 String ContactsTable::GetName() const
43 {
44         return "contacts";
45 }
46
47 String ContactsTable::GetPrefix() const
48 {
49         return "contact";
50 }
51
52 void ContactsTable::FetchRows(const AddRowFunction& addRowFn)
53 {
54         for (const User::Ptr& user : ConfigType::GetObjectsByType<User>()) {
55                 if (!addRowFn(user, LivestatusGroupByNone, Empty))
56                         return;
57         }
58 }
59
60 Value ContactsTable::NameAccessor(const Value& row)
61 {
62         User::Ptr user = static_cast<User::Ptr>(row);
63
64         if (!user)
65                 return Empty;
66
67         return user->GetName();
68 }
69
70 Value ContactsTable::AliasAccessor(const Value& row)
71 {
72         User::Ptr user = static_cast<User::Ptr>(row);
73
74         if (!user)
75                 return Empty;
76
77         return user->GetDisplayName();
78 }
79
80 Value ContactsTable::EmailAccessor(const Value& row)
81 {
82         User::Ptr user = static_cast<User::Ptr>(row);
83
84         if (!user)
85                 return Empty;
86
87         return user->GetEmail();
88 }
89
90 Value ContactsTable::PagerAccessor(const Value& row)
91 {
92         User::Ptr user = static_cast<User::Ptr>(row);
93
94         if (!user)
95                 return Empty;
96
97         return user->GetPager();
98 }
99
100 Value ContactsTable::HostNotificationPeriodAccessor(const Value& row)
101 {
102         User::Ptr user = static_cast<User::Ptr>(row);
103
104         if (!user)
105                 return Empty;
106
107         /* same as service */
108         TimePeriod::Ptr timeperiod = user->GetPeriod();
109
110         if (!timeperiod)
111                 return Empty;
112
113         return timeperiod->GetName();
114 }
115
116 Value ContactsTable::ServiceNotificationPeriodAccessor(const Value& row)
117 {
118         User::Ptr user = static_cast<User::Ptr>(row);
119
120         if (!user)
121                 return Empty;
122
123         TimePeriod::Ptr timeperiod = user->GetPeriod();
124
125         if (!timeperiod)
126                 return Empty;
127
128         return timeperiod->GetName();
129 }
130
131 Value ContactsTable::HostNotificationsEnabledAccessor(const Value& row)
132 {
133         User::Ptr user = static_cast<User::Ptr>(row);
134
135         if (!user)
136                 return Empty;
137
138         return (user->GetEnableNotifications() ? 1 : 0);
139 }
140
141 Value ContactsTable::ServiceNotificationsEnabledAccessor(const Value& row)
142 {
143         User::Ptr user = static_cast<User::Ptr>(row);
144
145         if (!user)
146                 return Empty;
147
148         return (user->GetEnableNotifications() ? 1 : 0);
149 }
150
151 Value ContactsTable::InHostNotificationPeriodAccessor(const Value& row)
152 {
153         User::Ptr user = static_cast<User::Ptr>(row);
154
155         if (!user)
156                 return Empty;
157
158         TimePeriod::Ptr timeperiod = user->GetPeriod();
159
160         if (!timeperiod)
161                 return Empty;
162
163         return (timeperiod->IsInside(Utility::GetTime()) ? 1 : 0);
164 }
165
166 Value ContactsTable::InServiceNotificationPeriodAccessor(const Value& row)
167 {
168         User::Ptr user = static_cast<User::Ptr>(row);
169
170         if (!user)
171                 return Empty;
172
173         TimePeriod::Ptr timeperiod = user->GetPeriod();
174
175         if (!timeperiod)
176                 return Empty;
177
178         return (timeperiod->IsInside(Utility::GetTime()) ? 1 : 0);
179 }
180
181 Value ContactsTable::CustomVariableNamesAccessor(const Value& row)
182 {
183         User::Ptr user = static_cast<User::Ptr>(row);
184
185         if (!user)
186                 return Empty;
187
188         Dictionary::Ptr vars = user->GetVars();
189
190         ArrayData result;
191
192         if (vars) {
193                 ObjectLock olock(vars);
194                 for (const Dictionary::Pair& kv : vars) {
195                         result.push_back(kv.first);
196                 }
197         }
198
199         return new Array(std::move(result));
200 }
201
202 Value ContactsTable::CustomVariableValuesAccessor(const Value& row)
203 {
204         User::Ptr user = static_cast<User::Ptr>(row);
205
206         if (!user)
207                 return Empty;
208
209         Dictionary::Ptr vars = user->GetVars();
210
211         ArrayData result;
212
213         if (vars) {
214                 ObjectLock olock(vars);
215                 for (const Dictionary::Pair& kv : vars) {
216                         if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
217                                 result.push_back(JsonEncode(kv.second));
218                         else
219                                 result.push_back(kv.second);
220                 }
221         }
222
223         return new Array(std::move(result));
224 }
225
226 Value ContactsTable::CustomVariablesAccessor(const Value& row)
227 {
228         User::Ptr user = static_cast<User::Ptr>(row);
229
230         if (!user)
231                 return Empty;
232
233         Dictionary::Ptr vars = user->GetVars();
234
235         ArrayData result;
236
237         if (vars) {
238                 ObjectLock olock(vars);
239                 for (const Dictionary::Pair& kv : vars) {
240                         Value val;
241
242                         if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
243                                 val = JsonEncode(kv.second);
244                         else
245                                 val = kv.second;
246
247                         result.push_back(new Array({
248                                 kv.first,
249                                 val
250                         }));
251                 }
252         }
253
254         return new Array(std::move(result));
255 }
256
257 Value ContactsTable::CVIsJsonAccessor(const Value& row)
258 {
259         User::Ptr user = static_cast<User::Ptr>(row);
260
261         if (!user)
262                 return Empty;
263
264         Dictionary::Ptr vars = user->GetVars();
265
266         if (!vars)
267                 return Empty;
268
269         bool cv_is_json = false;
270
271         ObjectLock olock(vars);
272         for (const Dictionary::Pair& kv : vars) {
273                 if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>())
274                         cv_is_json = true;
275         }
276
277         return cv_is_json;
278 }