]> granicus.if.org Git - icinga2/commitdiff
Implement override_check_command.
authorGunnar Beutner <gunnar.beutner@netways.de>
Tue, 26 Nov 2013 11:56:42 +0000 (12:56 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 26 Nov 2013 12:26:21 +0000 (13:26 +0100)
Refs #4746

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

index 8a793420afacb88f5963290ba55769b957ea45ff..77d5d5b838ef895821556bc60e0bc50e99bbcb77 100644 (file)
@@ -193,6 +193,8 @@ void ExternalCommandProcessor::Initialize(void)
        RegisterCommand("DISABLE_SVC_EVENT_HANDLER", &ExternalCommandProcessor::DisableSvcEventHandler);
        RegisterCommand("CHANGE_HOST_EVENT_HANDLER", &ExternalCommandProcessor::ChangeHostEventHandler);
        RegisterCommand("CHANGE_SVC_EVENT_HANDLER", &ExternalCommandProcessor::ChangeSvcEventHandler);
+       RegisterCommand("CHANGE_HOST_CHECK_COMMAND", &ExternalCommandProcessor::ChangeHostCheckCommand);
+       RegisterCommand("CHANGE_SVC_CHECK_COMMAND", &ExternalCommandProcessor::ChangeSvcCheckCommand);
 }
 
 void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
@@ -2054,7 +2056,7 @@ void ExternalCommandProcessor::ChangeSvcEventHandler(double time, const std::vec
        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] + "'"));
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot change event handler for non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
 
        EventCommand::Ptr command = EventCommand::GetByName(arguments[2]);
 
@@ -2069,3 +2071,53 @@ void ExternalCommandProcessor::ChangeSvcEventHandler(double time, const std::vec
                service->SetEventCommand(command);
        }
 }
+
+void ExternalCommandProcessor::ChangeHostCheckCommand(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 check command for non-existent host '" + arguments[0] + "'"));
+
+       Service::Ptr hc = host->GetCheckService();
+
+       CheckCommand::Ptr command = CheckCommand::GetByName(arguments[2]);
+
+       if (!command)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Check command '" + arguments[1] + "' does not exist."));
+
+       Log(LogInformation, "icinga", "Changing check command for host '" + arguments[0] + "' to '" + arguments[1] + "'");
+
+       {
+               ObjectLock olock(hc);
+
+               hc->SetCheckCommand(command);
+       }
+}
+
+void ExternalCommandProcessor::ChangeSvcCheckCommand(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 check command for non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
+
+       CheckCommand::Ptr command = CheckCommand::GetByName(arguments[2]);
+
+       if (!command)
+               BOOST_THROW_EXCEPTION(std::invalid_argument("Check command '" + arguments[2] + "' does not exist."));
+
+       Log(LogInformation, "icinga", "Changing check command for service '" + arguments[1] + "' to '" + arguments[2] + "'");
+
+       {
+               ObjectLock olock(service);
+
+               service->SetCheckCommand(command);
+       }
+}
index 86679de63fbbff09598351aafa9a312ce0c38723..a8efbf3ef5dc3c85d656fca8fcc33cb9a66ec414 100644 (file)
@@ -143,6 +143,8 @@ private:
        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);
+       static void ChangeHostCheckCommand(double time, const std::vector<String>& arguments);
+       static void ChangeSvcCheckCommand(double time, const std::vector<String>& arguments);
 };
 
 }
index 21908610908495ba0e20d49708c49c83e1bc5076..2c4e2933517a6dc67daf62629baa99b6a72e5320 100644 (file)
@@ -47,7 +47,19 @@ boost::signals2::signal<void (const Service::Ptr&, FlappingState)> Service::OnFl
 
 CheckCommand::Ptr Service::GetCheckCommand(void) const
 {
-       return CheckCommand::GetByName(GetCheckCommandRaw());
+       String command;
+
+       if (!GetOverrideCheckCommand().IsEmpty())
+               command = GetOverrideCheckCommand();
+       else
+               command = GetCheckCommandRaw();
+
+       return CheckCommand::GetByName(command);
+}
+
+void Service::SetCheckCommand(const CheckCommand::Ptr& command)
+{
+       SetOverrideCheckCommand(command->GetName());
 }
 
 TimePeriod::Ptr Service::GetCheckPeriod(void) const
index 3bea75cc72fc7c0a288c53711194f867471d33ba..82571ada625d5c0931d618be174c90bb50067877 100644 (file)
@@ -304,6 +304,9 @@ int Service::GetModifiedAttributes(void) const
        if (!GetOverrideEventCommand().IsEmpty())
                attrs |= ModAttrEventHandlerCommand;
 
+       if (!GetOverrideCheckCommand().IsEmpty())
+               attrs |= ModAttrCheckCommand;
+
        // TODO: finish
 
        return attrs;
@@ -337,6 +340,9 @@ void Service::SetModifiedAttributes(int flags)
 
        if ((flags & ModAttrEventHandlerCommand) == 0)
                SetOverrideEventCommand(Empty);
+
+       if ((flags & ModAttrCheckCommand) == 0)
+               SetOverrideCheckCommand(Empty);
 }
 
 bool Service::ResolveMacro(const String& macro, const CheckResult::Ptr& cr, String *result) const
index a2cda9a281f5022c284516e2eca69e57b3c97f74..4d2374243da70cd895b6634a95f526a492d96346 100644 (file)
@@ -109,6 +109,8 @@ public:
 
        /* Checks */
        shared_ptr<CheckCommand> GetCheckCommand(void) const;
+       void SetCheckCommand(const shared_ptr<CheckCommand>& command);
+
        TimePeriod::Ptr GetCheckPeriod(void) const;
 
        double GetCheckInterval(void) const;
index 04bc047c66ab29f8af7369d770cd6a2d92d7627c..c59528ac60f0f007d90541fed8012eb8e1487810 100644 (file)
@@ -137,6 +137,7 @@ class Service : DynamicObject
        [state] Value override_retry_interval;
        [state] Value override_enable_event_handler;
        [state] Value override_event_command;
+       [state] Value override_check_command;
 };
 
 }