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"
32 #include <boost/algorithm/string/classification.hpp>
33 #include <boost/foreach.hpp>
34 #include <boost/exception/diagnostic_information.hpp>
35 #include <boost/algorithm/string/split.hpp>
37 using namespace icinga;
39 boost::once_flag ExternalCommandProcessor::m_InitializeOnce = BOOST_ONCE_INIT;
40 boost::mutex ExternalCommandProcessor::m_Mutex;
41 std::map<String, ExternalCommandProcessor::Callback> ExternalCommandProcessor::m_Commands;
44 * @threadsafety Always.
46 void ExternalCommandProcessor::Execute(const String& line)
52 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing timestamp in command: " + line));
54 size_t pos = line.FindFirstOf("]");
56 if (pos == String::NPos)
57 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing timestamp in command: " + line));
59 String timestamp = line.SubStr(1, pos - 1);
60 String args = line.SubStr(pos + 2, String::NPos);
62 double ts = Convert::ToDouble(timestamp);
65 BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid timestamp in command: " + line));
67 std::vector<String> argv;
68 boost::algorithm::split(argv, args, boost::is_any_of(";"));
71 BOOST_THROW_EXCEPTION(std::invalid_argument("Missing arguments in command: " + line));
73 std::vector<String> argvExtra(argv.begin() + 1, argv.end());
74 Execute(ts, argv[0], argvExtra);
78 * @threadsafety Always.
80 void ExternalCommandProcessor::Execute(double time, const String& command, const std::vector<String>& arguments)
82 boost::call_once(m_InitializeOnce, &ExternalCommandProcessor::Initialize);
87 boost::mutex::scoped_lock lock(m_Mutex);
89 std::map<String, ExternalCommandProcessor::Callback>::iterator it;
90 it = m_Commands.find(command);
92 if (it == m_Commands.end())
93 BOOST_THROW_EXCEPTION(std::invalid_argument("The external command '" + command + "' does not exist."));
95 callback = it->second;
98 callback(time, arguments);
102 * @threadsafety Always.
104 void ExternalCommandProcessor::Initialize(void)
106 RegisterCommand("PROCESS_HOST_CHECK_RESULT", &ExternalCommandProcessor::ProcessHostCheckResult);
107 RegisterCommand("PROCESS_SERVICE_CHECK_RESULT", &ExternalCommandProcessor::ProcessServiceCheckResult);
108 RegisterCommand("SCHEDULE_HOST_CHECK", &ExternalCommandProcessor::ScheduleHostCheck);
109 RegisterCommand("SCHEDULE_FORCED_HOST_CHECK", &ExternalCommandProcessor::ScheduleForcedHostCheck);
110 RegisterCommand("SCHEDULE_SVC_CHECK", &ExternalCommandProcessor::ScheduleSvcCheck);
111 RegisterCommand("SCHEDULE_FORCED_SVC_CHECK", &ExternalCommandProcessor::ScheduleForcedSvcCheck);
112 RegisterCommand("ENABLE_HOST_CHECK", &ExternalCommandProcessor::EnableHostCheck);
113 RegisterCommand("DISABLE_HOST_CHECK", &ExternalCommandProcessor::DisableHostCheck);
114 RegisterCommand("ENABLE_SVC_CHECK", &ExternalCommandProcessor::EnableSvcCheck);
115 RegisterCommand("DISABLE_SVC_CHECK", &ExternalCommandProcessor::DisableSvcCheck);
116 RegisterCommand("SHUTDOWN_PROCESS", &ExternalCommandProcessor::ShutdownProcess);
117 RegisterCommand("SCHEDULE_FORCED_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleForcedHostSvcChecks);
118 RegisterCommand("SCHEDULE_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleHostSvcChecks);
119 RegisterCommand("ENABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::EnableHostSvcChecks);
120 RegisterCommand("DISABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::DisableHostSvcChecks);
121 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM", &ExternalCommandProcessor::AcknowledgeSvcProblem);
122 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeSvcProblemExpire);
123 RegisterCommand("REMOVE_SVC_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveSvcAcknowledgement);
124 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM", &ExternalCommandProcessor::AcknowledgeHostProblem);
125 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeHostProblemExpire);
126 RegisterCommand("REMOVE_HOST_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
127 RegisterCommand("ENABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupSvcChecks);
128 RegisterCommand("DISABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupSvcChecks);
129 RegisterCommand("ENABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupSvcChecks);
130 RegisterCommand("DISABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupSvcChecks);
131 RegisterCommand("ENABLE_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::EnablePassiveHostChecks);
132 RegisterCommand("DISABLE_PASSIVE_HOST_CHECKS", &ExternalCommandProcessor::DisablePassiveHostChecks);
133 RegisterCommand("ENABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnablePassiveSvcChecks);
134 RegisterCommand("DISABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisablePassiveSvcChecks);
135 RegisterCommand("ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks);
136 RegisterCommand("DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks);
137 RegisterCommand("ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks);
138 RegisterCommand("DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks);
139 RegisterCommand("PROCESS_FILE", &ExternalCommandProcessor::ProcessFile);
140 RegisterCommand("SCHEDULE_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleSvcDowntime);
141 RegisterCommand("DEL_SVC_DOWNTIME", &ExternalCommandProcessor::DelSvcDowntime);
142 RegisterCommand("SCHEDULE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostDowntime);
143 RegisterCommand("DEL_HOST_DOWNTIME", &ExternalCommandProcessor::DelHostDowntime);
144 RegisterCommand("SCHEDULE_HOST_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostSvcDowntime);
145 RegisterCommand("SCHEDULE_HOSTGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupHostDowntime);
146 RegisterCommand("SCHEDULE_HOSTGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupSvcDowntime);
147 RegisterCommand("SCHEDULE_SERVICEGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupHostDowntime);
148 RegisterCommand("SCHEDULE_SERVICEGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupSvcDowntime);
149 RegisterCommand("ADD_HOST_COMMENT", &ExternalCommandProcessor::AddHostComment);
150 RegisterCommand("DEL_HOST_COMMENT", &ExternalCommandProcessor::DelHostComment);
151 RegisterCommand("ADD_SVC_COMMENT", &ExternalCommandProcessor::AddSvcComment);
152 RegisterCommand("DEL_SVC_COMMENT", &ExternalCommandProcessor::DelSvcComment);
153 RegisterCommand("DEL_ALL_HOST_COMMENTS", &ExternalCommandProcessor::DelAllHostComments);
154 RegisterCommand("DEL_ALL_SVC_COMMENTS", &ExternalCommandProcessor::DelAllSvcComments);
155 RegisterCommand("SEND_CUSTOM_HOST_NOTIFICATION", &ExternalCommandProcessor::SendCustomHostNotification);
156 RegisterCommand("SEND_CUSTOM_SVC_NOTIFICATION", &ExternalCommandProcessor::SendCustomSvcNotification);
157 RegisterCommand("DELAY_HOST_NOTIFICATION", &ExternalCommandProcessor::DelayHostNotification);
158 RegisterCommand("DELAY_SVC_NOTIFICATION", &ExternalCommandProcessor::DelaySvcNotification);
159 RegisterCommand("ENABLE_HOST_NOTIFICATIONS", &ExternalCommandProcessor::EnableHostNotifications);
160 RegisterCommand("DISABLE_HOST_NOTIFICATIONS", &ExternalCommandProcessor::DisableHostNotifications);
161 RegisterCommand("ENABLE_SVC_NOTIFICATIONS", &ExternalCommandProcessor::EnableSvcNotifications);
162 RegisterCommand("DISABLE_SVC_NOTIFICATIONS", &ExternalCommandProcessor::DisableSvcNotifications);
166 * @threadsafety Always.
168 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
170 boost::mutex::scoped_lock lock(m_Mutex);
171 m_Commands[command] = callback;
174 void ExternalCommandProcessor::ProcessHostCheckResult(double time, const std::vector<String>& arguments)
176 if (arguments.size() < 3)
177 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
179 Host::Ptr host = Host::GetByName(arguments[0]);
181 Service::Ptr hc = host->GetHostCheckService();
183 if (!hc->GetEnablePassiveChecks())
184 BOOST_THROW_EXCEPTION(std::invalid_argument("Got passive check result for host '" + arguments[0] + "' which has passive checks disabled."));
186 int exitStatus = Convert::ToDouble(arguments[1]);
187 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[2]);
188 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
190 result->Set("schedule_start", time);
191 result->Set("schedule_end", time);
192 result->Set("execution_start", time);
193 result->Set("execution_end", time);
194 result->Set("active", 0);
196 Log(LogInformation, "icinga", "Processing passive check result for host '" + arguments[0] + "'");
197 hc->ProcessCheckResult(result);
200 ObjectLock olock(hc);
202 /* Reschedule the next check. The side effect of this is that for as long
203 * as we receive passive results for a service we won't execute any
205 hc->SetNextCheck(Utility::GetTime() + hc->GetCheckInterval());
209 void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std::vector<String>& arguments)
211 if (arguments.size() < 4)
212 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
214 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
216 if (!service->GetEnablePassiveChecks())
217 BOOST_THROW_EXCEPTION(std::invalid_argument("Got passive check result for service '" + arguments[1] + "' which has passive checks disabled."));
219 int exitStatus = Convert::ToDouble(arguments[2]);
220 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[3]);
221 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
223 result->Set("schedule_start", time);
224 result->Set("schedule_end", time);
225 result->Set("execution_start", time);
226 result->Set("execution_end", time);
227 result->Set("active", 0);
229 Log(LogInformation, "icinga", "Processing passive check result for service '" + arguments[1] + "'");
230 service->ProcessCheckResult(result);
233 ObjectLock olock(service);
235 /* Reschedule the next check. The side effect of this is that for as long
236 * as we receive passive results for a service we won't execute any
238 service->SetNextCheck(Utility::GetTime() + service->GetCheckInterval());
242 void ExternalCommandProcessor::ScheduleHostCheck(double, const std::vector<String>& arguments)
244 if (arguments.size() < 2)
245 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
247 Host::Ptr host = Host::GetByName(arguments[0]);
249 Service::Ptr hc = host->GetHostCheckService();
251 double planned_check = Convert::ToDouble(arguments[1]);
253 if (planned_check > hc->GetNextCheck()) {
254 Log(LogInformation, "icinga", "Ignoring reschedule request for host '" +
255 arguments[0] + "' (next check is already sooner than requested check time)");
259 Log(LogInformation, "icinga", "Rescheduling next check for host '" + arguments[0] + "'");
262 ObjectLock olock(hc);
264 hc->SetNextCheck(planned_check);
268 void ExternalCommandProcessor::ScheduleForcedHostCheck(double, const std::vector<String>& arguments)
270 if (arguments.size() < 2)
271 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
273 Host::Ptr host = Host::GetByName(arguments[0]);
275 Service::Ptr hc = host->GetHostCheckService();
277 Log(LogInformation, "icinga", "Rescheduling next check for host '" + arguments[0] + "'");
280 ObjectLock olock(hc);
282 hc->SetForceNextCheck(true);
283 hc->SetNextCheck(Convert::ToDouble(arguments[1]));
287 void ExternalCommandProcessor::ScheduleSvcCheck(double, const std::vector<String>& arguments)
289 if (arguments.size() < 3)
290 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
292 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
294 double planned_check = Convert::ToDouble(arguments[2]);
296 if (planned_check > service->GetNextCheck()) {
297 Log(LogInformation, "icinga", "Ignoring reschedule request for service '" +
298 arguments[1] + "' (next check is already sooner than requested check time)");
302 Log(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
305 ObjectLock olock(service);
307 service->SetNextCheck(planned_check);
311 void ExternalCommandProcessor::ScheduleForcedSvcCheck(double, const std::vector<String>& arguments)
313 if (arguments.size() < 3)
314 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
316 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
318 Log(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
321 ObjectLock olock(service);
323 service->SetForceNextCheck(true);
324 service->SetNextCheck(Convert::ToDouble(arguments[2]));
328 void ExternalCommandProcessor::EnableHostCheck(double, const std::vector<String>& arguments)
330 if (arguments.size() < 1)
331 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
333 Host::Ptr host = Host::GetByName(arguments[0]);
335 Log(LogInformation, "icinga", "Enabling active checks for host '" + arguments[0] + "'");
336 Service::Ptr hc = host->GetHostCheckService();
342 ObjectLock olock(hc);
344 hc->SetEnableActiveChecks(true);
348 void ExternalCommandProcessor::DisableHostCheck(double, const std::vector<String>& arguments)
350 if (arguments.size() < 1)
351 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
353 Host::Ptr host = Host::GetByName(arguments[0]);
355 Log(LogInformation, "icinga", "Disabling active checks for host '" + arguments[0] + "'");
356 Service::Ptr hc = host->GetHostCheckService();
362 ObjectLock olock(hc);
364 hc->SetEnableActiveChecks(false);
368 void ExternalCommandProcessor::EnableSvcCheck(double, const std::vector<String>& arguments)
370 if (arguments.size() < 2)
371 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
373 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
375 Log(LogInformation, "icinga", "Enabling active checks for service '" + arguments[1] + "'");
378 ObjectLock olock(service);
380 service->SetEnableActiveChecks(true);
384 void ExternalCommandProcessor::DisableSvcCheck(double, const std::vector<String>& arguments)
386 if (arguments.size() < 2)
387 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
389 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
391 Log(LogInformation, "icinga", "Disabling active checks for service '" + arguments[1] + "'");
394 ObjectLock olock(service);
396 service->SetEnableActiveChecks(false);
400 void ExternalCommandProcessor::ShutdownProcess(double, const std::vector<String>&)
402 Log(LogInformation, "icinga", "Shutting down Icinga via external command.");
403 Application::RequestShutdown();
406 void ExternalCommandProcessor::ScheduleForcedHostSvcChecks(double, const std::vector<String>& arguments)
408 if (arguments.size() < 2)
409 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
411 double planned_check = Convert::ToDouble(arguments[1]);
413 Host::Ptr host = Host::GetByName(arguments[0]);
415 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
416 Log(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
419 ObjectLock olock(service);
421 service->SetNextCheck(planned_check);
422 service->SetForceNextCheck(true);
427 void ExternalCommandProcessor::ScheduleHostSvcChecks(double, const std::vector<String>& arguments)
429 if (arguments.size() < 2)
430 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
432 double planned_check = Convert::ToDouble(arguments[1]);
434 Host::Ptr host = Host::GetByName(arguments[0]);
436 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
437 if (planned_check > service->GetNextCheck()) {
438 Log(LogInformation, "icinga", "Ignoring reschedule request for service '" +
439 service->GetName() + "' (next check is already sooner than requested check time)");
443 Log(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
446 ObjectLock olock(service);
448 service->SetNextCheck(planned_check);
453 void ExternalCommandProcessor::EnableHostSvcChecks(double, const std::vector<String>& arguments)
455 if (arguments.size() < 1)
456 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
458 Host::Ptr host = Host::GetByName(arguments[0]);
460 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
461 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
462 service->SetEnableActiveChecks(true);
466 void ExternalCommandProcessor::DisableHostSvcChecks(double, const std::vector<String>& arguments)
468 if (arguments.size() < 1)
469 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
471 Host::Ptr host = Host::GetByName(arguments[0]);
473 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
474 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
477 ObjectLock olock(service);
479 service->SetEnableActiveChecks(false);
484 void ExternalCommandProcessor::AcknowledgeSvcProblem(double, const std::vector<String>& arguments)
486 if (arguments.size() < 7)
487 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 7 arguments."));
489 bool sticky = Convert::ToBool(arguments[2]);
491 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
493 if (service->GetState() == StateOK)
494 BOOST_THROW_EXCEPTION(std::invalid_argument("The service '" + arguments[1] + "' is OK."));
496 Log(LogInformation, "icinga", "Setting acknowledgement for service '" + service->GetName() + "'");
498 service->AcknowledgeProblem(sticky ? AcknowledgementSticky : AcknowledgementNormal);
501 void ExternalCommandProcessor::AcknowledgeSvcProblemExpire(double, const std::vector<String>& arguments)
503 if (arguments.size() < 8)
504 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
506 bool sticky = Convert::ToBool(arguments[2]);
507 double timestamp = Convert::ToDouble(arguments[5]);
509 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
511 if (service->GetState() == StateOK)
512 BOOST_THROW_EXCEPTION(std::invalid_argument("The service '" + arguments[1] + "' is OK."));
514 Log(LogInformation, "icinga", "Setting timed acknowledgement for service '" + service->GetName() + "'");
516 service->AcknowledgeProblem(sticky ? AcknowledgementSticky : AcknowledgementNormal, timestamp);
519 void ExternalCommandProcessor::RemoveSvcAcknowledgement(double, const std::vector<String>& arguments)
521 if (arguments.size() < 2)
522 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
524 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
526 Log(LogInformation, "icinga", "Removing acknowledgement for service '" + service->GetName() + "'");
528 service->ClearAcknowledgement();
531 void ExternalCommandProcessor::AcknowledgeHostProblem(double, const std::vector<String>& arguments)
533 if (arguments.size() < 6)
534 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 6 arguments."));
536 bool sticky = Convert::ToBool(arguments[1]);
538 Host::Ptr host = Host::GetByName(arguments[0]);
540 Log(LogInformation, "icinga", "Setting acknowledgement for host '" + host->GetName() + "'");
541 Service::Ptr service = host->GetHostCheckService();
543 if (service->GetState() == StateOK)
544 BOOST_THROW_EXCEPTION(std::invalid_argument("The host '" + arguments[0] + "' is OK."));
546 service->AcknowledgeProblem(sticky ? AcknowledgementSticky : AcknowledgementNormal);
550 void ExternalCommandProcessor::AcknowledgeHostProblemExpire(double, const std::vector<String>& arguments)
552 if (arguments.size() < 7)
553 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 7 arguments."));
555 bool sticky = Convert::ToBool(arguments[1]);
556 double timestamp = Convert::ToDouble(arguments[4]);
558 Host::Ptr host = Host::GetByName(arguments[0]);
560 Log(LogInformation, "icinga", "Setting timed acknowledgement for host '" + host->GetName() + "'");
561 Service::Ptr service = host->GetHostCheckService();
563 if (service->GetState() == StateOK)
564 BOOST_THROW_EXCEPTION(std::invalid_argument("The host '" + arguments[0] + "' is OK."));
566 service->AcknowledgeProblem(sticky ? AcknowledgementSticky : AcknowledgementNormal, timestamp);
570 void ExternalCommandProcessor::RemoveHostAcknowledgement(double, const std::vector<String>& arguments)
572 if (arguments.size() < 1)
573 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
575 Host::Ptr host = Host::GetByName(arguments[0]);
577 Log(LogInformation, "icinga", "Removing acknowledgement for host '" + host->GetName() + "'");
578 Service::Ptr service = host->GetHostCheckService();
580 service->ClearAcknowledgement();
583 void ExternalCommandProcessor::EnableHostgroupSvcChecks(double, const std::vector<String>& arguments)
585 if (arguments.size() < 1)
586 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
588 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
590 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
591 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
592 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
595 ObjectLock olock(service);
597 service->SetEnableActiveChecks(true);
603 void ExternalCommandProcessor::DisableHostgroupSvcChecks(double, const std::vector<String>& arguments)
605 if (arguments.size() < 1)
606 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
608 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
610 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
611 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
612 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
615 ObjectLock olock(service);
617 service->SetEnableActiveChecks(false);
623 void ExternalCommandProcessor::EnableServicegroupSvcChecks(double, const std::vector<String>& arguments)
625 if (arguments.size() < 1)
626 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
628 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
630 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
631 Log(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
634 ObjectLock olock(service);
636 service->SetEnableActiveChecks(true);
641 void ExternalCommandProcessor::DisableServicegroupSvcChecks(double, const std::vector<String>& arguments)
643 if (arguments.size() < 1)
644 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
646 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
648 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
649 Log(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
652 ObjectLock olock(service);
654 service->SetEnableActiveChecks(false);
659 void ExternalCommandProcessor::EnablePassiveHostChecks(double, const std::vector<String>& arguments)
661 if (arguments.size() < 1)
662 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
664 Host::Ptr host = Host::GetByName(arguments[0]);
666 Log(LogInformation, "icinga", "Enabling passive checks for host '" + arguments[0] + "'");
667 Service::Ptr hc = host->GetHostCheckService();
673 ObjectLock olock(hc);
675 hc->SetEnablePassiveChecks(true);
679 void ExternalCommandProcessor::DisablePassiveHostChecks(double, const std::vector<String>& arguments)
681 if (arguments.size() < 1)
682 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 arguments."));
684 Host::Ptr host = Host::GetByName(arguments[0]);
686 Log(LogInformation, "icinga", "Disabling passive checks for host '" + arguments[0] + "'");
687 Service::Ptr hc = host->GetHostCheckService();
693 ObjectLock olock(hc);
695 hc->SetEnablePassiveChecks(false);
699 void ExternalCommandProcessor::EnablePassiveSvcChecks(double, const std::vector<String>& arguments)
701 if (arguments.size() < 2)
702 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
704 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
706 Log(LogInformation, "icinga", "Enabling passive checks for service '" + arguments[1] + "'");
709 ObjectLock olock(service);
711 service->SetEnablePassiveChecks(true);
715 void ExternalCommandProcessor::DisablePassiveSvcChecks(double, const std::vector<String>& arguments)
717 if (arguments.size() < 2)
718 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
720 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
722 Log(LogInformation, "icinga", "Disabling passive checks for service '" + arguments[1] + "'");
725 ObjectLock olock(service);
727 service->SetEnablePassiveChecks(false);
731 void ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks(double, const std::vector<String>& arguments)
733 if (arguments.size() < 1)
734 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
736 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
738 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
739 Log(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
742 ObjectLock olock(service);
744 service->SetEnablePassiveChecks(true);
749 void ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks(double, const std::vector<String>& arguments)
751 if (arguments.size() < 1)
752 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
754 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
756 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
757 Log(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
760 ObjectLock olock(service);
762 service->SetEnablePassiveChecks(true);
767 void ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks(double, const std::vector<String>& arguments)
769 if (arguments.size() < 1)
770 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
772 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
774 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
775 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
776 Log(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
779 ObjectLock olock(service);
781 service->SetEnablePassiveChecks(true);
787 void ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks(double, const std::vector<String>& arguments)
789 if (arguments.size() < 1)
790 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
792 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
794 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
795 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
796 Log(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
799 ObjectLock olock(service);
801 service->SetEnablePassiveChecks(false);
807 void ExternalCommandProcessor::ProcessFile(double, const std::vector<String>& arguments)
809 if (arguments.size() < 2)
810 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
812 String file = arguments[0];
813 bool del = Convert::ToBool(arguments[1]);
816 ifp.exceptions(std::ifstream::badbit);
818 ifp.open(file.CStr(), std::ifstream::in);
822 std::getline(ifp, line);
825 Log(LogInformation, "compat", "Executing external command: " + line);
828 } catch (const std::exception& ex) {
829 std::ostringstream msgbuf;
830 msgbuf << "External command failed: " << boost::diagnostic_information(ex);
831 Log(LogWarning, "icinga", msgbuf.str());
838 (void) unlink(file.CStr());
841 void ExternalCommandProcessor::ScheduleSvcDowntime(double, const std::vector<String>& arguments)
843 if (arguments.size() < 9)
844 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 9 arguments."));
846 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
849 int triggeredByLegacy = Convert::ToLong(arguments[5]);
850 if (triggeredByLegacy != 0)
851 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
853 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
854 (void) service->AddDowntime(arguments[7], arguments[8],
855 Convert::ToDouble(arguments[2]), Convert::ToDouble(arguments[3]),
856 Convert::ToBool(arguments[4]), triggeredBy, Convert::ToDouble(arguments[6]));
859 void ExternalCommandProcessor::DelSvcDowntime(double, const std::vector<String>& arguments)
861 if (arguments.size() < 1)
862 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
864 int id = Convert::ToLong(arguments[0]);
865 Log(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
866 String rid = Service::GetDowntimeIDFromLegacyID(id);
867 Service::RemoveDowntime(rid);
870 void ExternalCommandProcessor::ScheduleHostDowntime(double, const std::vector<String>& arguments)
872 if (arguments.size() < 8)
873 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
875 Host::Ptr host = Host::GetByName(arguments[0]);
878 int triggeredByLegacy = Convert::ToLong(arguments[4]);
879 if (triggeredByLegacy != 0)
880 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
882 Log(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
883 Service::Ptr service = host->GetHostCheckService();
885 (void) service->AddDowntime(arguments[6], arguments[7],
886 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
887 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
891 void ExternalCommandProcessor::DelHostDowntime(double, const std::vector<String>& arguments)
893 if (arguments.size() < 1)
894 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
896 int id = Convert::ToLong(arguments[0]);
897 Log(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
898 String rid = Service::GetDowntimeIDFromLegacyID(id);
899 Service::RemoveDowntime(rid);
902 void ExternalCommandProcessor::ScheduleHostSvcDowntime(double, const std::vector<String>& arguments)
904 if (arguments.size() < 8)
905 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 argument."));
907 Host::Ptr host = Host::GetByName(arguments[0]);
910 int triggeredByLegacy = Convert::ToLong(arguments[4]);
911 if (triggeredByLegacy != 0)
912 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
914 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
915 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
916 (void) service->AddDowntime(arguments[6], arguments[7],
917 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
918 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
922 void ExternalCommandProcessor::ScheduleHostgroupHostDowntime(double, const std::vector<String>& arguments)
924 if (arguments.size() < 8)
925 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
927 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
930 int triggeredByLegacy = Convert::ToLong(arguments[4]);
931 if (triggeredByLegacy != 0)
932 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
934 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
935 Log(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
936 Service::Ptr service = host->GetHostCheckService();
938 (void) service->AddDowntime(arguments[6], arguments[7],
939 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
940 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
945 void ExternalCommandProcessor::ScheduleHostgroupSvcDowntime(double, const std::vector<String>& arguments)
947 if (arguments.size() < 8)
948 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
950 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
953 int triggeredByLegacy = Convert::ToLong(arguments[4]);
954 if (triggeredByLegacy != 0)
955 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
957 /* Note: we can't just directly create downtimes for all the services by iterating
958 * over all hosts in the host group - otherwise we might end up creating multiple
959 * downtimes for some services. */
961 std::set<Service::Ptr> services;
963 BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) {
964 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
965 services.insert(service);
969 BOOST_FOREACH(const Service::Ptr& service, services) {
970 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
971 (void) service->AddDowntime(arguments[6], arguments[7],
972 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
973 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
977 void ExternalCommandProcessor::ScheduleServicegroupHostDowntime(double, const std::vector<String>& arguments)
979 if (arguments.size() < 8)
980 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
982 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
985 int triggeredByLegacy = Convert::ToLong(arguments[4]);
986 if (triggeredByLegacy != 0)
987 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
989 /* Note: we can't just directly create downtimes for all the hosts by iterating
990 * over all services in the service group - otherwise we might end up creating multiple
991 * downtimes for some hosts. */
993 std::set<Service::Ptr> services;
995 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
996 Host::Ptr host = service->GetHost();
997 Service::Ptr hcService = host->GetHostCheckService();
999 services.insert(hcService);
1002 BOOST_FOREACH(const Service::Ptr& service, services) {
1003 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
1004 (void) service->AddDowntime(arguments[6], arguments[7],
1005 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
1006 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
1010 void ExternalCommandProcessor::ScheduleServicegroupSvcDowntime(double, const std::vector<String>& arguments)
1012 if (arguments.size() < 8)
1013 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 8 arguments."));
1015 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
1018 int triggeredByLegacy = Convert::ToLong(arguments[4]);
1019 if (triggeredByLegacy != 0)
1020 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
1022 BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) {
1023 Log(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
1024 (void) service->AddDowntime(arguments[6], arguments[7],
1025 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
1026 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
1030 void ExternalCommandProcessor::AddHostComment(double, const std::vector<String>& arguments)
1032 if (arguments.size() < 4)
1033 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
1035 Host::Ptr host = Host::GetByName(arguments[0]);
1037 Log(LogInformation, "icinga", "Creating comment for host " + host->GetName());
1038 Service::Ptr service = host->GetHostCheckService();
1040 (void) service->AddComment(CommentUser, arguments[2], arguments[3], 0);
1043 void ExternalCommandProcessor::DelHostComment(double, const std::vector<String>& arguments)
1045 if (arguments.size() < 1)
1046 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1048 int id = Convert::ToLong(arguments[0]);
1049 Log(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
1050 String rid = Service::GetCommentIDFromLegacyID(id);
1051 Service::RemoveComment(rid);
1054 void ExternalCommandProcessor::AddSvcComment(double, const std::vector<String>& arguments)
1056 if (arguments.size() < 5)
1057 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 5 arguments."));
1059 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1061 Log(LogInformation, "icinga", "Creating comment for service " + service->GetName());
1062 (void) service->AddComment(CommentUser, arguments[3], arguments[4], 0);
1065 void ExternalCommandProcessor::DelSvcComment(double, const std::vector<String>& arguments)
1067 if (arguments.size() < 1)
1068 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1070 int id = Convert::ToLong(arguments[0]);
1071 Log(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
1073 String rid = Service::GetCommentIDFromLegacyID(id);
1074 Service::RemoveComment(rid);
1077 void ExternalCommandProcessor::DelAllHostComments(double, const std::vector<String>& arguments)
1079 if (arguments.size() < 1)
1080 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1082 Host::Ptr host = Host::GetByName(arguments[0]);
1084 Log(LogInformation, "icinga", "Removing all comments for host " + host->GetName());
1085 Service::Ptr service = host->GetHostCheckService();
1087 service->RemoveAllComments();
1090 void ExternalCommandProcessor::DelAllSvcComments(double, const std::vector<String>& arguments)
1092 if (arguments.size() < 2)
1093 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1095 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1097 Log(LogInformation, "icinga", "Removing all comments for service " + service->GetName());
1098 service->RemoveAllComments();
1101 void ExternalCommandProcessor::SendCustomHostNotification(double, const std::vector<String>& arguments)
1103 if (arguments.size() < 4)
1104 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 4 arguments."));
1106 Host::Ptr host = Host::GetByName(arguments[0]);
1108 Log(LogInformation, "icinga", "Sending custom notification for host " + host->GetName());
1109 Service::Ptr service = host->GetHostCheckService();
1111 service->RequestNotifications(NotificationCustom, service->GetLastCheckResult());
1114 void ExternalCommandProcessor::SendCustomSvcNotification(double, const std::vector<String>& arguments)
1116 if (arguments.size() < 5)
1117 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 5 arguments."));
1119 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1121 Log(LogInformation, "icinga", "Sending custom notification for service " + service->GetName());
1122 service->RequestNotifications(NotificationCustom, service->GetLastCheckResult());
1125 void ExternalCommandProcessor::DelayHostNotification(double, const std::vector<String>& arguments)
1127 if (arguments.size() < 2)
1128 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1130 Host::Ptr host = Host::GetByName(arguments[0]);
1132 Log(LogInformation, "icinga", "Delaying notifications for host " + host->GetName());
1133 Service::Ptr hc = host->GetHostCheckService();
1138 ObjectLock olock(hc);
1140 hc->SetLastNotification(Convert::ToDouble(arguments[1]));
1144 void ExternalCommandProcessor::DelaySvcNotification(double, const std::vector<String>& arguments)
1146 if (arguments.size() < 3)
1147 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
1149 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1151 Log(LogInformation, "icinga", "Delaying notifications for service " + service->GetName());
1154 ObjectLock olock(service);
1156 service->SetLastNotification(Convert::ToDouble(arguments[2]));
1160 void ExternalCommandProcessor::EnableHostNotifications(double, const std::vector<String>& arguments)
1162 if (arguments.size() < 1)
1163 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1165 Host::Ptr host = Host::GetByName(arguments[0]);
1167 Log(LogInformation, "icinga", "Enabling notifications for host '" + arguments[0] + "'");
1168 Service::Ptr hc = host->GetHostCheckService();
1174 ObjectLock olock(hc);
1176 hc->SetEnableNotifications(true);
1180 void ExternalCommandProcessor::DisableHostNotifications(double, const std::vector<String>& arguments)
1182 if (arguments.size() < 1)
1183 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 1 argument."));
1185 Host::Ptr host = Host::GetByName(arguments[0]);
1187 Log(LogInformation, "icinga", "Disabling notifications for host '" + arguments[0] + "'");
1188 Service::Ptr hc = host->GetHostCheckService();
1194 ObjectLock olock(hc);
1196 hc->SetEnableNotifications(false);
1200 void ExternalCommandProcessor::EnableSvcNotifications(double, const std::vector<String>& arguments)
1202 if (arguments.size() < 2)
1203 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1205 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1207 Log(LogInformation, "icinga", "Enabling notifications for service '" + arguments[1] + "'");
1210 ObjectLock olock(service);
1212 service->SetEnableNotifications(true);
1216 void ExternalCommandProcessor::DisableSvcNotifications(double, const std::vector<String>& arguments)
1218 if (arguments.size() < 2)
1219 BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
1221 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
1223 Log(LogInformation, "icinga", "Disabling notifications for service '" + arguments[1] + "'");
1226 ObjectLock olock(service);
1228 service->SetEnableNotifications(false);