]> granicus.if.org Git - icinga2/commitdiff
Add SCHEDULE_AND_PROPAGATE{,_TRIGGERED}_HOST_DOWNTIME external commands
authorMichael Friedrich <michael.friedrich@netways.de>
Thu, 21 Jul 2016 15:01:49 +0000 (17:01 +0200)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 2 Nov 2016 07:54:32 +0000 (08:54 +0100)
refs #10896
refs #10897

doc/22-migrating-from-icinga-1x.md
doc/23-appendix.md
lib/icinga/externalcommandprocessor.cpp
lib/icinga/externalcommandprocessor.hpp

index 36f889af9be2dd1f3f712c3788c52c9a0c045a6d..6716f5addba3dc0a72ab73c5fbc5d6f50a4836b1 100644 (file)
@@ -1137,8 +1137,6 @@ The following external commands are not supported:
     ENABLE_SERVICE_FRESHNESS_CHECKS
     READ_STATE_INFORMATION
     SAVE_STATE_INFORMATION
-    SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME
-    SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME
     SET_HOST_NOTIFICATION_NUMBER
     SET_SVC_NOTIFICATION_NUMBER
     START_ACCEPTING_PASSIVE_HOST_CHECKS
index 2286fb85468e5e48bc3ca980ade3fce164780228..6a0e61b69802a16322ceaed4a36b0cfbf403cd55 100644 (file)
@@ -47,6 +47,8 @@ Additional details can be found in the [Icinga 1.x Documentation](http://docs.ic
   PROCESS_FILE                              | ;&lt;file_name&gt;;&lt;delete&gt; (2)  | -
   SCHEDULE_SVC_DOWNTIME                     | ;&lt;host_name&gt;;&lt;service_name&gt;;&lt;start_time&gt;;&lt;end_time&gt;;&lt;fixed&gt;;&lt;trigger_id&gt;;&lt;duration&gt;;&lt;author&gt;;&lt;comment&gt; (9)  | -
   DEL_SVC_DOWNTIME                          | ;&lt;downtime_id&gt; (1)   | -
+  SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME      | ;&lt;host_name&gt;;&lt;start_time&gt;;&lt;end_time&gt;;&lt;fixed&gt;;&lt;trigger_id&gt;;&lt;duration&gt;;&lt;author&gt;;&lt;comment&gt; (8)  | -
+  SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME | ;&lt;host_name&gt;;&lt;start_time&gt;;&lt;end_time&gt;;&lt;fixed&gt;;&lt;trigger_id&gt;;&lt;duration&gt;;&lt;author&gt;;&lt;comment&gt; (8)  | -
   SCHEDULE_HOST_DOWNTIME                    | ;&lt;host_name&gt;;&lt;start_time&gt;;&lt;end_time&gt;;&lt;fixed&gt;;&lt;trigger_id&gt;;&lt;duration&gt;;&lt;author&gt;;&lt;comment&gt; (8)  | -
   DEL_HOST_DOWNTIME                         | ;&lt;downtime_id&gt; (1)  | -
   DEL_DOWNTIME_BY_HOST_NAME                 | ;&lt;host_name&gt;[;&lt;service_name;&gt;[;&lt;start_time;&gt;[;&lt;comment_text;&gt;]]] (1)  | -
index 9a67c0bdbb5bddc25139eff910f3ba9ba569e15e..68b24b0183069a74afbd262ad5bc3d54cc826b0f 100644 (file)
@@ -193,6 +193,8 @@ void ExternalCommandProcessor::StaticInitialize(void)
        RegisterCommand("SCHEDULE_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleSvcDowntime, 9);
        RegisterCommand("DEL_SVC_DOWNTIME", &ExternalCommandProcessor::DelSvcDowntime, 1);
        RegisterCommand("SCHEDULE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleHostDowntime, 8);
+       RegisterCommand("SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleAndPropagateHostDowntime, 8);
+       RegisterCommand("SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME", &ExternalCommandProcessor::ScheduleAndPropagateTriggeredHostDowntime, 8);
        RegisterCommand("DEL_HOST_DOWNTIME", &ExternalCommandProcessor::DelHostDowntime, 1);
        RegisterCommand("DEL_DOWNTIME_BY_HOST_NAME", &ExternalCommandProcessor::DelDowntimeByHostName, 1, 4);
        RegisterCommand("SCHEDULE_HOST_SVC_DOWNTIME", &ExternalCommandProcessor::ScheduleHostSvcDowntime, 8);
@@ -1001,6 +1003,78 @@ void ExternalCommandProcessor::ScheduleHostDowntime(double, const std::vector<St
            Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));
 }
 
+void ExternalCommandProcessor::ScheduleAndPropagateHostDowntime(double, const std::vector<String>& arguments)
+{
+       Host::Ptr host = Host::GetByName(arguments[0]);
+
+       if (!host)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot schedule and propagate host downtime for non-existent host '" + arguments[0] + "'"));
+
+       String triggeredBy;
+       int triggeredByLegacy = Convert::ToLong(arguments[4]);
+       int is_fixed = Convert::ToLong(arguments[3]);
+       if (triggeredByLegacy != 0)
+               triggeredBy = Downtime::GetDowntimeIDFromLegacyID(triggeredByLegacy);
+
+       Log(LogNotice, "ExternalCommandProcessor")
+           << "Creating downtime for host " << host->GetName();
+
+       (void) Downtime::AddDowntime(host, arguments[6], arguments[7],
+           Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
+           Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));
+
+       /* Schedule downtime for all child hosts */
+       BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) {
+               Host::Ptr host;
+               Service::Ptr service;
+               tie(host, service) = GetHostService(child);
+
+               /* ignore all service children */
+               if (service)
+                       continue;
+
+               (void) Downtime::AddDowntime(child, arguments[6], arguments[7],
+                   Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
+                   Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));
+       }
+}
+
+void ExternalCommandProcessor::ScheduleAndPropagateTriggeredHostDowntime(double, const std::vector<String>& arguments)
+{
+       Host::Ptr host = Host::GetByName(arguments[0]);
+
+       if (!host)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot schedule and propagate triggered host downtime for non-existent host '" + arguments[0] + "'"));
+
+       String triggeredBy;
+       int triggeredByLegacy = Convert::ToLong(arguments[4]);
+       int is_fixed = Convert::ToLong(arguments[3]);
+       if (triggeredByLegacy != 0)
+               triggeredBy = Downtime::GetDowntimeIDFromLegacyID(triggeredByLegacy);
+
+       Log(LogNotice, "ExternalCommandProcessor")
+           << "Creating downtime for host " << host->GetName();
+
+       String parentDowntime = Downtime::AddDowntime(host, arguments[6], arguments[7],
+           Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
+           Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5]));
+
+       /* Schedule downtime for all child hosts and explicitely trigger them through the parent host's downtime */
+       BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) {
+               Host::Ptr host;
+               Service::Ptr service;
+               tie(host, service) = GetHostService(child);
+
+               /* ignore all service children */
+               if (service)
+                       continue;
+
+               (void) Downtime::AddDowntime(child, arguments[6], arguments[7],
+                   Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]),
+                   Convert::ToBool(is_fixed), parentDowntime, Convert::ToDouble(arguments[5]));
+       }
+}
+
 void ExternalCommandProcessor::DelHostDowntime(double, const std::vector<String>& arguments)
 {
        int id = Convert::ToLong(arguments[0]);
index 059653295003c0e245ba92a6bad53e33dbf3d48f..8dcdbfb13125c9c2c6a5b0153812465a40773877 100644 (file)
@@ -82,6 +82,8 @@ private:
        static void ScheduleSvcDowntime(double time, const std::vector<String>& arguments);
        static void DelSvcDowntime(double time, const std::vector<String>& arguments);
        static void ScheduleHostDowntime(double time, const std::vector<String>& arguments);
+       static void ScheduleAndPropagateHostDowntime(double, const std::vector<String>& arguments);
+       static void ScheduleAndPropagateTriggeredHostDowntime(double, const std::vector<String>& arguments);
        static void DelHostDowntime(double time, const std::vector<String>& arguments);
        static void DelDowntimeByHostName(double, const std::vector<String>& arguments);
        static void ScheduleHostSvcDowntime(double time, const std::vector<String>& arguments);