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 "icinga/externalcommandprocessor.h"
21 #include "icinga/host.h"
22 #include "icinga/service.h"
23 #include "icinga/user.h"
24 #include "icinga/hostgroup.h"
25 #include "icinga/servicegroup.h"
26 #include "icinga/pluginchecktask.h"
27 #include "base/convert.h"
28 #include "base/logger_fwd.h"
29 #include "base/objectlock.h"
30 #include "base/application.h"
31 #include "base/utility.h"
33 #include <boost/algorithm/string/classification.hpp>
34 #include <boost/foreach.hpp>
35 #include <boost/exception/diagnostic_information.hpp>
36 #include <boost/algorithm/string/split.hpp>
38 using namespace icinga;
40 boost::once_flag ExternalCommandProcessor::m_InitializeOnce = BOOST_ONCE_INIT;
41 boost::mutex ExternalCommandProcessor::m_Mutex;
42 std::map<String, ExternalCommandProcessor::Callback> ExternalCommandProcessor::m_Commands;
44 void ExternalCommandProcessor::Execute(const String& line)
50 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing timestamp in command: " + line));
52 size_t pos = line.FindFirstOf("]");
54 if (pos == String::NPos)
55 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing timestamp in command: " + line));
57 String timestamp = line.SubStr(1, pos - 1);
58 String args = line.SubStr(pos + 2, String::NPos);
60 double ts = Convert::ToDouble(timestamp);
63 BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid timestamp in command: " + line));
65 std::vector<String> argv;
66 boost::algorithm::split(argv, args, boost::is_any_of(";"));
69 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing arguments in command: " + line));
71 std::vector<String> argvExtra(argv.begin() + 1, argv.end());
72 Execute(ts, argv[0], argvExtra);
75 void ExternalCommandProcessor::Execute(double time, const String& command, const std::vector<String>& arguments)
77 boost::call_once(m_InitializeOnce, &ExternalCommandProcessor::Initialize);
82 boost::mutex::scoped_lock lock(m_Mutex);
84 std::map<String, ExternalCommandProcessor::Callback>::iterator it;
85 it = m_Commands.find(command);
87 if (it == m_Commands.end())
88 BOOST_THROW_EXCEPTION(std::invalid_argument("The external command '" + command + "' does not exist."));
90 callback = it->second;
93 callback(time, arguments);
96 void ExternalCommandProcessor::Initialize(void)
98 RegisterCommand("PROCESS_HOST_CHECK_RESULT", &ExternalCommandProcessor::ProcessHostCheckResult);
99 RegisterCommand("PROCESS_SERVICE_CHECK_RESULT", &ExternalCommandProcessor::ProcessServiceCheckResult);
100 RegisterCommand("SCHEDULE_HOST_CHECK", &ExternalCommandProcessor::ScheduleHostCheck);
101 RegisterCommand("SCHEDULE_FORCED_HOST_CHECK", &ExternalCommandProcessor::ScheduleForcedHostCheck);
102 RegisterCommand("SCHEDULE_SVC_CHECK", &ExternalCommandProcessor::ScheduleSvcCheck);
103 RegisterCommand("SCHEDULE_FORCED_SVC_CHECK", &ExternalCommandProcessor::ScheduleForcedSvcCheck);
104 RegisterCommand("ENABLE_HOST_CHECK", &ExternalCommandProcessor::EnableHostCheck);
105 RegisterCommand("DISABLE_HOST_CHECK", &ExternalCommandProcessor::DisableHostCheck);
106 RegisterCommand("ENABLE_SVC_CHECK", &ExternalCommandProcessor::EnableSvcCheck);
107 RegisterCommand("DISABLE_SVC_CHECK", &ExternalCommandProcessor::DisableSvcCheck);
108 RegisterCommand("SHUTDOWN_PROCESS", &ExternalCommandProcessor::ShutdownProcess);
109 RegisterCommand("SCHEDULE_FORCED_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleForcedHostSvcChecks);
110 RegisterCommand("SCHEDULE_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleHostSvcChecks);
111 RegisterCommand("ENABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::EnableHostSvcChecks);
112 RegisterCommand("DISABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::DisableHostSvcChecks);
113 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM", &ExternalCommandProcessor::AcknowledgeSvcProblem);
114 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeSvcProblemExpire);
115 RegisterCommand("REMOVE_SVC_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveSvcAcknowledgement);
116 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM", &ExternalCommandProcessor::AcknowledgeHostProblem);
117 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeHostProblemExpire);
118 RegisterCommand("REMOVE_HOST_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
119 RegisterCommand("ENABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupSvcChecks);
120 RegisterCommand("DISABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupSvcChecks);
121 RegisterCommand("ENABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupSvcChecks);
122 RegisterCommand("DISABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupSvcChecks);
123 RegisterCommand("ENABLE_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::EnablePassiveHostChecks);
124 RegisterCommand("DISABLE_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::DisablePassiveHostChecks);
125 RegisterCommand("ENABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnablePassiveSvcChecks);
126 RegisterCommand("DISABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisablePassiveSvcChecks);
127 RegisterCommand("ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks);
128 RegisterCommand("DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks);
129 RegisterCommand("ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks);
130 RegisterCommand("DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks);
131 RegisterCommand("PROCESS_FILE", &ExternalCommandProcessor::ProcessFile);
132 RegisterCommand("SCHEDULE_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleSvcDowntime);
133 RegisterCommand("DEL_SVC_DOWNTIME", &ExternalCommandProcessor::DelSvcDowntime);
134 RegisterCommand("SCHEDULE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostDowntime);
135 RegisterCommand("DEL_HOST_DOWNTIME", &ExternalCommandProcessor::DelHostDowntime);
136 RegisterCommand("SCHEDULE_HOST_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostSvcDowntime);
137 RegisterCommand("SCHEDULE_HOSTGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupHostDowntime);
138 RegisterCommand("SCHEDULE_HOSTGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupSvcDowntime);
139 RegisterCommand("SCHEDULE_SERVICEGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupHostDowntime);
140 RegisterCommand("SCHEDULE_SERVICEGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupSvcDowntime);
141 RegisterCommand("ADD_HOST_COMMENT", &ExternalCommandProcessor::AddHostComment);
142 RegisterCommand("DEL_HOST_COMMENT", &ExternalCommandProcessor::DelHostComment);
143 RegisterCommand("ADD_SVC_COMMENT", &ExternalCommandProcessor::AddSvcComment);
144 RegisterCommand("DEL_SVC_COMMENT", &ExternalCommandProcessor::DelSvcComment);
145 RegisterCommand("DEL_ALL_HOST_COMMENTS", &ExternalCommandProcessor::DelAllHostComments);
146 RegisterCommand("DEL_ALL_SVC_COMMENTS", &ExternalCommandProcessor::DelAllSvcComments);
147 RegisterCommand("SEND_CUSTOM_HOST_NOTIFICATION", &ExternalCommandProcessor::SendCustomHostNotification);
148 RegisterCommand("SEND_CUSTOM_SVC_NOTIFICATION", &ExternalCommandProcessor::SendCustomSvcNotification);
149 RegisterCommand("DELAY_HOST_NOTIFICATION", &ExternalCommandProcessor::DelayHostNotification);
150 RegisterCommand("DELAY_SVC_NOTIFICATION", &ExternalCommandProcessor::DelaySvcNotification);
151 RegisterCommand("ENABLE_HOST_NOTIFICATIONS", &ExternalCommandProcessor::EnableHostNotifications);
152 RegisterCommand("DISABLE_HOST_NOTIFICATIONS", &ExternalCommandProcessor::DisableHostNotifications);
153 RegisterCommand("ENABLE_SVC_NOTIFICATIONS", &ExternalCommandProcessor::EnableSvcNotifications);
154 RegisterCommand("DISABLE_SVC_NOTIFICATIONS", &ExternalCommandProcessor::DisableSvcNotifications);
155 RegisterCommand("DISABLE_HOSTGROUP_HOST_CHECKS", &ExternalCommandProcessor::DisableHostgroupHostChecks);
156 RegisterCommand("DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::DisableHostgroupPassiveHostChecks);
157 RegisterCommand("DISABLE_SERVICEGROUP_HOST_CHECKS", &ExternalCommandProcessor::DisableServicegroupHostChecks);
158 RegisterCommand("DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::DisableServicegroupPassiveHostChecks);
159 RegisterCommand("ENABLE_HOSTGROUP_HOST_CHECKS", &ExternalCommandProcessor::EnableHostgroupHostChecks);
160 RegisterCommand("ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::EnableHostgroupPassiveHostChecks);
161 RegisterCommand("ENABLE_SERVICEGROUP_HOST_CHECKS", &ExternalCommandProcessor::EnableServicegroupHostChecks);
162 RegisterCommand("ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::EnableServicegroupPassiveHostChecks);
165 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
167 boost::mutex::scoped_lock lock(m_Mutex);
168 m_Commands[command] = callback;
171 void ExternalCommandProcessor::ProcessHostCheckResult(double time, const std::vector<String>& arguments)
173 if (arguments.size() < 3)
174 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
176 Host::Ptr host = Host::GetByName(arguments[0]);
178 Service::Ptr hc = host->GetHostCheckService();
180 if (!hc->GetEnablePassiveChecks())
181 BOOST_THROW_EXCEPTION(std::invalid_argument("Got passive check result for host '" + arguments[0] + "' which has passive checks disabled."));
183 int exitStatus = Convert::ToDouble(arguments[1]);
184 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[2]);
185 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
187 result->Set("schedule_start", time);
188 result->Set("schedule_end", time);
189 result->Set("execution_start", time);
190 result->Set("execution_end", time);
191 result->Set("active", 0);
193 Log(LogInformation, "icinga", "Processing passive check result for host '" + arguments[0] + "'");
194 hc->ProcessCheckResult(result);
197 ObjectLock olock(hc);
199 /* Reschedule the next check. The side effect of this is that for as long
200 * as we receive passive results for a service we won't execute any
202 hc->SetNextCheck(Utility::GetTime() + hc->GetCheckInterval());
206 void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std::vector<String>& arguments)
208 if (arguments.size() < 4)
209 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
211 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
213 if (!service->GetEnablePassiveChecks())
214 BOOST_THROW_EXCEPTION(std::invalid_argument("Got passive check result for service '" + arguments[1] + "' which has passive checks disabled."));
216 int exitStatus = Convert::ToDouble(arguments[2]);
217 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[3]);
218 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
220 result->Set("schedule_start", time);
221 result->Set("schedule_end", time);
222 result->Set("execution_start", time);
223 result->Set("execution_end", time);
224 result->Set("active", 0);
226 Log(LogInformation, "icinga", "Processing passive check result for service '" + arguments[1] + "'");
227 service->ProcessCheckResult(result);
230 ObjectLock olock(service);
232 /* Reschedule the next check. The side effect of this is that for as long
233 * as we receive passive results for a service we won't execute any
235 service->SetNextCheck(Utility::GetTime() + service->GetCheckInterval());
239 void ExternalCommandProcessor::ScheduleHostCheck(double, const std::vector<String>& arguments)
241 if (arguments.size() < 2)
242 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
244 Host::Ptr host = Host::GetByName(arguments[0]);
246 Service::Ptr hc = host->GetHostCheckService();
248 double planned_check = Convert::ToDouble(arguments[1]);
250 if (planned_check > hc->GetNextCheck()) {
251 Log(LogInformation, "icinga", "Ignoring reschedule request for host '" +
252 arguments[0] + "' (next check is already sooner than requested check time)");
256 Log(LogInformation, "icinga", "Rescheduling next check for host '" + arguments[0] + "'");
259 ObjectLock olock(hc);
261 hc->SetNextCheck(planned_check);
265 void ExternalCommandProcessor::ScheduleForcedHostCheck(double, const std::vector<String>& arguments)
267 if (arguments.size() < 2)
268 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
270 Host::Ptr host = Host::GetByName(arguments[0]);
272 Service::Ptr hc = host->GetHostCheckService();
274 Log(LogInformation, "icinga", "Rescheduling next check for host '" + arguments[0] + "'");
277 ObjectLock olock(hc);
279 hc->SetForceNextCheck(true);
280 hc->SetNextCheck(Convert::ToDouble(arguments[1]));
284 void ExternalCommandProcessor::ScheduleSvcCheck(double, const std::vector<String>& arguments)
286 if (arguments.size() < 3)
287 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
289 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
291 double planned_check = Convert::ToDouble(arguments[2]);
293 if (planned_check > service->GetNextCheck()) {
294 Log(LogInformation, "icinga", "Ignoring reschedule request for service '" +
295 arguments[1] + "' (next check is already sooner than requested check time)");
299 Log(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
302 ObjectLock olock(service);
304 service->SetNextCheck(planned_check);
308 void ExternalCommandProcessor::ScheduleForcedSvcCheck(double, const std::vector<String>& arguments)
310 if (arguments.size() < 3)
311 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
313 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
315 Log(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
318 ObjectLock olock(service);
320 service->SetForceNextCheck(true);
321 service->SetNextCheck(Convert::ToDouble(arguments[2]));
325 void ExternalCommandProcessor::EnableHostCheck(double, const std::vector<String>& arguments)
327 if (arguments.size() < 1)
328 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
330 Host::Ptr host = Host::GetByName(arguments[0]);
332 Log(LogInformation, "icinga", "Enabling active checks for host '" + arguments[0] + "'");
333 Service::Ptr hc = host->GetHostCheckService();
339 ObjectLock olock(hc);
341 hc->SetEnableActiveChecks(true);
345 void ExternalCommandProcessor::DisableHostCheck(double, const std::vector<String>& arguments)
347 if (arguments.size() < 1)
348 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
350 Host::Ptr host = Host::GetByName(arguments[0]);
352 Log(LogInformation, "icinga", "Disabling active checks for host '" + arguments[0] + "'");
353 Service::Ptr hc = host->GetHostCheckService();
359 ObjectLock olock(hc);
361 hc->SetEnableActiveChecks(false);
365 void ExternalCommandProcessor::EnableSvcCheck(double, const std::vector<String>& arguments)
367 if (arguments.size() < 2)
368 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
370 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
372 Log(LogInformation, "icinga", "Enabling active checks for service '" + arguments[1] + "'");
375 ObjectLock olock(service);
377 service->SetEnableActiveChecks(true);
381 void ExternalCommandProcessor::DisableSvcCheck(double, const std::vector<String>& arguments)
383 if (arguments.size() < 2)
384 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
386 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
388 Log(LogInformation, "icinga", "Disabling active checks for service '" + arguments[1] + "'");
391 ObjectLock olock(service);
393 service->SetEnableActiveChecks(false);
397 void ExternalCommandProcessor::ShutdownProcess(double, const std::vector<String>&)
399 Log(LogInformation, "icinga", "Shutting down Icinga via external command.");
400 Application::RequestShutdown();
403 void ExternalCommandProcessor::ScheduleForcedHostSvcChecks(double, const std::vector<String>& arguments)
405 if (arguments.size() < 2)
406 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
408 double planned_check = Convert::ToDouble(arguments[1]);
410 Host::Ptr host = Host::GetByName(arguments[0]);
412 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
413 Log(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
416 ObjectLock olock(service);
418 service->SetNextCheck(planned_check);
419 service->SetForceNextCheck(true);
424 void ExternalCommandProcessor::ScheduleHostSvcChecks(double, const std::vector<String>& arguments)
426 if (arguments.size() < 2)
427 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
429 double planned_check = Convert::ToDouble(arguments[1]);
431 Host::Ptr host = Host::GetByName(arguments[0]);
433 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
434 if (planned_check > service->GetNextCheck()) {
435 Log(LogInformation, "icinga", "Ignoring reschedule request for service '" +
436 service->GetName() + "' (next check is already sooner than requested check time)");
440 Log(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
443 ObjectLock olock(service);
445 service->SetNextCheck(planned_check);
450 void ExternalCommandProcessor::EnableHostSvcChecks(double, const std::vector<String>& arguments)
452 if (arguments.size() < 1)
453 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
455 Host::Ptr host = Host::GetByName(arguments[0]);
457 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
458 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
459 service->SetEnableActiveChecks(true);
463 void ExternalCommandProcessor::DisableHostSvcChecks(double, const std::vector<String>& arguments)
465 if (arguments.size() < 1)
466 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
468 Host::Ptr host = Host::GetByName(arguments[0]);
470 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
471 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
474 ObjectLock olock(service);
476 service->SetEnableActiveChecks(false);
481 void ExternalCommandProcessor::AcknowledgeSvcProblem(double, const std::vector<String>& arguments)
483 if (arguments.size() < 7)
484 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 7 arguments."));
486 bool sticky = Convert::ToBool(arguments[2]);
488 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
490 if (service->GetState() == StateOK)
491 BOOST_THROW_EXCEPTION(std::invalid_argument("The service '" + arguments[1] + "' is OK."));
493 Log(LogInformation, "icinga", "Setting acknowledgement for service '" + service->GetName() + "'");
495 service->AcknowledgeProblem(arguments[5], arguments[6], sticky ? AcknowledgementSticky : AcknowledgementNormal);
498 void ExternalCommandProcessor::AcknowledgeSvcProblemExpire(double, const std::vector<String>& arguments)
500 if (arguments.size() < 8)
501 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
503 bool sticky = Convert::ToBool(arguments[2]);
504 double timestamp = Convert::ToDouble(arguments[5]);
506 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
508 if (service->GetState() == StateOK)
509 BOOST_THROW_EXCEPTION(std::invalid_argument("The service '" + arguments[1] + "' is OK."));
511 Log(LogInformation, "icinga", "Setting timed acknowledgement for service '" + service->GetName() + "'");
513 service->AcknowledgeProblem(arguments[6], arguments[7], sticky ? AcknowledgementSticky : AcknowledgementNormal, timestamp);
516 void ExternalCommandProcessor::RemoveSvcAcknowledgement(double, const std::vector<String>& arguments)
518 if (arguments.size() < 2)
519 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
521 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
523 Log(LogInformation, "icinga", "Removing acknowledgement for service '" + service->GetName() + "'");
525 service->ClearAcknowledgement();
528 void ExternalCommandProcessor::AcknowledgeHostProblem(double, const std::vector<String>& arguments)
530 if (arguments.size() < 6)
531 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 6 arguments."));
533 bool sticky = Convert::ToBool(arguments[1]);
535 Host::Ptr host = Host::GetByName(arguments[0]);
537 Log(LogInformation, "icinga", "Setting acknowledgement for host '" + host->GetName() + "'");
538 Service::Ptr service = host->GetHostCheckService();
540 if (service->GetState() == StateOK)
541 BOOST_THROW_EXCEPTION(std::invalid_argument("The host '" + arguments[0] + "' is OK."));
543 service->AcknowledgeProblem(arguments[4], arguments[5], sticky ? AcknowledgementSticky : AcknowledgementNormal);
547 void ExternalCommandProcessor::AcknowledgeHostProblemExpire(double, const std::vector<String>& arguments)
549 if (arguments.size() < 7)
550 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 7 arguments."));
552 bool sticky = Convert::ToBool(arguments[1]);
553 double timestamp = Convert::ToDouble(arguments[4]);
555 Host::Ptr host = Host::GetByName(arguments[0]);
557 Log(LogInformation, "icinga", "Setting timed acknowledgement for host '" + host->GetName() + "'");
558 Service::Ptr service = host->GetHostCheckService();
560 if (service->GetState() == StateOK)
561 BOOST_THROW_EXCEPTION(std::invalid_argument("The host '" + arguments[0] + "' is OK."));
563 service->AcknowledgeProblem(arguments[5], arguments[6], sticky ? AcknowledgementSticky : AcknowledgementNormal, timestamp);
567 void ExternalCommandProcessor::RemoveHostAcknowledgement(double, const std::vector<String>& arguments)
569 if (arguments.size() < 1)
570 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
572 Host::Ptr host = Host::GetByName(arguments[0]);
574 Log(LogInformation, "icinga", "Removing acknowledgement for host '" + host->GetName() + "'");
575 Service::Ptr service = host->GetHostCheckService();
577 service->ClearAcknowledgement();
580 void ExternalCommandProcessor::EnableHostgroupSvcChecks(double, const std::vector<String>& arguments)
582 if (arguments.size() < 1)
583 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
585 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
587 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
588 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
589 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
592 ObjectLock olock(service);
594 service->SetEnableActiveChecks(true);
600 void ExternalCommandProcessor::DisableHostgroupSvcChecks(double, const std::vector<String>& arguments)
602 if (arguments.size() < 1)
603 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
605 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
607 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
608 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
609 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
612 ObjectLock olock(service);
614 service->SetEnableActiveChecks(false);
620 void ExternalCommandProcessor::EnableServicegroupSvcChecks(double, const std::vector<String>& arguments)
622 if (arguments.size() < 1)
623 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
625 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
627 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
628 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
631 ObjectLock olock(service);
633 service->SetEnableActiveChecks(true);
638 void ExternalCommandProcessor::DisableServicegroupSvcChecks(double, const std::vector<String>& arguments)
640 if (arguments.size() < 1)
641 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
643 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
645 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
646 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
649 ObjectLock olock(service);
651 service->SetEnableActiveChecks(false);
656 void ExternalCommandProcessor::EnablePassiveHostChecks(double, const std::vector<String>& arguments)
658 if (arguments.size() < 1)
659 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
661 Host::Ptr host = Host::GetByName(arguments[0]);
663 Log(LogInformation, "icinga", "Enabling passive checks for host '" + arguments[0] + "'");
664 Service::Ptr hc = host->GetHostCheckService();
670 ObjectLock olock(hc);
672 hc->SetEnablePassiveChecks(true);
676 void ExternalCommandProcessor::DisablePassiveHostChecks(double, const std::vector<String>& arguments)
678 if (arguments.size() < 1)
679 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
681 Host::Ptr host = Host::GetByName(arguments[0]);
683 Log(LogInformation, "icinga", "Disabling passive checks for host '" + arguments[0] + "'");
684 Service::Ptr hc = host->GetHostCheckService();
690 ObjectLock olock(hc);
692 hc->SetEnablePassiveChecks(false);
696 void ExternalCommandProcessor::EnablePassiveSvcChecks(double, const std::vector<String>& arguments)
698 if (arguments.size() < 2)
699 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
701 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
703 Log(LogInformation, "icinga", "Enabling passive checks for service '" + arguments[1] + "'");
706 ObjectLock olock(service);
708 service->SetEnablePassiveChecks(true);
712 void ExternalCommandProcessor::DisablePassiveSvcChecks(double, const std::vector<String>& arguments)
714 if (arguments.size() < 2)
715 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
717 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
719 Log(LogInformation, "icinga", "Disabling passive checks for service '" + arguments[1] + "'");
722 ObjectLock olock(service);
724 service->SetEnablePassiveChecks(false);
728 void ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks(double, const std::vector<String>& arguments)
730 if (arguments.size() < 1)
731 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
733 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
735 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
736 Log(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
739 ObjectLock olock(service);
741 service->SetEnablePassiveChecks(true);
746 void ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks(double, const std::vector<String>& arguments)
748 if (arguments.size() < 1)
749 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
751 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
753 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
754 Log(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
757 ObjectLock olock(service);
759 service->SetEnablePassiveChecks(true);
764 void ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks(double, const std::vector<String>& arguments)
766 if (arguments.size() < 1)
767 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
769 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
771 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
772 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
773 Log(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
776 ObjectLock olock(service);
778 service->SetEnablePassiveChecks(true);
784 void ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks(double, const std::vector<String>& arguments)
786 if (arguments.size() < 1)
787 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
789 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
791 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
792 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
793 Log(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
796 ObjectLock olock(service);
798 service->SetEnablePassiveChecks(false);
804 void ExternalCommandProcessor::ProcessFile(double, const std::vector<String>& arguments)
806 if (arguments.size() < 2)
807 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
809 String file = arguments[0];
810 bool del = Convert::ToBool(arguments[1]);
813 ifp.exceptions(std::ifstream::badbit);
815 ifp.open(file.CStr(), std::ifstream::in);
819 std::getline(ifp, line);
822 Log(LogInformation, "compat", "Executing external command: " + line);
825 } catch (const std::exception& ex) {
826 std::ostringstream msgbuf;
827 msgbuf << "External command failed: " << boost::diagnostic_information(ex);
828 Log(LogWarning, "icinga", msgbuf.str());
835 (void) unlink(file.CStr());
838 void ExternalCommandProcessor::ScheduleSvcDowntime(double, const std::vector<String>& arguments)
840 if (arguments.size() < 9)
841 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 9 arguments."));
843 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
846 int triggeredByLegacy = Convert::ToLong(arguments[5]);
847 if (triggeredByLegacy != 0)
848 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
850 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
851 (void) service->AddDowntime(arguments[7], arguments[8],
852 Convert::ToDouble(arguments[2]), Convert::ToDouble(arguments[3]),
853 Convert::ToBool(arguments[4]), triggeredBy, Convert::ToDouble(arguments[6]));
856 void ExternalCommandProcessor::DelSvcDowntime(double, const std::vector<String>& arguments)
858 if (arguments.size() < 1)
859 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
861 int id = Convert::ToLong(arguments[0]);
862 Log(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
863 String rid = Service::GetDowntimeIDFromLegacyID(id);
864 Service::RemoveDowntime(rid);
867 void ExternalCommandProcessor::ScheduleHostDowntime(double, const std::vector<String>& arguments)
869 if (arguments.size() < 8)
870 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
872 Host::Ptr host = Host::GetByName(arguments[0]);
875 int triggeredByLegacy = Convert::ToLong(arguments[4]);
876 if (triggeredByLegacy != 0)
877 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
879 Log(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
880 Service::Ptr service = host->GetHostCheckService();
882 (void) service->AddDowntime(arguments[6], arguments[7],
883 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
884 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
888 void ExternalCommandProcessor::DelHostDowntime(double, const std::vector<String>& arguments)
890 if (arguments.size() < 1)
891 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
893 int id = Convert::ToLong(arguments[0]);
894 Log(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
895 String rid = Service::GetDowntimeIDFromLegacyID(id);
896 Service::RemoveDowntime(rid);
899 void ExternalCommandProcessor::ScheduleHostSvcDowntime(double, const std::vector<String>& arguments)
901 if (arguments.size() < 8)
902 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 argument."));
904 Host::Ptr host = Host::GetByName(arguments[0]);
907 int triggeredByLegacy = Convert::ToLong(arguments[4]);
908 if (triggeredByLegacy != 0)
909 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
911 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
912 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
913 (void) service->AddDowntime(arguments[6], arguments[7],
914 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
915 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
919 void ExternalCommandProcessor::ScheduleHostgroupHostDowntime(double, const std::vector<String>& arguments)
921 if (arguments.size() < 8)
922 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
924 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
927 int triggeredByLegacy = Convert::ToLong(arguments[4]);
928 if (triggeredByLegacy != 0)
929 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
931 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
932 Log(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
933 Service::Ptr service = host->GetHostCheckService();
935 (void) service->AddDowntime(arguments[6], arguments[7],
936 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
937 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
942 void ExternalCommandProcessor::ScheduleHostgroupSvcDowntime(double, const std::vector<String>& arguments)
944 if (arguments.size() < 8)
945 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
947 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
950 int triggeredByLegacy = Convert::ToLong(arguments[4]);
951 if (triggeredByLegacy != 0)
952 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
954 /* Note: we can't just directly create downtimes for all the services by iterating
955 * over all hosts in the host group - otherwise we might end up creating multiple
956 * downtimes for some services. */
958 std::set<Service::Ptr> services;
960 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
961 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
962 services.insert(service);
966 BOOST_FOREACH(const Service::Ptr& service, services) {
967 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
968 (void) service->AddDowntime(arguments[6], arguments[7],
969 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
970 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
974 void ExternalCommandProcessor::ScheduleServicegroupHostDowntime(double, const std::vector<String>& arguments)
976 if (arguments.size() < 8)
977 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
979 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
982 int triggeredByLegacy = Convert::ToLong(arguments[4]);
983 if (triggeredByLegacy != 0)
984 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
986 /* Note: we can't just directly create downtimes for all the hosts by iterating
987 * over all services in the service group - otherwise we might end up creating multiple
988 * downtimes for some hosts. */
990 std::set<Service::Ptr> services;
992 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
993 Host::Ptr host = service->GetHost();
994 Service::Ptr hcService = host->GetHostCheckService();
996 services.insert(hcService);
999 BOOST_FOREACH(const Service::Ptr& service, services) {
1000 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
1001 (void) service->AddDowntime(arguments[6], arguments[7],
1002 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
1003 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
1007 void ExternalCommandProcessor::ScheduleServicegroupSvcDowntime(double, const std::vector<String>& arguments)
1009 if (arguments.size() < 8)
1010 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
1012 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1015 int triggeredByLegacy = Convert::ToLong(arguments[4]);
1016 if (triggeredByLegacy != 0)
1017 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
1019 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1020 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
1021 (void) service->AddDowntime(arguments[6], arguments[7],
1022 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
1023 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
1027 void ExternalCommandProcessor::AddHostComment(double, const std::vector<String>& arguments)
1029 if (arguments.size() < 4)
1030 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
1032 Host::Ptr host = Host::GetByName(arguments[0]);
1034 Log(LogInformation, "icinga", "Creating comment for host " + host->GetName());
1035 Service::Ptr service = host->GetHostCheckService();
1037 (void) service->AddComment(CommentUser, arguments[2], arguments[3], 0);
1040 void ExternalCommandProcessor::DelHostComment(double, const std::vector<String>& arguments)
1042 if (arguments.size() < 1)
1043 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1045 int id = Convert::ToLong(arguments[0]);
1046 Log(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
1047 String rid = Service::GetCommentIDFromLegacyID(id);
1048 Service::RemoveComment(rid);
1051 void ExternalCommandProcessor::AddSvcComment(double, const std::vector<String>& arguments)
1053 if (arguments.size() < 5)
1054 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 5 arguments."));
1056 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1058 Log(LogInformation, "icinga", "Creating comment for service " + service->GetName());
1059 (void) service->AddComment(CommentUser, arguments[3], arguments[4], 0);
1062 void ExternalCommandProcessor::DelSvcComment(double, const std::vector<String>& arguments)
1064 if (arguments.size() < 1)
1065 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1067 int id = Convert::ToLong(arguments[0]);
1068 Log(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
1070 String rid = Service::GetCommentIDFromLegacyID(id);
1071 Service::RemoveComment(rid);
1074 void ExternalCommandProcessor::DelAllHostComments(double, const std::vector<String>& arguments)
1076 if (arguments.size() < 1)
1077 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1079 Host::Ptr host = Host::GetByName(arguments[0]);
1081 Log(LogInformation, "icinga", "Removing all comments for host " + host->GetName());
1082 Service::Ptr service = host->GetHostCheckService();
1084 service->RemoveAllComments();
1087 void ExternalCommandProcessor::DelAllSvcComments(double, const std::vector<String>& arguments)
1089 if (arguments.size() < 2)
1090 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1092 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1094 Log(LogInformation, "icinga", "Removing all comments for service " + service->GetName());
1095 service->RemoveAllComments();
1098 void ExternalCommandProcessor::SendCustomHostNotification(double, const std::vector<String>& arguments)
1100 if (arguments.size() < 4)
1101 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
1103 Host::Ptr host = Host::GetByName(arguments[0]);
1104 int options = Convert::ToLong(arguments[1]);
1106 Log(LogInformation, "icinga", "Sending custom notification for host " + host->GetName());
1107 Service::Ptr service = host->GetHostCheckService();
1110 ObjectLock olock(service);
1111 service->SetForceNextNotification(true);
1115 service->RequestNotifications(NotificationCustom, service->GetLastCheckResult(), arguments[2], arguments[3]);
1119 void ExternalCommandProcessor::SendCustomSvcNotification(double, const std::vector<String>& arguments)
1121 if (arguments.size() < 5)
1122 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 5 arguments."));
1124 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1125 int options = Convert::ToLong(arguments[2]);
1127 Log(LogInformation, "icinga", "Sending custom notification for service " + service->GetName());
1130 ObjectLock olock(service);
1131 service->SetForceNextNotification(true);
1135 service->RequestNotifications(NotificationCustom, service->GetLastCheckResult(), arguments[3], arguments[4]);
1138 void ExternalCommandProcessor::DelayHostNotification(double, const std::vector<String>& arguments)
1140 if (arguments.size() < 2)
1141 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1143 Host::Ptr host = Host::GetByName(arguments[0]);
1145 Log(LogInformation, "icinga", "Delaying notifications for host " + host->GetName());
1146 Service::Ptr hc = host->GetHostCheckService();
1150 BOOST_FOREACH(const Notification::Ptr& notification, hc->GetNotifications()) {
1151 ObjectLock olock(notification);
1153 notification->SetNextNotification(Convert::ToDouble(arguments[1]));
1157 void ExternalCommandProcessor::DelaySvcNotification(double, const std::vector<String>& arguments)
1159 if (arguments.size() < 3)
1160 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
1162 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1164 Log(LogInformation, "icinga", "Delaying notifications for service " + service->GetName());
1166 BOOST_FOREACH(const Notification::Ptr& notification, service->GetNotifications()) {
1167 ObjectLock olock(notification);
1169 notification->SetNextNotification(Convert::ToDouble(arguments[2]));
1173 void ExternalCommandProcessor::EnableHostNotifications(double, const std::vector<String>& arguments)
1175 if (arguments.size() < 1)
1176 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1178 Host::Ptr host = Host::GetByName(arguments[0]);
1180 Log(LogInformation, "icinga", "Enabling notifications for host '" + arguments[0] + "'");
1181 Service::Ptr hc = host->GetHostCheckService();
1187 ObjectLock olock(hc);
1189 hc->SetEnableNotifications(true);
1193 void ExternalCommandProcessor::DisableHostNotifications(double, const std::vector<String>& arguments)
1195 if (arguments.size() < 1)
1196 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1198 Host::Ptr host = Host::GetByName(arguments[0]);
1200 Log(LogInformation, "icinga", "Disabling notifications for host '" + arguments[0] + "'");
1201 Service::Ptr hc = host->GetHostCheckService();
1207 ObjectLock olock(hc);
1209 hc->SetEnableNotifications(false);
1213 void ExternalCommandProcessor::EnableSvcNotifications(double, const std::vector<String>& arguments)
1215 if (arguments.size() < 2)
1216 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1218 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1220 Log(LogInformation, "icinga", "Enabling notifications for service '" + arguments[1] + "'");
1223 ObjectLock olock(service);
1225 service->SetEnableNotifications(true);
1229 void ExternalCommandProcessor::DisableSvcNotifications(double, const std::vector<String>& arguments)
1231 if (arguments.size() < 2)
1232 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1234 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1236 Log(LogInformation, "icinga", "Disabling notifications for service '" + arguments[1] + "'");
1239 ObjectLock olock(service);
1241 service->SetEnableNotifications(false);
1245 void ExternalCommandProcessor::DisableHostgroupHostChecks(double, const std::vector<String>& arguments)
1247 if (arguments.size() < 1)
1248 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1250 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
1252 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
1253 Service::Ptr hc = host->GetHostCheckService();
1258 Log(LogInformation, "icinga", "Disabling active checks for host '" + host->GetName() + "'");
1261 ObjectLock olock(hc);
1263 hc->SetEnableActiveChecks(false);
1268 void ExternalCommandProcessor::DisableHostgroupPassiveHostChecks(double, const std::vector<String>& arguments)
1270 if (arguments.size() < 1)
1271 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1273 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
1275 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
1276 Service::Ptr hc = host->GetHostCheckService();
1281 Log(LogInformation, "icinga", "Disabling active checks for host '" + host->GetName() + "'");
1284 ObjectLock olock(hc);
1286 hc->SetEnablePassiveChecks(false);
1291 void ExternalCommandProcessor::DisableServicegroupHostChecks(double, const std::vector<String>& arguments)
1293 if (arguments.size() < 1)
1294 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1296 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1298 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1299 Host::Ptr host = service->GetHost();
1304 Service::Ptr hc = host->GetHostCheckService();
1309 Log(LogInformation, "icinga", "Disabling active checks for host '" + host->GetName() + "'");
1312 ObjectLock olock(hc);
1314 hc->SetEnableActiveChecks(false);
1319 void ExternalCommandProcessor::DisableServicegroupPassiveHostChecks(double, const std::vector<String>& arguments)
1321 if (arguments.size() < 1)
1322 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1324 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1326 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1327 Host::Ptr host = service->GetHost();
1332 Service::Ptr hc = host->GetHostCheckService();
1337 Log(LogInformation, "icinga", "Disabling active checks for host '" + host->GetName() + "'");
1340 ObjectLock olock(hc);
1342 hc->SetEnablePassiveChecks(false);
1347 void ExternalCommandProcessor::EnableHostgroupHostChecks(double, const std::vector<String>& arguments)
1349 if (arguments.size() < 1)
1350 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1352 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
1354 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
1355 Service::Ptr hc = host->GetHostCheckService();
1360 Log(LogInformation, "icinga", "Enabling active checks for host '" + host->GetName() + "'");
1363 ObjectLock olock(hc);
1365 hc->SetEnableActiveChecks(true);
1370 void ExternalCommandProcessor::EnableHostgroupPassiveHostChecks(double, const std::vector<String>& arguments)
1372 if (arguments.size() < 1)
1373 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1377 void ExternalCommandProcessor::EnableServicegroupHostChecks(double, const std::vector<String>& arguments)
1379 if (arguments.size() < 1)
1380 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1382 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1384 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1385 Host::Ptr host = service->GetHost();
1390 Service::Ptr hc = host->GetHostCheckService();
1395 Log(LogInformation, "icinga", "Enabling active checks for host '" + host->GetName() + "'");
1398 ObjectLock olock(hc);
1400 hc->SetEnableActiveChecks(true);
1405 void ExternalCommandProcessor::EnableServicegroupPassiveHostChecks(double, const std::vector<String>& arguments)
1407 if (arguments.size() < 1)
1408 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
1410 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1412 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1413 Host::Ptr host = service->GetHost();
1418 Service::Ptr hc = host->GetHostCheckService();
1423 Log(LogInformation, "icinga", "Enabling active checks for host '" + host->GetName() + "'");
1426 ObjectLock olock(hc);
1428 hc->SetEnablePassiveChecks(false);
1433 void ExternalCommandProcessor::EnableHostFlapping(double, const std::vector<String>& arguments)
1435 if (arguments.size() < 1)
1436 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1438 Host::Ptr host = Host::GetByName(arguments[0]);
1440 Log(LogInformation, "icinga", "Enabling flapping detection for host '" + arguments[0] + "'");
1441 Service::Ptr hc = host->GetHostCheckService();
1447 ObjectLock olock(hc);
1449 hc->SetEnableFlapping(true);
1453 void ExternalCommandProcessor::DisableHostFlapping(double, const std::vector<String>& arguments)
1455 if (arguments.size() < 1)
1456 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1458 Host::Ptr host = Host::GetByName(arguments[0]);
1460 Log(LogInformation, "icinga", "Disabling flapping detection for host '" + arguments[0] + "'");
1461 Service::Ptr hc = host->GetHostCheckService();
1467 ObjectLock olock(hc);
1469 hc->SetEnableFlapping(false);
1473 void ExternalCommandProcessor::EnableSvcFlapping(double, const std::vector<String>& arguments)
1475 if (arguments.size() < 2)
1476 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1478 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1480 Log(LogInformation, "icinga", "Enabling flapping detection for service '" + arguments[1] + "'");
1483 ObjectLock olock(service);
1485 service->SetEnableFlapping(true);
1489 void ExternalCommandProcessor::DisableSvcFlapping(double, const std::vector<String>& arguments)
1491 if (arguments.size() < 2)
1492 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1494 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1496 Log(LogInformation, "icinga", "Disabling flapping detection for service '" + arguments[1] + "'");
1499 ObjectLock olock(service);
1501 service->SetEnableFlapping(false);