1 /******************************************************************************
3 * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
5 * This program is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU General Public License *
7 * as published by the Free Software Foundation; either version 2 *
8 * of the License, or (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software Foundation *
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ******************************************************************************/
20 #include "i2-icinga.h"
22 using namespace icinga;
24 boost::once_flag ExternalCommandProcessor::m_InitializeOnce = BOOST_ONCE_INIT;
25 boost::mutex ExternalCommandProcessor::m_Mutex;
26 map<String, ExternalCommandProcessor::Callback> ExternalCommandProcessor::m_Commands;
29 * @threadsafety Always.
31 void ExternalCommandProcessor::Execute(const String& line)
37 BOOST_THROW_EXCEPTION(invalid_argument("Missing timestamp in command: " + line));
39 size_t pos = line.FindFirstOf("]");
41 if (pos == String::NPos)
42 BOOST_THROW_EXCEPTION(invalid_argument("Missing timestamp in command: " + line));
44 String timestamp = line.SubStr(1, pos - 1);
45 String args = line.SubStr(pos + 2, String::NPos);
47 double ts = Convert::ToDouble(timestamp);
50 BOOST_THROW_EXCEPTION(invalid_argument("Invalid timestamp in command: " + line));
52 vector<String> argv = args.Split(is_any_of(";"));
55 BOOST_THROW_EXCEPTION(invalid_argument("Missing arguments in command: " + line));
57 vector<String> argvExtra(argv.begin() + 1, argv.end());
58 Execute(ts, argv[0], argvExtra);
62 * @threadsafety Always.
64 void ExternalCommandProcessor::Execute(double time, const String& command, const vector<String>& arguments)
66 boost::call_once(m_InitializeOnce, &ExternalCommandProcessor::Initialize);
71 boost::mutex::scoped_lock lock(m_Mutex);
73 map<String, ExternalCommandProcessor::Callback>::iterator it;
74 it = m_Commands.find(command);
76 if (it == m_Commands.end())
77 BOOST_THROW_EXCEPTION(invalid_argument("The external command '" + command + "' does not exist."));
79 callback = it->second;
82 callback(time, arguments);
86 * @threadsafety Always.
88 void ExternalCommandProcessor::Initialize(void)
90 RegisterCommand("PROCESS_SERVICE_CHECK_RESULT", &ExternalCommandProcessor::ProcessServiceCheckResult);
91 RegisterCommand("SCHEDULE_SVC_CHECK", &ExternalCommandProcessor::ScheduleSvcCheck);
92 RegisterCommand("SCHEDULE_FORCED_SVC_CHECK", &ExternalCommandProcessor::ScheduleForcedSvcCheck);
93 RegisterCommand("ENABLE_SVC_CHECK", &ExternalCommandProcessor::EnableSvcCheck);
94 RegisterCommand("DISABLE_SVC_CHECK", &ExternalCommandProcessor::DisableSvcCheck);
95 RegisterCommand("SHUTDOWN_PROCESS", &ExternalCommandProcessor::ShutdownProcess);
96 RegisterCommand("SCHEDULE_FORCED_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleForcedHostSvcChecks);
97 RegisterCommand("SCHEDULE_HOST_SVC_CHECKS", &ExternalCommandProcessor::ScheduleHostSvcChecks);
98 RegisterCommand("ENABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::EnableHostSvcChecks);
99 RegisterCommand("DISABLE_HOST_SVC_CHECKS", &ExternalCommandProcessor::DisableHostSvcChecks);
100 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM", &ExternalCommandProcessor::AcknowledgeSvcProblem);
101 RegisterCommand("ACKNOWLEDGE_SVC_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeSvcProblemExpire);
102 RegisterCommand("REMOVE_SVC_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
103 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM", &ExternalCommandProcessor::AcknowledgeHostProblem);
104 RegisterCommand("ACKNOWLEDGE_HOST_PROBLEM_EXPIRE", &ExternalCommandProcessor::AcknowledgeHostProblemExpire);
105 RegisterCommand("REMOVE_HOST_ACKNOWLEDGEMENT", &ExternalCommandProcessor::RemoveHostAcknowledgement);
106 RegisterCommand("ENABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupSvcChecks);
107 RegisterCommand("DISABLE_HOSTGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupSvcChecks);
108 RegisterCommand("ENABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupSvcChecks);
109 RegisterCommand("DISABLE_SERVICEGROUP_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupSvcChecks);
110 RegisterCommand("ENABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnablePassiveSvcChecks);
111 RegisterCommand("DISABLE_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisablePassiveSvcChecks);
112 RegisterCommand("ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks);
113 RegisterCommand("DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks);
114 RegisterCommand("ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks);
115 RegisterCommand("DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS", &ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks);
116 RegisterCommand("PROCESS_FILE", &ExternalCommandProcessor::ProcessFile);
117 RegisterCommand("SCHEDULE_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleSvcDowntime);
118 RegisterCommand("DEL_SVC_DOWNTIME", &ExternalCommandProcessor::DelSvcDowntime);
119 RegisterCommand("SCHEDULE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostDowntime);
120 RegisterCommand("DEL_HOST_DOWNTIME", &ExternalCommandProcessor::DelHostDowntime);
121 RegisterCommand("SCHEDULE_HOST_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostSvcDowntime);
122 RegisterCommand("SCHEDULE_HOSTGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupHostDowntime);
123 RegisterCommand("SCHEDULE_HOSTGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostgroupSvcDowntime);
124 RegisterCommand("SCHEDULE_SERVICEGROUP_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupHostDowntime);
125 RegisterCommand("SCHEDULE_SERVICEGROUP_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleServicegroupSvcDowntime);
126 RegisterCommand("ADD_HOST_COMMENT", &ExternalCommandProcessor::AddHostComment);
127 RegisterCommand("DEL_HOST_COMMENT", &ExternalCommandProcessor::DelHostComment);
128 RegisterCommand("ADD_SVC_COMMENT", &ExternalCommandProcessor::AddSvcComment);
129 RegisterCommand("DEL_SVC_COMMENT", &ExternalCommandProcessor::DelSvcComment);
130 RegisterCommand("DEL_ALL_HOST_COMMENTS", &ExternalCommandProcessor::DelAllHostComments);
131 RegisterCommand("DEL_ALL_SVC_COMMENTS", &ExternalCommandProcessor::DelAllSvcComments);
132 RegisterCommand("SEND_CUSTOM_HOST_NOTIFICATION", &ExternalCommandProcessor::SendCustomHostNotification);
133 RegisterCommand("SEND_CUSTOM_SVC_NOTIFICATION", &ExternalCommandProcessor::SendCustomSvcNotification);
137 * @threadsafety Always.
139 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
141 boost::mutex::scoped_lock lock(m_Mutex);
142 m_Commands[command] = callback;
145 void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const vector<String>& arguments)
147 if (arguments.size() < 4)
148 BOOST_THROW_EXCEPTION(invalid_argument("Expected 4 arguments."));
150 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
152 if (!service->GetEnablePassiveChecks())
153 BOOST_THROW_EXCEPTION(invalid_argument("Got passive check result for service '" + arguments[1] + "' which has passive checks disabled."));
155 int exitStatus = Convert::ToDouble(arguments[2]);
156 Dictionary::Ptr result = PluginCheckTask::ParseCheckOutput(arguments[3]);
157 result->Set("state", PluginCheckTask::ExitStatusToState(exitStatus));
159 result->Set("schedule_start", time);
160 result->Set("schedule_end", time);
161 result->Set("execution_start", time);
162 result->Set("execution_end", time);
163 result->Set("active", 0);
165 Logger::Write(LogInformation, "icinga", "Processing passive check result for service '" + arguments[1] + "'");
166 service->ProcessCheckResult(result);
168 /* Reschedule the next check. The side effect of this is that for as long
169 * as we receive passive results for a service we won't execute any
171 service->SetNextCheck(Utility::GetTime() + service->GetCheckInterval());
174 void ExternalCommandProcessor::ScheduleSvcCheck(double, const vector<String>& arguments)
176 if (arguments.size() < 3)
177 BOOST_THROW_EXCEPTION(invalid_argument("Expected 3 arguments."));
179 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
181 double planned_check = Convert::ToDouble(arguments[2]);
183 if (planned_check > service->GetNextCheck()) {
184 Logger::Write(LogInformation, "icinga", "Ignoring reschedule request for service '" +
185 arguments[1] + "' (next check is already sooner than requested check time)");
189 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
190 service->SetNextCheck(planned_check);
193 void ExternalCommandProcessor::ScheduleForcedSvcCheck(double, const vector<String>& arguments)
195 if (arguments.size() < 3)
196 BOOST_THROW_EXCEPTION(invalid_argument("Expected 3 arguments."));
198 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
200 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + arguments[1] + "'");
201 service->SetForceNextCheck(true);
202 service->SetNextCheck(Convert::ToDouble(arguments[2]));
205 void ExternalCommandProcessor::EnableSvcCheck(double, const vector<String>& arguments)
207 if (arguments.size() < 2)
208 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
210 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
212 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + arguments[1] + "'");
213 service->SetEnableActiveChecks(true);
216 void ExternalCommandProcessor::DisableSvcCheck(double, const vector<String>& arguments)
218 if (arguments.size() < 2)
219 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
221 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
223 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + arguments[1] + "'");
224 service->SetEnableActiveChecks(false);
227 void ExternalCommandProcessor::ShutdownProcess(double, const vector<String>&)
229 Logger::Write(LogInformation, "icinga", "Shutting down Icinga via external command.");
230 Application::RequestShutdown();
233 void ExternalCommandProcessor::ScheduleForcedHostSvcChecks(double, const vector<String>& arguments)
235 if (arguments.size() < 2)
236 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
238 double planned_check = Convert::ToDouble(arguments[1]);
240 Host::Ptr host = Host::GetByName(arguments[0]);
242 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
243 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
244 service->SetNextCheck(planned_check);
245 service->SetForceNextCheck(true);
249 void ExternalCommandProcessor::ScheduleHostSvcChecks(double, const vector<String>& arguments)
251 if (arguments.size() < 2)
252 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
254 double planned_check = Convert::ToDouble(arguments[1]);
256 Host::Ptr host = Host::GetByName(arguments[0]);
258 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
259 if (planned_check > service->GetNextCheck()) {
260 Logger::Write(LogInformation, "icinga", "Ignoring reschedule request for service '" +
261 service->GetName() + "' (next check is already sooner than requested check time)");
265 Logger::Write(LogInformation, "icinga", "Rescheduling next check for service '" + service->GetName() + "'");
266 service->SetNextCheck(planned_check);
270 void ExternalCommandProcessor::EnableHostSvcChecks(double, const vector<String>& arguments)
272 if (arguments.size() < 1)
273 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
275 Host::Ptr host = Host::GetByName(arguments[0]);
277 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
278 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
279 service->SetEnableActiveChecks(true);
283 void ExternalCommandProcessor::DisableHostSvcChecks(double, const vector<String>& arguments)
285 if (arguments.size() < 1)
286 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 arguments."));
288 Host::Ptr host = Host::GetByName(arguments[0]);
290 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
291 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
292 service->SetEnableActiveChecks(false);
296 void ExternalCommandProcessor::AcknowledgeSvcProblem(double, const vector<String>& arguments)
298 if (arguments.size() < 7)
299 BOOST_THROW_EXCEPTION(invalid_argument("Expected 7 arguments."));
301 bool sticky = Convert::ToBool(arguments[2]);
303 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
305 if (service->GetState() == StateOK)
306 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' is OK."));
308 Logger::Write(LogInformation, "icinga", "Setting acknowledgement for service '" + service->GetName() + "'");
309 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
310 service->SetAcknowledgementExpiry(0);
313 void ExternalCommandProcessor::AcknowledgeSvcProblemExpire(double, const vector<String>& arguments)
315 if (arguments.size() < 8)
316 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
318 bool sticky = Convert::ToBool(arguments[2]);
319 double timestamp = Convert::ToDouble(arguments[5]);
321 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
323 if (service->GetState() == StateOK)
324 BOOST_THROW_EXCEPTION(invalid_argument("The service '" + arguments[1] + "' is OK."));
326 Logger::Write(LogInformation, "icinga", "Setting timed acknowledgement for service '" + service->GetName() + "'");
327 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
328 service->SetAcknowledgementExpiry(timestamp);
331 void ExternalCommandProcessor::RemoveSvcAcknowledgement(double, const vector<String>& arguments)
333 if (arguments.size() < 2)
334 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
336 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
338 Logger::Write(LogInformation, "icinga", "Removing acknowledgement for service '" + service->GetName() + "'");
339 service->SetAcknowledgement(AcknowledgementNone);
340 service->SetAcknowledgementExpiry(0);
343 void ExternalCommandProcessor::AcknowledgeHostProblem(double, const vector<String>& arguments)
345 if (arguments.size() < 6)
346 BOOST_THROW_EXCEPTION(invalid_argument("Expected 6 arguments."));
348 bool sticky = Convert::ToBool(arguments[1]);
350 Host::Ptr host = Host::GetByName(arguments[0]);
352 Logger::Write(LogInformation, "icinga", "Setting acknowledgement for host '" + host->GetName() + "'");
353 Service::Ptr service = host->GetHostCheckService();
355 if (service->GetState() == StateOK)
356 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' is OK."));
358 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
359 service->SetAcknowledgementExpiry(0);
363 void ExternalCommandProcessor::AcknowledgeHostProblemExpire(double, const vector<String>& arguments)
365 if (arguments.size() < 7)
366 BOOST_THROW_EXCEPTION(invalid_argument("Expected 7 arguments."));
368 bool sticky = Convert::ToBool(arguments[1]);
369 double timestamp = Convert::ToDouble(arguments[4]);
371 Host::Ptr host = Host::GetByName(arguments[0]);
373 Logger::Write(LogInformation, "icinga", "Setting timed acknowledgement for host '" + host->GetName() + "'");
374 Service::Ptr service = host->GetHostCheckService();
376 if (service->GetState() == StateOK)
377 BOOST_THROW_EXCEPTION(invalid_argument("The host '" + arguments[0] + "' is OK."));
379 service->SetAcknowledgement(sticky ? AcknowledgementSticky : AcknowledgementNormal);
380 service->SetAcknowledgementExpiry(timestamp);
384 void ExternalCommandProcessor::RemoveHostAcknowledgement(double, const vector<String>& arguments)
386 if (arguments.size() < 1)
387 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
389 Host::Ptr host = Host::GetByName(arguments[0]);
391 Logger::Write(LogInformation, "icinga", "Removing acknowledgement for host '" + host->GetName() + "'");
392 Service::Ptr service = host->GetHostCheckService();
394 service->SetAcknowledgement(AcknowledgementNone);
395 service->SetAcknowledgementExpiry(0);
399 void ExternalCommandProcessor::EnableHostgroupSvcChecks(double, const vector<String>& arguments)
401 if (arguments.size() < 1)
402 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
404 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
406 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
407 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
408 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
409 service->SetEnableActiveChecks(true);
414 void ExternalCommandProcessor::DisableHostgroupSvcChecks(double, const vector<String>& arguments)
416 if (arguments.size() < 1)
417 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
419 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
421 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
422 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
423 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
424 service->SetEnableActiveChecks(false);
429 void ExternalCommandProcessor::EnableServicegroupSvcChecks(double, const vector<String>& arguments)
431 if (arguments.size() < 1)
432 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
434 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
436 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
437 Logger::Write(LogInformation, "icinga", "Enabling active checks for service '" + service->GetName() + "'");
438 service->SetEnableActiveChecks(true);
442 void ExternalCommandProcessor::DisableServicegroupSvcChecks(double, const vector<String>& arguments)
444 if (arguments.size() < 1)
445 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
447 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
449 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
450 Logger::Write(LogInformation, "icinga", "Disabling active checks for service '" + service->GetName() + "'");
451 service->SetEnableActiveChecks(false);
455 void ExternalCommandProcessor::EnablePassiveSvcChecks(double, const vector<String>& arguments)
457 if (arguments.size() < 2)
458 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
460 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
462 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + arguments[1] + "'");
463 service->SetEnablePassiveChecks(true);
466 void ExternalCommandProcessor::DisablePassiveSvcChecks(double, const vector<String>& arguments)
468 if (arguments.size() < 2)
469 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
471 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
473 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + arguments[1] + "'");
474 service->SetEnablePassiveChecks(false);
477 void ExternalCommandProcessor::EnableServicegroupPassiveSvcChecks(double, const vector<String>& arguments)
479 if (arguments.size() < 1)
480 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
482 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
484 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
485 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
486 service->SetEnablePassiveChecks(true);
490 void ExternalCommandProcessor::DisableServicegroupPassiveSvcChecks(double, const vector<String>& arguments)
492 if (arguments.size() < 1)
493 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
495 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
497 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
498 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
499 service->SetEnablePassiveChecks(true);
503 void ExternalCommandProcessor::EnableHostgroupPassiveSvcChecks(double, const vector<String>& arguments)
505 if (arguments.size() < 1)
506 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
508 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
510 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
511 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
512 Logger::Write(LogInformation, "icinga", "Enabling passive checks for service '" + service->GetName() + "'");
513 service->SetEnablePassiveChecks(true);
518 void ExternalCommandProcessor::DisableHostgroupPassiveSvcChecks(double, const vector<String>& arguments)
520 if (arguments.size() < 1)
521 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
523 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
525 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
526 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
527 Logger::Write(LogInformation, "icinga", "Disabling passive checks for service '" + service->GetName() + "'");
528 service->SetEnablePassiveChecks(false);
533 void ExternalCommandProcessor::ProcessFile(double, const vector<String>& arguments)
535 if (arguments.size() < 2)
536 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
538 String file = arguments[0];
539 bool del = Convert::ToBool(arguments[1]);
542 ifp.exceptions(ifstream::badbit);
544 ifp.open(file.CStr(), ifstream::in);
548 std::getline(ifp, line);
551 Logger::Write(LogInformation, "compat", "Executing external command: " + line);
554 } catch (const exception& ex) {
556 msgbuf << "External command failed: " << diagnostic_information(ex);
557 Logger::Write(LogWarning, "icinga", msgbuf.str());
564 (void) unlink(file.CStr());
567 void ExternalCommandProcessor::ScheduleSvcDowntime(double, const vector<String>& arguments)
569 if (arguments.size() < 9)
570 BOOST_THROW_EXCEPTION(invalid_argument("Expected 9 arguments."));
572 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
575 int triggeredByLegacy = Convert::ToLong(arguments[5]);
576 if (triggeredByLegacy != 0)
577 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
579 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
580 (void) service->AddDowntime(arguments[7], arguments[8],
581 Convert::ToDouble(arguments[2]), Convert::ToDouble(arguments[3]),
582 Convert::ToBool(arguments[4]), triggeredBy, Convert::ToDouble(arguments[6]));
585 void ExternalCommandProcessor::DelSvcDowntime(double, const vector<String>& arguments)
587 if (arguments.size() < 1)
588 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
590 int id = Convert::ToLong(arguments[0]);
591 Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
592 String rid = Service::GetDowntimeIDFromLegacyID(id);
593 Service::RemoveDowntime(rid);
596 void ExternalCommandProcessor::ScheduleHostDowntime(double, const vector<String>& arguments)
598 if (arguments.size() < 8)
599 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
601 Host::Ptr host = Host::GetByName(arguments[0]);
604 int triggeredByLegacy = Convert::ToLong(arguments[4]);
605 if (triggeredByLegacy != 0)
606 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
608 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
609 Service::Ptr service = host->GetHostCheckService();
611 (void) service->AddDowntime(arguments[6], arguments[7],
612 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
613 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
617 void ExternalCommandProcessor::DelHostDowntime(double, const vector<String>& arguments)
619 if (arguments.size() < 1)
620 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
622 int id = Convert::ToLong(arguments[0]);
623 Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]);
624 String rid = Service::GetDowntimeIDFromLegacyID(id);
625 Service::RemoveDowntime(rid);
628 void ExternalCommandProcessor::ScheduleHostSvcDowntime(double, const vector<String>& arguments)
630 if (arguments.size() < 8)
631 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 argument."));
633 Host::Ptr host = Host::GetByName(arguments[0]);
636 int triggeredByLegacy = Convert::ToLong(arguments[4]);
637 if (triggeredByLegacy != 0)
638 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
640 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
641 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
642 (void) service->AddDowntime(arguments[6], arguments[7],
643 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
644 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
648 void ExternalCommandProcessor::ScheduleHostgroupHostDowntime(double, const vector<String>& arguments)
650 if (arguments.size() < 8)
651 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
653 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
656 int triggeredByLegacy = Convert::ToLong(arguments[4]);
657 if (triggeredByLegacy != 0)
658 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
660 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
661 Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName());
662 Service::Ptr service = host->GetHostCheckService();
664 (void) service->AddDowntime(arguments[6], arguments[7],
665 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
666 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
671 void ExternalCommandProcessor::ScheduleHostgroupSvcDowntime(double, const vector<String>& arguments)
673 if (arguments.size() < 8)
674 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
676 HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]);
679 int triggeredByLegacy = Convert::ToLong(arguments[4]);
680 if (triggeredByLegacy != 0)
681 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
683 /* Note: we can't just directly create downtimes for all the services by iterating
684 * over all hosts in the host group - otherwise we might end up creating multiple
685 * downtimes for some services. */
687 set<Service::Ptr> services;
689 BOOST_FOREACH(const Host::Ptr& host, HostGroup::GetMembers(hg)) {
690 BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) {
691 services.insert(service);
695 BOOST_FOREACH(const Service::Ptr& service, services) {
696 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
697 (void) service->AddDowntime(arguments[6], arguments[7],
698 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
699 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
703 void ExternalCommandProcessor::ScheduleServicegroupHostDowntime(double, const vector<String>& arguments)
705 if (arguments.size() < 8)
706 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
708 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
711 int triggeredByLegacy = Convert::ToLong(arguments[4]);
712 if (triggeredByLegacy != 0)
713 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
715 /* Note: we can't just directly create downtimes for all the hosts by iterating
716 * over all services in the service group - otherwise we might end up creating multiple
717 * downtimes for some hosts. */
719 set<Service::Ptr> services;
721 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
722 Host::Ptr host = service->GetHost();
723 Service::Ptr hcService = host->GetHostCheckService();
725 services.insert(hcService);
728 BOOST_FOREACH(const Service::Ptr& service, services) {
729 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
730 (void) service->AddDowntime(arguments[6], arguments[7],
731 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
732 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
736 void ExternalCommandProcessor::ScheduleServicegroupSvcDowntime(double, const vector<String>& arguments)
738 if (arguments.size() < 8)
739 BOOST_THROW_EXCEPTION(invalid_argument("Expected 8 arguments."));
741 ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]);
744 int triggeredByLegacy = Convert::ToLong(arguments[4]);
745 if (triggeredByLegacy != 0)
746 triggeredBy = Service::GetDowntimeIDFromLegacyID(triggeredByLegacy);
748 BOOST_FOREACH(const Service::Ptr& service, ServiceGroup::GetMembers(sg)) {
749 Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName());
750 (void) service->AddDowntime(arguments[6], arguments[7],
751 Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
752 Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5]));
756 void ExternalCommandProcessor::AddHostComment(double, const vector<String>& arguments)
758 if (arguments.size() < 4)
759 BOOST_THROW_EXCEPTION(invalid_argument("Expected 4 arguments."));
761 Host::Ptr host = Host::GetByName(arguments[0]);
763 Logger::Write(LogInformation, "icinga", "Creating comment for host " + host->GetName());
764 Service::Ptr service = host->GetHostCheckService();
766 (void) service->AddComment(CommentUser, arguments[2], arguments[3], 0);
769 void ExternalCommandProcessor::DelHostComment(double, const vector<String>& arguments)
771 if (arguments.size() < 1)
772 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
774 int id = Convert::ToLong(arguments[0]);
775 Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
776 String rid = Service::GetCommentIDFromLegacyID(id);
777 Service::RemoveComment(rid);
780 void ExternalCommandProcessor::AddSvcComment(double, const vector<String>& arguments)
782 if (arguments.size() < 5)
783 BOOST_THROW_EXCEPTION(invalid_argument("Expected 5 arguments."));
785 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
787 Logger::Write(LogInformation, "icinga", "Creating comment for service " + service->GetName());
788 (void) service->AddComment(CommentUser, arguments[3], arguments[4], 0);
791 void ExternalCommandProcessor::DelSvcComment(double, const vector<String>& arguments)
793 if (arguments.size() < 1)
794 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
796 int id = Convert::ToLong(arguments[0]);
797 Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]);
799 String rid = Service::GetCommentIDFromLegacyID(id);
800 Service::RemoveComment(rid);
803 void ExternalCommandProcessor::DelAllHostComments(double, const vector<String>& arguments)
805 if (arguments.size() < 1)
806 BOOST_THROW_EXCEPTION(invalid_argument("Expected 1 argument."));
808 Host::Ptr host = Host::GetByName(arguments[0]);
810 Logger::Write(LogInformation, "icinga", "Removing all comments for host " + host->GetName());
811 Service::Ptr service = host->GetHostCheckService();
813 service->RemoveAllComments();
816 void ExternalCommandProcessor::DelAllSvcComments(double, const vector<String>& arguments)
818 if (arguments.size() < 2)
819 BOOST_THROW_EXCEPTION(invalid_argument("Expected 2 arguments."));
821 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
823 Logger::Write(LogInformation, "icinga", "Removing all comments for service " + service->GetName());
824 service->RemoveAllComments();
827 void ExternalCommandProcessor::SendCustomHostNotification(double time, const vector<String>& arguments)
829 if (arguments.size() < 4)
830 BOOST_THROW_EXCEPTION(invalid_argument("Expected 4 arguments."));
832 Host::Ptr host = Host::GetByName(arguments[0]);
834 Logger::Write(LogInformation, "icinga", "Sending custom notification for host " + host->GetName());
835 Service::Ptr service = host->GetHostCheckService();
837 service->RequestNotifications(NotificationCustom);
841 void ExternalCommandProcessor::SendCustomSvcNotification(double time, const vector<String>& arguments)
843 if (arguments.size() < 5)
844 BOOST_THROW_EXCEPTION(invalid_argument("Expected 5 arguments."));
846 Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
848 Logger::Write(LogInformation, "icinga", "Sending custom notification for service " + service->GetName());
849 service->RequestNotifications(NotificationCustom);