From e690eaf3c43954de1cfd3adb0c4fa7a38927c069 Mon Sep 17 00:00:00 2001 From: Mattia Codato Date: Wed, 22 Jul 2020 17:22:50 +0200 Subject: [PATCH] Run ExecutedCommandAPIHandler in case of command not found and if source is set --- lib/icinga/clusterevents-check.cpp | 136 +++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 36 deletions(-) diff --git a/lib/icinga/clusterevents-check.cpp b/lib/icinga/clusterevents-check.cpp index 737af21f3..2242b3964 100644 --- a/lib/icinga/clusterevents-check.cpp +++ b/lib/icinga/clusterevents-check.cpp @@ -225,49 +225,113 @@ void ClusterEvents::ExecuteCheckFromQueue(const MessageOrigin::Ptr& origin, cons String command = params->Get("command"); String command_type = params->Get("command_type"); - if (command_type == "check_command" && !CheckCommand::GetByName(command) || - command_type == "event_command" && !EventCommand::GetByName(command) || - command_type == "notification_command" && !NotificationCommand::GetByName(command)) { - ServiceState state = ServiceUnknown; - String output = command_type + " '" + command + "' does not exist."; - double now = Utility::GetTime(); + if (command_type == "check_command") { + if (!CheckCommand::GetByName(command)) { + ServiceState state = ServiceUnknown; + String output = "Check command '" + command + "' does not exist."; + double now = Utility::GetTime(); + + if (params->Contains("source")) { + Dictionary::Ptr executedParams = new Dictionary(); + executedParams->Set("execution", params->Get("source")); + executedParams->Set("host", params->Get("host")); + if (params->Contains("service")) + executedParams->Set("service", params->Get("service")); + executedParams->Set("exit", state); + executedParams->Set("output", output); + executedParams->Set("start", now); + executedParams->Set("end", now); - if (params->Contains("source")) { - Dictionary::Ptr executedParams = new Dictionary(); - executedParams->Set("execution", params->Get("source")); - executedParams->Set("host", params->Get("host")); - if (params->Contains("service")) - executedParams->Set("service", params->Get("service")); - executedParams->Set("exit", state); - executedParams->Set("output", output); - executedParams->Set("start", now); - executedParams->Set("end", now); + if (origin->IsLocal()) { + ClusterEvents::ExecutedCommandAPIHandler(origin, executedParams); + } else { + Dictionary::Ptr executedMessage = new Dictionary(); + executedMessage->Set("jsonrpc", "2.0"); + executedMessage->Set("method", "event::ExecutedCommand"); + executedMessage->Set("params", executedParams); - if (origin->IsLocal()) { - ClusterEvents::ExecutedCommandAPIHandler(origin, executedParams); + listener->SyncSendMessage(sourceEndpoint, executedMessage); + } } else { - Dictionary::Ptr executedMessage = new Dictionary(); - executedMessage->Set("jsonrpc", "2.0"); - executedMessage->Set("method", "event::ExecutedCommand"); - executedMessage->Set("params", executedParams); - - listener->SyncSendMessage(sourceEndpoint, executedMessage); + CheckResult::Ptr cr = new CheckResult(); + cr->SetState(state); + cr->SetOutput(output); + cr->SetScheduleStart(now); + cr->SetScheduleEnd(now); + cr->SetExecutionStart(now); + cr->SetExecutionEnd(now); + Dictionary::Ptr message = MakeCheckResultMessage(host, cr); + listener->SyncSendMessage(sourceEndpoint, message); } - } else { - CheckResult::Ptr cr = new CheckResult(); - cr->SetState(state); - cr->SetOutput(output); - cr->SetScheduleStart(now); - cr->SetScheduleEnd(now); - cr->SetExecutionStart(now); - cr->SetExecutionEnd(now); - Dictionary::Ptr message = MakeCheckResultMessage(host, cr); - listener->SyncSendMessage(sourceEndpoint, message); + return; + } + } else if (command_type == "event_command") { + if (!EventCommand::GetByName(command)) { + String output = "Event command '" + command + "' does not exist."; + Log(LogWarning, "ClusterEvents") << output; + + if (params->Contains("source")) { + double now = Utility::GetTime(); + ServiceState state = ServiceUnknown; + + Dictionary::Ptr executedParams = new Dictionary(); + executedParams->Set("execution", params->Get("source")); + executedParams->Set("host", params->Get("host")); + if (params->Contains("service")) + executedParams->Set("service", params->Get("service")); + executedParams->Set("exit", state); + executedParams->Set("output", output); + executedParams->Set("start", now); + executedParams->Set("end", now); + + if (origin->IsLocal()) { + ClusterEvents::ExecutedCommandAPIHandler(origin, executedParams); + } else { + Dictionary::Ptr executedMessage = new Dictionary(); + executedMessage->Set("jsonrpc", "2.0"); + executedMessage->Set("method", "event::ExecutedCommand"); + executedMessage->Set("params", executedParams); + + listener->SyncSendMessage(sourceEndpoint, executedMessage); + } + } + return; + } + } else if (command_type == "notification_command") { + if (!NotificationCommand::GetByName(command)) { + String output = "Notification command '" + command + "' does not exist."; + Log(LogWarning, "ClusterEvents") << output; + + if (params->Contains("source")) { + double now = Utility::GetTime(); + ServiceState state = ServiceUnknown; + + Dictionary::Ptr executedParams = new Dictionary(); + executedParams->Set("execution", params->Get("source")); + executedParams->Set("host", params->Get("host")); + if (params->Contains("service")) + executedParams->Set("service", params->Get("service")); + executedParams->Set("exit", state); + executedParams->Set("output", output); + executedParams->Set("start", now); + executedParams->Set("end", now); + + if (origin->IsLocal()) { + ClusterEvents::ExecutedCommandAPIHandler(origin, executedParams); + } else { + Dictionary::Ptr executedMessage = new Dictionary(); + executedMessage->Set("jsonrpc", "2.0"); + executedMessage->Set("method", "event::ExecutedCommand"); + executedMessage->Set("params", executedParams); + + listener->SyncSendMessage(sourceEndpoint, executedMessage); + } + } + return; } - return; } - attrs->Set(command_type, command); + attrs->Set(command_type, params->Get("command")); attrs->Set("command_endpoint", sourceEndpoint->GetName()); Deserialize(host, attrs, false, FAConfig);