]> granicus.if.org Git - icinga2/blob - lib/livestatus/statustable.cpp
Merge pull request #5933 from mcktr/fix/copyright-for-2018
[icinga2] / lib / livestatus / statustable.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
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/statustable.hpp"
21 #include "livestatus/livestatuslistener.hpp"
22 #include "icinga/icingaapplication.hpp"
23 #include "icinga/cib.hpp"
24 #include "icinga/host.hpp"
25 #include "icinga/service.hpp"
26 #include "base/configtype.hpp"
27 #include "base/utility.hpp"
28 #include "base/application.hpp"
29
30 using namespace icinga;
31
32 StatusTable::StatusTable(void)
33 {
34         AddColumns(this);
35 }
36
37 void StatusTable::AddColumns(Table *table, const String& prefix,
38         const Column::ObjectAccessor& objectAccessor)
39 {
40         table->AddColumn(prefix + "neb_callbacks", Column(&Table::ZeroAccessor, objectAccessor));
41         table->AddColumn(prefix + "neb_callbacks_rate", Column(&Table::ZeroAccessor, objectAccessor));
42
43         table->AddColumn(prefix + "requests", Column(&Table::ZeroAccessor, objectAccessor));
44         table->AddColumn(prefix + "requests_rate", Column(&Table::ZeroAccessor, objectAccessor));
45
46         table->AddColumn(prefix + "connections", Column(&StatusTable::ConnectionsAccessor, objectAccessor));
47         table->AddColumn(prefix + "connections_rate", Column(&StatusTable::ConnectionsRateAccessor, objectAccessor));
48
49         table->AddColumn(prefix + "service_checks", Column(&StatusTable::ServiceChecksAccessor, objectAccessor));
50         table->AddColumn(prefix + "service_checks_rate", Column(&StatusTable::ServiceChecksRateAccessor, objectAccessor));
51
52         table->AddColumn(prefix + "host_checks", Column(&StatusTable::HostChecksAccessor, objectAccessor));
53         table->AddColumn(prefix + "host_checks_rate", Column(&StatusTable::HostChecksRateAccessor, objectAccessor));
54
55         table->AddColumn(prefix + "forks", Column(&Table::ZeroAccessor, objectAccessor));
56         table->AddColumn(prefix + "forks_rate", Column(&Table::ZeroAccessor, objectAccessor));
57
58         table->AddColumn(prefix + "log_messages", Column(&Table::ZeroAccessor, objectAccessor));
59         table->AddColumn(prefix + "log_messages_rate", Column(&Table::ZeroAccessor, objectAccessor));
60
61         table->AddColumn(prefix + "external_commands", Column(&StatusTable::ExternalCommandsAccessor, objectAccessor));
62         table->AddColumn(prefix + "external_commands_rate", Column(&StatusTable::ExternalCommandsRateAccessor, objectAccessor));
63
64         table->AddColumn(prefix + "livechecks", Column(&Table::ZeroAccessor, objectAccessor));
65         table->AddColumn(prefix + "livechecks_rate", Column(&Table::ZeroAccessor, objectAccessor));
66
67         table->AddColumn(prefix + "livecheck_overflows", Column(&Table::ZeroAccessor, objectAccessor));
68         table->AddColumn(prefix + "livecheck_overflows_rate", Column(&Table::ZeroAccessor, objectAccessor));
69
70         table->AddColumn(prefix + "nagios_pid", Column(&StatusTable::NagiosPidAccessor, objectAccessor));
71         table->AddColumn(prefix + "enable_notifications", Column(&StatusTable::EnableNotificationsAccessor, objectAccessor));
72         table->AddColumn(prefix + "execute_service_checks", Column(&StatusTable::ExecuteServiceChecksAccessor, objectAccessor));
73         table->AddColumn(prefix + "accept_passive_service_checks", Column(&Table::OneAccessor, objectAccessor));
74         table->AddColumn(prefix + "execute_host_checks", Column(&StatusTable::ExecuteHostChecksAccessor, objectAccessor));
75         table->AddColumn(prefix + "accept_passive_host_checks", Column(&Table::OneAccessor, objectAccessor));
76         table->AddColumn(prefix + "enable_event_handlers", Column(&StatusTable::EnableEventHandlersAccessor, objectAccessor));
77         table->AddColumn(prefix + "obsess_over_services", Column(&Table::ZeroAccessor, objectAccessor));
78         table->AddColumn(prefix + "obsess_over_hosts", Column(&Table::ZeroAccessor, objectAccessor));
79         table->AddColumn(prefix + "check_service_freshness", Column(&Table::OneAccessor, objectAccessor));
80         table->AddColumn(prefix + "check_host_freshness", Column(&Table::OneAccessor, objectAccessor));
81         table->AddColumn(prefix + "enable_flap_detection", Column(&StatusTable::EnableFlapDetectionAccessor, objectAccessor));
82         table->AddColumn(prefix + "process_performance_data", Column(&StatusTable::ProcessPerformanceDataAccessor, objectAccessor));
83         table->AddColumn(prefix + "check_external_commands", Column(&Table::OneAccessor, objectAccessor));
84         table->AddColumn(prefix + "program_start", Column(&StatusTable::ProgramStartAccessor, objectAccessor));
85         table->AddColumn(prefix + "last_command_check", Column(&Table::ZeroAccessor, objectAccessor));
86         table->AddColumn(prefix + "last_log_rotation", Column(&Table::ZeroAccessor, objectAccessor));
87         table->AddColumn(prefix + "interval_length", Column(&Table::ZeroAccessor, objectAccessor));
88         table->AddColumn(prefix + "num_hosts", Column(&StatusTable::NumHostsAccessor, objectAccessor));
89         table->AddColumn(prefix + "num_services", Column(&StatusTable::NumServicesAccessor, objectAccessor));
90         table->AddColumn(prefix + "program_version", Column(&StatusTable::ProgramVersionAccessor, objectAccessor));
91         table->AddColumn(prefix + "external_command_buffer_slots", Column(&Table::ZeroAccessor, objectAccessor));
92         table->AddColumn(prefix + "external_command_buffer_usage", Column(&Table::ZeroAccessor, objectAccessor));
93         table->AddColumn(prefix + "external_command_buffer_max", Column(&Table::ZeroAccessor, objectAccessor));
94         table->AddColumn(prefix + "cached_log_messages", Column(&Table::ZeroAccessor, objectAccessor));
95         table->AddColumn(prefix + "livestatus_version", Column(&StatusTable::LivestatusVersionAccessor, objectAccessor));
96         table->AddColumn(prefix + "livestatus_active_connections", Column(&Table::ZeroAccessor, objectAccessor));
97         table->AddColumn(prefix + "livestatus_queued_connections", Column(&Table::ZeroAccessor, objectAccessor));
98         table->AddColumn(prefix + "livestatus_threads", Column(&Table::ZeroAccessor, objectAccessor));
99
100         table->AddColumn(prefix + "custom_variable_names", Column(&StatusTable::CustomVariableNamesAccessor, objectAccessor));
101         table->AddColumn(prefix + "custom_variable_values", Column(&StatusTable::CustomVariableValuesAccessor, objectAccessor));
102         table->AddColumn(prefix + "custom_variables", Column(&StatusTable::CustomVariablesAccessor, objectAccessor));
103 }
104
105 String StatusTable::GetName(void) const
106 {
107         return "status";
108 }
109
110 String StatusTable::GetPrefix(void) const
111 {
112         return "status";
113 }
114
115 void StatusTable::FetchRows(const AddRowFunction& addRowFn)
116 {
117         Object::Ptr obj = new Object();
118
119         /* Return a fake row. */
120         addRowFn(obj, LivestatusGroupByNone, Empty);
121 }
122
123 Value StatusTable::ConnectionsAccessor(const Value&)
124 {
125         return LivestatusListener::GetConnections();
126 }
127
128 Value StatusTable::ConnectionsRateAccessor(const Value&)
129 {
130         return (LivestatusListener::GetConnections() / (Utility::GetTime() - Application::GetStartTime()));
131 }
132
133 Value StatusTable::HostChecksAccessor(const Value&)
134 {
135         long timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
136         return CIB::GetActiveHostChecksStatistics(timespan);
137 }
138
139 Value StatusTable::HostChecksRateAccessor(const Value&)
140 {
141         long timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
142         return (CIB::GetActiveHostChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
143 }
144
145 Value StatusTable::ServiceChecksAccessor(const Value&)
146 {
147         long timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
148         return CIB::GetActiveServiceChecksStatistics(timespan);
149 }
150
151 Value StatusTable::ServiceChecksRateAccessor(const Value&)
152 {
153         long timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
154         return (CIB::GetActiveServiceChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
155 }
156
157 Value StatusTable::ExternalCommandsAccessor(const Value&)
158 {
159         return LivestatusQuery::GetExternalCommands();
160 }
161
162 Value StatusTable::ExternalCommandsRateAccessor(const Value&)
163 {
164         return (LivestatusQuery::GetExternalCommands() / (Utility::GetTime() - Application::GetStartTime()));
165 }
166
167 Value StatusTable::NagiosPidAccessor(const Value&)
168 {
169         return Utility::GetPid();
170 }
171
172 Value StatusTable::EnableNotificationsAccessor(const Value&)
173 {
174         return (IcingaApplication::GetInstance()->GetEnableNotifications() ? 1 : 0);
175 }
176
177 Value StatusTable::ExecuteServiceChecksAccessor(const Value&)
178 {
179         return (IcingaApplication::GetInstance()->GetEnableServiceChecks() ? 1 : 0);
180 }
181
182 Value StatusTable::ExecuteHostChecksAccessor(const Value&)
183 {
184         return (IcingaApplication::GetInstance()->GetEnableHostChecks() ? 1 : 0);
185 }
186
187 Value StatusTable::EnableEventHandlersAccessor(const Value&)
188 {
189         return (IcingaApplication::GetInstance()->GetEnableEventHandlers() ? 1 : 0);
190 }
191
192 Value StatusTable::EnableFlapDetectionAccessor(const Value&)
193 {
194         return (IcingaApplication::GetInstance()->GetEnableFlapping() ? 1 : 0);
195 }
196
197 Value StatusTable::ProcessPerformanceDataAccessor(const Value&)
198 {
199         return (IcingaApplication::GetInstance()->GetEnablePerfdata() ? 1 : 0);
200 }
201
202 Value StatusTable::ProgramStartAccessor(const Value&)
203 {
204         return static_cast<long>(Application::GetStartTime());
205 }
206
207 Value StatusTable::NumHostsAccessor(const Value&)
208 {
209         return ConfigType::Get<Host>()->GetObjectCount();
210 }
211
212 Value StatusTable::NumServicesAccessor(const Value&)
213 {
214         return ConfigType::Get<Service>()->GetObjectCount();
215 }
216
217 Value StatusTable::ProgramVersionAccessor(const Value&)
218 {
219         return Application::GetAppVersion();
220 }
221
222 Value StatusTable::LivestatusVersionAccessor(const Value&)
223 {
224         return Application::GetAppVersion();
225 }
226
227 Value StatusTable::LivestatusActiveConnectionsAccessor(const Value&)
228 {
229         return LivestatusListener::GetClientsConnected();
230 }
231
232 Value StatusTable::CustomVariableNamesAccessor(const Value&)
233 {
234         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
235
236         Array::Ptr cv = new Array();
237
238         if (!vars)
239                 return cv;
240
241         {
242                 ObjectLock olock(vars);
243                 for (const auto& kv : vars) {
244                         cv->Add(kv.first);
245                 }
246         }
247
248         return cv;
249 }
250
251 Value StatusTable::CustomVariableValuesAccessor(const Value&)
252 {
253         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
254
255         Array::Ptr cv = new Array();
256
257         if (!vars)
258                 return cv;
259
260         {
261                 ObjectLock olock(vars);
262                 for (const auto& kv : vars) {
263                         cv->Add(kv.second);
264                 }
265         }
266
267         return cv;
268 }
269
270 Value StatusTable::CustomVariablesAccessor(const Value&)
271 {
272         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
273
274         Array::Ptr cv = new Array();
275
276         if (!vars)
277                 return cv;
278
279         {
280                 ObjectLock olock(vars);
281                 for (const auto& kv : vars) {
282                         Array::Ptr key_val = new Array();
283                         key_val->Add(kv.first);
284                         key_val->Add(kv.second);
285                         cv->Add(key_val);
286                 }
287         }
288
289         return cv;
290 }