1 /******************************************************************************
3 * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
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. *
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. *
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 ******************************************************************************/
20 #include "i2-icinga.h"
22 using namespace icinga;
24 bool I2_EXPORT ExternalCommandProcessor::m_Initialized;
25 map<String, ExternalCommandProcessor::Callback> I2_EXPORT ExternalCommandProcessor::m_Commands;
27 void ExternalCommandProcessor::Execute(const String& line)
33 BOOST_THROW_EXCEPTION(invalid_argument("Missing timestamp in command: " + line));
35 size_t pos = line.FindFirstOf("]");
37 if (pos == String::NPos)
38 BOOST_THROW_EXCEPTION(invalid_argument("Missing timestamp in command: " + line));
40 String timestamp = line.SubStr(1, pos - 1);
41 String args = line.SubStr(pos + 2, String::NPos);
43 double ts = Convert::ToDouble(timestamp);
46 BOOST_THROW_EXCEPTION(invalid_argument("Invalid timestamp in command: " + line));
48 vector<String> argv = args.Split(is_any_of(";"));
51 BOOST_THROW_EXCEPTION(invalid_argument("Missing arguments in command: " + line));
53 vector<String> argvExtra(argv.begin() + 1, argv.end());
54 Execute(ts, argv[0], argvExtra);
57 void ExternalCommandProcessor::Execute(double time, const String& command, const vector<String>& arguments)
60 RegisterCommand("PROCESS_SERVICE_CHECK_RESULT", &ExternalCommandProcessor::ProcessServiceCheckResult);
61 RegisterCommand("SCHEDULE_SVC_CHECK", &ExternalCommandProcessor::ScheduleSvcCheck);
62 RegisterCommand("SCHEDULE_FORCED_SVC_CHECK", &ExternalCommandProcessor::ScheduleForcedSvcCheck);
63 RegisterCommand("ENABLE_SVC_CHECK", &ExternalCommandProcessor::EnableSvcCheck);
64 RegisterCommand("DISABLE_SVC_CHECK", &ExternalCommandProcessor::DisableSvcCheck);
65 RegisterCommand("SHUTDOWN_PROCESS", &ExternalCommandProcessor::ShutdownProcess);
66 RegisterCommand("SCHEDULE_FORCED_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleForcedHostSvcChecks);
67 RegisterCommand("SCHEDULE_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleHostSvcChecks);
68 RegisterCommand("ENABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::EnableHostSvcChecks);
69 RegisterCommand("DISABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::DisableHostSvcChecks);
70 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM", &ExternalCommandProcessor::AcknowledgeSvcProblem);
71 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeSvcProblemExpire);
72 RegisterCommand("REMOVE_SVC_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
73 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM", &ExternalCommandProcessor::AcknowledgeHostProblem);
74 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeHostProblemExpire);
75 RegisterCommand("REMOVE_HOST_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
76 RegisterCommand("ENABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupSvcChecks);
77 RegisterCommand("DISABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupSvcChecks);
78 RegisterCommand("ENABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupSvcChecks);
79 RegisterCommand("DISABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupSvcChecks);
80 RegisterCommand("ENABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnablePassiveSvcChecks);
81 RegisterCommand("DISABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisablePassiveSvcChecks);
82 RegisterCommand("ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks);
83 RegisterCommand("DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks);
84 RegisterCommand("ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks);
85 RegisterCommand("DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks);
86 RegisterCommand("PROCESS_FILE", &ExternalCommandProcessor::ProcessFile);
87 RegisterCommand("SCHEDULE_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleSvcDowntime);
88 RegisterCommand("DEL_SVC_DOWNTIME", &ExternalCommandProcessor::DelSvcDowntime);
89 RegisterCommand("SCHEDULE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostDowntime);
90 RegisterCommand("DEL_HOST_DOWNTIME", &ExternalCommandProcessor::DelHostDowntime);
91 RegisterCommand("SCHEDULE_HOST_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostSvcDowntime);
92 RegisterCommand("SCHEDULE_HOSTGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupHostDowntime);
93 RegisterCommand("SCHEDULE_HOSTGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupSvcDowntime);
94 RegisterCommand("SCHEDULE_SERVICEGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupHostDowntime);
95 RegisterCommand("SCHEDULE_SERVICEGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupSvcDowntime);
96 RegisterCommand("ADD_HOST_COMMENT", &ExternalCommandProcessor::AddHostComment);
97 RegisterCommand("DEL_HOST_COMMENT", &ExternalCommandProcessor::DelHostComment);
98 RegisterCommand("ADD_SVC_COMMENT", &ExternalCommandProcessor::AddSvcComment);
99 RegisterCommand("DEL_SVC_COMMENT", &ExternalCommandProcessor::DelSvcComment);
100 RegisterCommand("DEL_ALL_HOST_COMMENTS", &ExternalCommandProcessor::DelAllHostComments);
101 RegisterCommand("DEL_ALL_SVC_COMMENTS", &ExternalCommandProcessor::DelAllSvcComments);
103 m_Initialized = true;
106 map<String, ExternalCommandProcessor::Callback>::iterator it;
107 it = m_Commands.find(command);
109 if (it == m_Commands.end())
110 BOOST_THROW_EXCEPTION(invalid_argument("The external command '" + command + "' does not exist."));
112 it->second(time, arguments);
115 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
117 m_Commands[command] = callback;
120 void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const vector<String>& arguments)
122 if (arguments.size() < 4)
123 BOOST_THROW_EXCEPTION(invalid_argument("Expected 4 arguments."));
125 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
127 if (!service->GetEnablePassiveChecks())
128 BOOST_THROW_EXCEPTION(invalid_argument("Got passive check result for service '" + arguments[1] + "' which has passive checks disabled."));
130 int exitStatus = Convert::ToDouble(arguments[2]);
131 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[3]);
132 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
134 result->Set("schedule_start", time);
135 result->Set("schedule_end", time);
136 result->Set("execution_start", time);
137 result->Set("execution_end", time);
138 result->Set("active", 0);
140 Logger::Write(LogInformation, "icinga", "Processing passive check result for service '" + arguments[1] + "'");
141 service->ProcessCheckResult(result);
143 /* Reschedule the next check. The side effect of this is that for as long
144 * as we receive passive results for a service we won't execute any
146 service->SetNextCheck(Utility::GetTime() + service->GetCheckInterval());
149 void ExternalCommandProcessor::ScheduleSvcCheck(double, const vector<String>& arguments)
151 if (arguments.size() < 3)
152 BOOST_THROW_EXCEPTION(invalid_argument("Expected 3 arguments."));
154 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
156 double planned_check = Convert::ToDouble(arguments[2]);
158 if (planned_check > service->GetNextCheck()) {
159 Logger::Write(LogInformation, "icinga", "Ignoring reschedule request for service '" +
160 arguments[1] + "' (next check is already sooner than requested check time)");
164 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
165 service->SetNextCheck(planned_check);
168 void ExternalCommandProcessor::ScheduleForcedSvcCheck(double, const vector<String>& arguments)
170 if (arguments.size() < 3)
171 BOOST_THROW_EXCEPTION(invalid_argument("Expected 3 arguments."));
173 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
175 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
176 service->SetForceNextCheck(true);
177 service->SetNextCheck(Convert::ToDouble(arguments[2]));
180 void ExternalCommandProcessor::EnableSvcCheck(double, const vector<String>& arguments)
182 if (arguments.size() < 2)
183 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
185 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
187 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + arguments[1] + "'");
188 service->SetEnableActiveChecks(true);
191 void ExternalCommandProcessor::DisableSvcCheck(double, const vector<String>& arguments)
193 if (arguments.size() < 2)
194 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
196 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
198 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + arguments[1] + "'");
199 service->SetEnableActiveChecks(false);
202 void ExternalCommandProcessor::ShutdownProcess(double, const vector<String>&)
204 Logger::Write(LogInformation, "icinga", "Shutting down Icinga via external command.");
205 Application::RequestShutdown();
208 void ExternalCommandProcessor::ScheduleForcedHostSvcChecks(double, const vector<String>& arguments)
210 if (arguments.size() < 2)
211 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
213 if (!Host::Exists(arguments[0]))
214 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
216 double planned_check = Convert::ToDouble(arguments[1]);
218 Host::Ptr host = Host::GetByName(arguments[0]);
220 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
221 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
222 service->SetNextCheck(planned_check);
223 service->SetForceNextCheck(true);
227 void ExternalCommandProcessor::ScheduleHostSvcChecks(double, const vector<String>& arguments)
229 if (arguments.size() < 2)
230 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
232 if (!Host::Exists(arguments[0]))
233 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
235 double planned_check = Convert::ToDouble(arguments[1]);
237 Host::Ptr host = Host::GetByName(arguments[0]);
239 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
240 if (planned_check > service->GetNextCheck()) {
241 Logger::Write(LogInformation, "icinga", "Ignoring reschedule request for service '" +
242 service->GetName() + "' (next check is already sooner than requested check time)");
246 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
247 service->SetNextCheck(planned_check);
251 void ExternalCommandProcessor::EnableHostSvcChecks(double, const vector<String>& arguments)
253 if (arguments.size() < 1)
254 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
256 if (!Host::Exists(arguments[0]))
257 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
259 Host::Ptr host = Host::GetByName(arguments[0]);
261 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
262 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
263 service->SetEnableActiveChecks(true);
267 void ExternalCommandProcessor::DisableHostSvcChecks(double, const vector<String>& arguments)
269 if (arguments.size() < 1)
270 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 arguments."));
272 if (!Host::Exists(arguments[0]))
273 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
275 Host::Ptr host = Host::GetByName(arguments[0]);
277 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
278 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
279 service->SetEnableActiveChecks(false);
283 void ExternalCommandProcessor::AcknowledgeSvcProblem(double, const vector<String>& arguments)
285 if (arguments.size() < 7)
286 BOOST_THROW_EXCEPTION(invalid_argument("Expected 7 arguments."));
288 if (!Service::Exists(arguments[1]))
289 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' does not exist."));
291 bool sticky = Convert::ToBool(arguments[2]);
293 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
295 if (service->GetState() == StateOK)
296 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' is OK."));
298 Logger::Write(LogInformation, "icinga", "Setting acknowledgement for service '" + service->GetName() + "'");
299 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
300 service->SetAcknowledgementExpiry(0);
303 void ExternalCommandProcessor::AcknowledgeSvcProblemExpire(double, const vector<String>& arguments)
305 if (arguments.size() < 8)
306 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
308 if (!Service::Exists(arguments[1]))
309 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' does not exist."));
311 bool sticky = Convert::ToBool(arguments[2]);
312 double timestamp = Convert::ToDouble(arguments[5]);
314 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
316 if (service->GetState() == StateOK)
317 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' is OK."));
319 Logger::Write(LogInformation, "icinga", "Setting timed acknowledgement for service '" + service->GetName() + "'");
320 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
321 service->SetAcknowledgementExpiry(timestamp);
324 void ExternalCommandProcessor::RemoveSvcAcknowledgement(double, const vector<String>& arguments)
326 if (arguments.size() < 2)
327 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
329 if (!Service::Exists(arguments[1]))
330 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' does not exist."));
332 Service::Ptr service = Service::GetByName(arguments[1]);
334 Logger::Write(LogInformation, "icinga", "Removing acknowledgement for service '" + service->GetName() + "'");
335 service->SetAcknowledgement(AcknowledgementNone);
336 service->SetAcknowledgementExpiry(0);
339 void ExternalCommandProcessor::AcknowledgeHostProblem(double, const vector<String>& arguments)
341 if (arguments.size() < 6)
342 BOOST_THROW_EXCEPTION(invalid_argument("Expected 6 arguments."));
344 if (!Host::Exists(arguments[0]))
345 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
347 bool sticky = Convert::ToBool(arguments[0]);
349 Host::Ptr host = Host::GetByName(arguments[0]);
352 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' is OK."));
354 Logger::Write(LogInformation, "icinga", "Setting acknowledgement for host '" + host->GetName() + "'");
355 host->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
356 host->SetAcknowledgementExpiry(0);
359 void ExternalCommandProcessor::AcknowledgeHostProblemExpire(double, const vector<String>& arguments)
361 if (arguments.size() < 7)
362 BOOST_THROW_EXCEPTION(invalid_argument("Expected 7 arguments."));
364 if (!Host::Exists(arguments[0]))
365 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
367 bool sticky = Convert::ToBool(arguments[1]);
368 double timestamp = Convert::ToDouble(arguments[4]);
370 Host::Ptr host = Host::GetByName(arguments[0]);
373 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' is OK."));
375 Logger::Write(LogInformation, "icinga", "Setting timed acknowledgement for host '" + host->GetName() + "'");
376 host->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
377 host->SetAcknowledgementExpiry(timestamp);
380 void ExternalCommandProcessor::RemoveHostAcknowledgement(double, const vector<String>& arguments)
382 if (arguments.size() < 1)
383 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
385 if (!Host::Exists(arguments[0]))
386 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
388 Host::Ptr host = Host::GetByName(arguments[0]);
390 Logger::Write(LogInformation, "icinga", "Removing acknowledgement for host '" + host->GetName() + "'");
391 host->SetAcknowledgement(AcknowledgementNone);
392 host->SetAcknowledgementExpiry(0);
395 void ExternalCommandProcessor::EnableHostgroupSvcChecks(double, const vector<String>& arguments)
397 if (arguments.size() < 1)
398 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
400 if (!HostGroup::Exists(arguments[0]))
401 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
403 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
405 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
406 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
407 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
408 service->SetEnableActiveChecks(true);
413 void ExternalCommandProcessor::DisableHostgroupSvcChecks(double, const vector<String>& arguments)
415 if (arguments.size() < 1)
416 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
418 if (!HostGroup::Exists(arguments[0]))
419 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
421 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
423 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
424 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
425 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
426 service->SetEnableActiveChecks(false);
431 void ExternalCommandProcessor::EnableServicegroupSvcChecks(double, const vector<String>& arguments)
433 if (arguments.size() < 1)
434 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
436 if (!ServiceGroup::Exists(arguments[0]))
437 BOOST_THROW_EXCEPTION(invalid_argument("The service group '" + arguments[0] + "' does not exist."));
439 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
441 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
442 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
443 service->SetEnableActiveChecks(true);
447 void ExternalCommandProcessor::DisableServicegroupSvcChecks(double, const vector<String>& arguments)
449 if (arguments.size() < 1)
450 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
452 if (!ServiceGroup::Exists(arguments[0]))
453 BOOST_THROW_EXCEPTION(invalid_argument("The service group '" + arguments[0] + "' does not exist."));
455 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
457 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
458 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
459 service->SetEnableActiveChecks(false);
463 void ExternalCommandProcessor::EnablePassiveSvcChecks(double, const vector<String>& arguments)
465 if (arguments.size() < 2)
466 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
468 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
470 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + arguments[1] + "'");
471 service->SetEnablePassiveChecks(true);
474 void ExternalCommandProcessor::DisablePassiveSvcChecks(double, const vector<String>& arguments)
476 if (arguments.size() < 2)
477 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
479 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
481 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + arguments[1] + "'");
482 service->SetEnablePassiveChecks(false);
485 void ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks(double, const vector<String>& arguments)
487 if (arguments.size() < 1)
488 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
490 if (!ServiceGroup::Exists(arguments[0]))
491 BOOST_THROW_EXCEPTION(invalid_argument("The service group '" + arguments[0] + "' does not exist."));
493 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
495 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
496 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
497 service->SetEnablePassiveChecks(true);
501 void ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks(double, const vector<String>& arguments)
503 if (arguments.size() < 1)
504 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
506 if (!ServiceGroup::Exists(arguments[0]))
507 BOOST_THROW_EXCEPTION(invalid_argument("The service group '" + arguments[0] + "' does not exist."));
509 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
511 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
512 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
513 service->SetEnablePassiveChecks(true);
517 void ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks(double, const vector<String>& arguments)
519 if (arguments.size() < 1)
520 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
522 if (!HostGroup::Exists(arguments[0]))
523 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
525 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
527 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
528 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
529 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
530 service->SetEnablePassiveChecks(true);
535 void ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks(double, const vector<String>& arguments)
537 if (arguments.size() < 1)
538 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
540 if (!HostGroup::Exists(arguments[0]))
541 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
543 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
545 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
546 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
547 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
548 service->SetEnablePassiveChecks(false);
553 void ExternalCommandProcessor::ProcessFile(double, const vector<String>& arguments)
555 if (arguments.size() < 2)
556 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
558 String file = arguments[0];
559 bool del = Convert::ToBool(arguments[1]);
562 ifp.exceptions(ifstream::badbit);
564 ifp.open(file.CStr(), ifstream::in);
568 std::getline(ifp, line);
571 Logger::Write(LogInformation, "compat", "Executing external command: " + line);
574 } catch (const exception& ex) {
576 msgbuf << "External command failed: " << diagnostic_information(ex);
577 Logger::Write(LogWarning, "icinga", msgbuf.str());
584 (void) unlink(file.CStr());
587 void ExternalCommandProcessor::ScheduleSvcDowntime(double, const vector<String>& arguments)
589 if (arguments.size() < 9)
590 BOOST_THROW_EXCEPTION(invalid_argument("Expected 9 arguments."));
592 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
595 int triggeredByLegacy = Convert::ToLong(arguments[5]);
596 if (triggeredByLegacy != 0)
597 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
599 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
600 (void) DowntimeProcessor::AddDowntime(service, arguments[7], arguments[8],
601 Convert::ToDouble(arguments[2]), Convert::ToDouble(arguments[3]),
602 Convert::ToBool(arguments[4]), triggeredBy, Convert::ToDouble(arguments[6]));
605 void ExternalCommandProcessor::DelSvcDowntime(double, const vector<String>& arguments)
607 if (arguments.size() < 1)
608 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
610 int id = Convert::ToLong(arguments[0]);
611 Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
612 String rid = DowntimeProcessor::GetIDFromLegacyID(id);
613 DowntimeProcessor::RemoveDowntime(rid);
616 void ExternalCommandProcessor::ScheduleHostDowntime(double, const vector<String>& arguments)
618 if (arguments.size() < 8)
619 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
621 if (!Host::Exists(arguments[0]))
622 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
624 Host::Ptr host = Host::GetByName(arguments[0]);
627 int triggeredByLegacy = Convert::ToLong(arguments[4]);
628 if (triggeredByLegacy != 0)
629 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
631 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
632 (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7],
633 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
634 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
637 void ExternalCommandProcessor::DelHostDowntime(double, const vector<String>& arguments)
639 if (arguments.size() < 1)
640 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
642 int id = Convert::ToLong(arguments[0]);
643 Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
644 String rid = DowntimeProcessor::GetIDFromLegacyID(id);
645 DowntimeProcessor::RemoveDowntime(rid);
648 void ExternalCommandProcessor::ScheduleHostSvcDowntime(double, const vector<String>& arguments)
650 if (arguments.size() < 8)
651 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 argument."));
653 if (!Host::Exists(arguments[0]))
654 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
656 Host::Ptr host = Host::GetByName(arguments[0]);
659 int triggeredByLegacy = Convert::ToLong(arguments[4]);
660 if (triggeredByLegacy != 0)
661 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
663 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
664 (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7],
665 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
666 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
668 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
669 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
670 (void) DowntimeProcessor::AddDowntime(service, arguments[6], arguments[7],
671 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
672 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
676 void ExternalCommandProcessor::ScheduleHostgroupHostDowntime(double, const vector<String>& arguments)
678 if (arguments.size() < 8)
679 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
681 if (!HostGroup::Exists(arguments[0]))
682 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
684 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
687 int triggeredByLegacy = Convert::ToLong(arguments[4]);
688 if (triggeredByLegacy != 0)
689 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
691 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
692 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
693 (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7],
694 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
695 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
699 void ExternalCommandProcessor::ScheduleHostgroupSvcDowntime(double, const vector<String>& arguments)
701 if (arguments.size() < 8)
702 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
704 if (!HostGroup::Exists(arguments[0]))
705 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
707 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
710 int triggeredByLegacy = Convert::ToLong(arguments[4]);
711 if (triggeredByLegacy != 0)
712 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
714 /* Note: we can't just directly create downtimes for all the services by iterating
715 * over all hosts in the host group - otherwise we might end up creating multiple
716 * downtimes for some services. */
718 set<Service::Ptr> services;
720 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
721 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
722 services.insert(service);
726 BOOST_FOREACH(const Service::Ptr& service, services) {
727 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
728 (void) DowntimeProcessor::AddDowntime(service, arguments[6], arguments[7],
729 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
730 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
734 void ExternalCommandProcessor::ScheduleServicegroupHostDowntime(double, const vector<String>& arguments)
736 if (arguments.size() < 8)
737 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
739 if (!ServiceGroup::Exists(arguments[0]))
740 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
742 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
745 int triggeredByLegacy = Convert::ToLong(arguments[4]);
746 if (triggeredByLegacy != 0)
747 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
749 /* Note: we can't just directly create downtimes for all the hosts by iterating
750 * over all services in the service group - otherwise we might end up creating multiple
751 * downtimes for some hosts. */
753 set<Host::Ptr> hosts;
755 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
756 hosts.insert(service->GetHost());
759 BOOST_FOREACH(const Host::Ptr& host, hosts) {
760 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
761 (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7],
762 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
763 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
767 void ExternalCommandProcessor::ScheduleServicegroupSvcDowntime(double, const vector<String>& arguments)
769 if (arguments.size() < 8)
770 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
772 if (!ServiceGroup::Exists(arguments[0]))
773 BOOST_THROW_EXCEPTION(invalid_argument("The host group '" + arguments[0] + "' does not exist."));
775 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
778 int triggeredByLegacy = Convert::ToLong(arguments[4]);
779 if (triggeredByLegacy != 0)
780 triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy);
782 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
783 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
784 (void) DowntimeProcessor::AddDowntime(service, arguments[6], arguments[7],
785 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
786 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
790 void ExternalCommandProcessor::AddHostComment(double, const vector<String>& arguments)
792 if (arguments.size() < 4)
793 BOOST_THROW_EXCEPTION(invalid_argument("Expected 4 arguments."));
795 if (!Host::Exists(arguments[0]))
796 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
798 Host::Ptr host = Host::GetByName(arguments[0]);
800 Logger::Write(LogInformation, "icinga", "Creating comment for host " + host->GetName());
801 (void) CommentProcessor::AddComment(host, Comment_User, arguments[2], arguments[3], 0);
804 void ExternalCommandProcessor::DelHostComment(double, const vector<String>& arguments)
806 if (arguments.size() < 1)
807 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
809 int id = Convert::ToLong(arguments[0]);
810 Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
811 String rid = CommentProcessor::GetIDFromLegacyID(id);
812 CommentProcessor::RemoveComment(rid);
815 void ExternalCommandProcessor::AddSvcComment(double, const vector<String>& arguments)
817 if (arguments.size() < 5)
818 BOOST_THROW_EXCEPTION(invalid_argument("Expected 5 arguments."));
820 if (!Service::Exists(arguments[1]))
821 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' does not exist."));
823 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
825 Logger::Write(LogInformation, "icinga", "Creating comment for service " + service->GetName());
826 (void) CommentProcessor::AddComment(service, Comment_User, arguments[3], arguments[4], 0);
829 void ExternalCommandProcessor::DelSvcComment(double, const vector<String>& arguments)
831 if (arguments.size() < 1)
832 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
834 int id = Convert::ToLong(arguments[0]);
835 Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
837 String rid = CommentProcessor::GetIDFromLegacyID(id);
838 CommentProcessor::RemoveComment(rid);
841 void ExternalCommandProcessor::DelAllHostComments(double, const vector<String>& arguments)
843 if (arguments.size() < 1)
844 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
846 if (!Host::Exists(arguments[0]))
847 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' does not exist."));
849 Host::Ptr host = Host::GetByName(arguments[0]);
851 Logger::Write(LogInformation, "icinga", "Removing all comments for host " + host->GetName());
852 CommentProcessor::RemoveAllComments(host);
855 void ExternalCommandProcessor::DelAllSvcComments(double, const vector<String>& arguments)
857 if (arguments.size() < 2)
858 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
860 if (!Service::Exists(arguments[1]))
861 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' does not exist."));
863 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
865 Logger::Write(LogInformation, "icinga", "Removing all comments for service " + service->GetName());
866 CommentProcessor::RemoveAllComments(service);