String commandName = command->GetName();
try {
- command->Execute(this, user, cr, type, author, text);
+ NotificationResult::Ptr nr = new NotificationResult();
+
+ nr->SetExecutionStart(Utility::GetTime());
+
+ command->Execute(this, user, cr, nr, type, author, text);
/* required by compatlogger */
- Service::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, author, text, commandName, nullptr);
+ Checkable::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, author, text, command->GetName(), nullptr);
Log(LogInformation, "Notification")
<< "Completed sending '" << NotificationTypeToStringInternal(type)
if (!nr)
return;
+ double now = Utility::GetTime();
+
+ if (nr->GetExecutionStart() == 0)
+ nr->SetExecutionStart(now);
+
+ if (nr->GetExecutionEnd() == 0)
+ nr->SetExecutionEnd(now);
+
+ /* Determine the execution endpoint from a locally executed check. */
+ if (!origin || origin->IsLocal())
+ nr->SetExecutionEndpoint(IcingaApplication::GetInstance()->GetNodeName());
+
+ if (!IsActive())
+ return;
+
+ {
+ ObjectLock olock(this);
+
+ SetLastNotificationResult(nr);
+ }
+
/* Notify cluster, API and feature events. */
OnNewNotificationResult(this, nr, origin);
}
Endpoint::Ptr GetCommandEndpoint() const;
- void ProcessNotificationResult(const NotificationResult::Ptr& nr, const MessageOrigin::Ptr& origin);
+ void ProcessNotificationResult(const NotificationResult::Ptr& nr, const MessageOrigin::Ptr& origin = nullptr);
static String NotificationTypeToString(NotificationType type);
static String NotificationFilterToString(int filter, const std::map<String, int>& filterMap);
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
#include "icinga/customvarobject.hpp"
+#include "icinga/notificationresult.hpp"
+#include "base/array.hpp"
#impl_include "icinga/notificationcommand.hpp"
#impl_include "icinga/service.hpp"
virtual String MakeName(const String& shortName, const Object::Ptr& context) const;
virtual Dictionary::Ptr ParseName(const String& name) const;
};
+
}}}
class Notification : CustomVarObject < NotificationNameComposer
[state] Timestamp next_notification;
[state] int notification_number;
[state] Timestamp last_problem_notification;
+ [state] NotificationResult::Ptr last_notification_result;
[config, navigation] name(Endpoint) command_endpoint (CommandEndpointRaw) {
navigate {{{
REGISTER_TYPE(NotificationCommand);
Dictionary::Ptr NotificationCommand::Execute(const Notification::Ptr& notification,
- const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationType& type,
- const String& author, const String& comment, const Dictionary::Ptr& resolvedMacros,
- bool useResolvedMacros)
+ const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationResult::Ptr& nr,
+ const NotificationType& type, const String& author, const String& comment,
+ const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros)
{
return GetExecute()->Invoke({
notification,
user,
cr,
+ nr,
type,
author,
comment,
DECLARE_OBJECTNAME(NotificationCommand);
virtual Dictionary::Ptr Execute(const intrusive_ptr<Notification>& notification,
- const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationType& type,
- const String& author, const String& comment,
+ const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationResult::Ptr& nr,
+ const NotificationType& type, const String& author, const String& comment,
const Dictionary::Ptr& resolvedMacros = nullptr,
bool useResolvedMacros = false);
};
#include "icinga/notificationresult.hpp"
#include "icinga/notificationresult-ti.cpp"
-#include "base/scriptglobal.hpp"
using namespace icinga;
using namespace icinga;
-REGISTER_FUNCTION_NONCONST(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:itype:author:comment:resolvedMacros:useResolvedMacros");
+REGISTER_FUNCTION_NONCONST(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:nr:itype:author:comment:resolvedMacros:useResolvedMacros");
void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification,
- const User::Ptr& user, const CheckResult::Ptr& cr, int itype,
- const String& author, const String& comment, const Dictionary::Ptr& resolvedMacros,
- bool useResolvedMacros)
+ const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationResult::Ptr& nr,
+ int itype, const String& author, const String& comment,
+ const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros)
{
REQUIRE_NOT_NULL(notification);
REQUIRE_NOT_NULL(user);
PluginUtility::ExecuteCommand(commandObj, checkable, cr, resolvers,
resolvedMacros, useResolvedMacros, timeout,
- std::bind(&PluginNotificationTask::ProcessFinishedHandler, checkable, _1, _2));
+ std::bind(&PluginNotificationTask::ProcessFinishedHandler, checkable, notification, nr, _1, _2));
}
-void PluginNotificationTask::ProcessFinishedHandler(const Checkable::Ptr& checkable, const Value& commandLine, const ProcessResult& pr)
+void PluginNotificationTask::ProcessFinishedHandler(const Checkable::Ptr& checkable,
+ const Notification::Ptr& notification, const NotificationResult::Ptr& nr, const Value& commandLine, const ProcessResult& pr)
{
if (pr.ExitStatus != 0) {
Process::Arguments parguments = Process::PrepareCommand(commandLine);
Log(LogWarning, "PluginNotificationTask")
- << "Notification command for object '" << checkable->GetName() << "' (PID: " << pr.PID
+ << "Notification command for checkable '" << checkable->GetName()
+ << "' and notification '" << notification->GetName() << "' (PID: " << pr.PID
<< ", arguments: " << Process::PrettyPrintArguments(parguments) << ") terminated with exit code "
<< pr.ExitStatus << ", output: " << pr.Output;
}
+
+ String output = pr.Output.Trim();
+
+ nr->SetCommand(commandLine);
+ nr->SetOutput(output);
+ nr->SetExitStatus(pr.ExitStatus);
+ nr->SetExecutionStart(pr.ExecutionStart);
+ nr->SetExecutionEnd(pr.ExecutionEnd);
+
+ notification->ProcessNotificationResult(nr);
}
{
public:
static void ScriptFunc(const Notification::Ptr& notification,
- const User::Ptr& user, const CheckResult::Ptr& cr, int itype,
- const String& author, const String& comment,
+ const User::Ptr& user, const CheckResult::Ptr& cr, const NotificationResult::Ptr& nr,
+ int itype, const String& author, const String& comment,
const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros);
private:
PluginNotificationTask();
static void ProcessFinishedHandler(const Checkable::Ptr& checkable,
+ const Notification::Ptr& notification, const NotificationResult::Ptr& nr,
const Value& commandLine, const ProcessResult& pr);
};