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