]> granicus.if.org Git - icinga2/commitdiff
Implement override_event_command.
authorGunnar Beutner <gunnar.beutner@netways.de>
Tue, 26 Nov 2013 11:31:17 +0000 (12:31 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 26 Nov 2013 11:44:49 +0000 (12:44 +0100)
Refs #4746

lib/icinga/externalcommandprocessor.cpp
lib/icinga/externalcommandprocessor.h
lib/icinga/service-event.cpp
lib/icinga/service.cpp
lib/icinga/service.h
lib/icinga/service.ti

index f0e9d1f6cffa7f8a161ac5fca3737a60741371d8..8a793420afacb88f5963290ba55769b957ea45ff 100644 (file)
@@ -25,6 +25,7 @@
 #include "icinga/servicegroup.h"
 #include "icinga/pluginutility.h"
 #include "icinga/icingaapplication.h"
+#include "icinga/eventcommand.h"
 #include "base/convert.h"
 #include "base/logger_fwd.h"
 #include "base/objectlock.h"
@@ -190,6 +191,8 @@ void ExternalCommandProcessor::Initialize(void)
        RegisterCommand("DISABLE_HOST_EVENT_HANDLER", &ExternalCommandProcessor::DisableHostEventHandler);
        RegisterCommand("ENABLE_SVC_EVENT_HANDLER", &ExternalCommandProcessor::EnableSvcEventHandler);
        RegisterCommand("DISABLE_SVC_EVENT_HANDLER", &ExternalCommandProcessor::DisableSvcEventHandler);
+       RegisterCommand("CHANGE_HOST_EVENT_HANDLER", &ExternalCommandProcessor::ChangeHostEventHandler);
+       RegisterCommand("CHANGE_SVC_EVENT_HANDLER", &ExternalCommandProcessor::ChangeSvcEventHandler);
 }
 
 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
@@ -1987,7 +1990,7 @@ void ExternalCommandProcessor::EnableSvcEventHandler(double time, const std::vec
        Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
 
        if (!service)
-               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot enable event handlerfor non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot enable event handler for non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
 
        Log(LogInformation, "icinga", "Enabling event handler for service '" + arguments[1] + "'");
 
@@ -2006,7 +2009,7 @@ void ExternalCommandProcessor::DisableSvcEventHandler(double time, const std::ve
        Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
 
        if (!service)
-               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot disable event handlerfor non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot disable event handler for non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
 
        Log(LogInformation, "icinga", "Disabling event handler for service '" + arguments[1] + "'");
 
@@ -2016,3 +2019,53 @@ void ExternalCommandProcessor::DisableSvcEventHandler(double time, const std::ve
                service->SetEnableEventHandler(false);
        }
 }
+
+void ExternalCommandProcessor::ChangeHostEventHandler(double time, const std::vector<String>& arguments)
+{
+       if (arguments.size() < 2)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 2 arguments."));
+
+       Host::Ptr host = Host::GetByName(arguments[0]);
+
+       if (!host)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot change event handler for non-existent host '" + arguments[0] + "'"));
+
+       Service::Ptr hc = host->GetCheckService();
+
+       EventCommand::Ptr command = EventCommand::GetByName(arguments[2]);
+
+       if (!command)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Event command '" + arguments[1] + "' does not exist."));
+
+       Log(LogInformation, "icinga", "Changing event handler for host '" + arguments[0] + "' to '" + arguments[1] + "'");
+
+       {
+               ObjectLock olock(hc);
+
+               hc->SetEventCommand(command);
+       }
+}
+
+void ExternalCommandProcessor::ChangeSvcEventHandler(double time, const std::vector<String>& arguments)
+{
+       if (arguments.size() < 2)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
+
+       Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
+
+       if (!service)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot change event handler non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
+
+       EventCommand::Ptr command = EventCommand::GetByName(arguments[2]);
+
+       if (!command)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Event command '" + arguments[2] + "' does not exist."));
+
+       Log(LogInformation, "icinga", "Changing event handler for service '" + arguments[1] + "' to '" + arguments[2] + "'");
+
+       {
+               ObjectLock olock(service);
+
+               service->SetEventCommand(command);
+       }
+}
index 2216728a70497f83d8a205ac10102fdd23cdaff6..86679de63fbbff09598351aafa9a312ce0c38723 100644 (file)
@@ -141,6 +141,8 @@ private:
        static void DisableHostEventHandler(double time, const std::vector<String>& arguments);
        static void EnableSvcEventHandler(double time, const std::vector<String>& arguments);
        static void DisableSvcEventHandler(double time, const std::vector<String>& arguments);
+       static void ChangeHostEventHandler(double time, const std::vector<String>& arguments);
+       static void ChangeSvcEventHandler(double time, const std::vector<String>& arguments);
 };
 
 }
index d7b8d7806eac1990ea69b94d7ff9e8cc55a78072..ff5923400434460ba070923968edbee3b51bc198 100644 (file)
@@ -41,7 +41,19 @@ void Service::SetEnableEventHandler(bool enabled)
 
 EventCommand::Ptr Service::GetEventCommand(void) const
 {
-       return EventCommand::GetByName(GetEventCommandRaw());
+       String command;
+
+       if (!GetOverrideEventCommand().IsEmpty())
+               command = GetOverrideEventCommand();
+       else
+               command = GetEventCommandRaw();
+
+       return EventCommand::GetByName(command);
+}
+
+void Service::SetEventCommand(const EventCommand::Ptr& command)
+{
+       SetOverrideEventCommand(command->GetName());
 }
 
 void Service::ExecuteEventHandler(void)
index 1d3311fa898bbad5660da76b84e7c4a0c45b023d..3bea75cc72fc7c0a288c53711194f867471d33ba 100644 (file)
@@ -301,6 +301,9 @@ int Service::GetModifiedAttributes(void) const
        if (!GetOverrideRetryInterval().IsEmpty())
                attrs |= ModAttrRetryCheckInterval;
 
+       if (!GetOverrideEventCommand().IsEmpty())
+               attrs |= ModAttrEventHandlerCommand;
+
        // TODO: finish
 
        return attrs;
@@ -331,6 +334,9 @@ void Service::SetModifiedAttributes(int flags)
 
        if ((flags & ModAttrRetryCheckInterval) == 0)
                SetOverrideRetryInterval(Empty);
+
+       if ((flags & ModAttrEventHandlerCommand) == 0)
+               SetOverrideEventCommand(Empty);
 }
 
 bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, String *result) const
index 458410b83e325c637fcdc6b4236ef12eb14127bf..a2cda9a281f5022c284516e2eca69e57b3c97f74 100644 (file)
@@ -235,7 +235,9 @@ public:
 
        /* Event Handler */
        void ExecuteEventHandler(void);
+
        shared_ptr<EventCommand> GetEventCommand(void) const;
+       void SetEventCommand(const shared_ptr<EventCommand>& command);
 
        bool GetEnableEventHandler(void) const;
        void SetEnableEventHandler(bool enabled);
index f3f9c36729b62694cdc6dc99ee947bad4a6c7dd3..04bc047c66ab29f8af7369d770cd6a2d92d7627c 100644 (file)
@@ -136,6 +136,7 @@ class Service : DynamicObject
        [state] Value override_check_interval;
        [state] Value override_retry_interval;
        [state] Value override_enable_event_handler;
+       [state] Value override_event_command;
 };
 
 }