Implemented status.dat support for notifications.

This commit is contained in:
Gunnar Beutner 2013-02-09 17:27:32 +01:00
parent a649a91cdc
commit d124e37c91
5 changed files with 62 additions and 20 deletions

View File

@ -355,7 +355,9 @@ void CompatComponent::DumpServiceStatusAttrs(ofstream& fp, const Service::Ptr& s
<< "\t" << "problem_has_been_acknowledged=" << (service->GetAcknowledgement() != AcknowledgementNone ? 1 : 0) << "\n" << "\t" << "problem_has_been_acknowledged=" << (service->GetAcknowledgement() != AcknowledgementNone ? 1 : 0) << "\n"
<< "\t" << "acknowledgement_type=" << static_cast<int>(service->GetAcknowledgement()) << "\n" << "\t" << "acknowledgement_type=" << static_cast<int>(service->GetAcknowledgement()) << "\n"
<< "\t" << "acknowledgement_end_time=" << service->GetAcknowledgementExpiry() << "\n" << "\t" << "acknowledgement_end_time=" << service->GetAcknowledgementExpiry() << "\n"
<< "\t" << "scheduled_downtime_depth=" << (service->IsInDowntime() ? 1 : 0) << "\n"; << "\t" << "scheduled_downtime_depth=" << (service->IsInDowntime() ? 1 : 0) << "\n"
<< "\t" << "last_notification=" << service->GetLastNotification() << "\n"
<< "\t" << "next_notification=" << service->GetNextNotification() << "\n";
} }
void CompatComponent::DumpServiceStatus(ofstream& fp, const Service::Ptr& service) void CompatComponent::DumpServiceStatus(ofstream& fp, const Service::Ptr& service)

View File

@ -274,3 +274,19 @@ void Service::DowntimeExpireTimerHandler(void)
service->RemoveExpiredDowntimes(); service->RemoveExpiredDowntimes();
} }
} }
bool Service::IsInDowntime(void) const
{
Dictionary::Ptr downtimes = GetDowntimes();
if (!downtimes)
return false;
Dictionary::Ptr downtime;
BOOST_FOREACH(tie(tuples::ignore, downtime), downtimes) {
if (Service::IsDowntimeActive(downtime))
return true;
}
return false;
}

View File

@ -39,7 +39,7 @@ void Service::RequestNotifications(NotificationType type) const
EndpointManager::GetInstance()->SendAnycastMessage(Endpoint::Ptr(), msg); EndpointManager::GetInstance()->SendAnycastMessage(Endpoint::Ptr(), msg);
} }
void Service::SendNotifications(NotificationType type) const void Service::SendNotifications(NotificationType type)
{ {
Logger::Write(LogInformation, "icinga", "Sending notifications for service '" + GetName() + "'"); Logger::Write(LogInformation, "icinga", "Sending notifications for service '" + GetName() + "'");
@ -51,6 +51,8 @@ void Service::SendNotifications(NotificationType type) const
BOOST_FOREACH(const Notification::Ptr& notification, notifications) { BOOST_FOREACH(const Notification::Ptr& notification, notifications) {
notification->SendNotification(type); notification->SendNotification(type);
} }
SetLastNotification(Utility::GetTime());
} }
void Service::InvalidateNotificationsCache(void) void Service::InvalidateNotificationsCache(void)
@ -182,3 +184,33 @@ void Service::UpdateSlaveNotifications(void)
Set("slave_notifications", newNotifications); Set("slave_notifications", newNotifications);
} }
double Service::GetLastNotification(void) const
{
Value value = Get("last_notification");
if (value.IsEmpty())
value = 0;
return value;
}
void Service::SetLastNotification(double time)
{
Set("last_notification", time);
}
double Service::GetNextNotification(void) const
{
Value value = Get("next_notification");
if (value.IsEmpty())
value = 0;
return value;
}
void Service::SetNextNotification(double time)
{
Set("next_notification", time);
}

View File

@ -38,7 +38,9 @@ static AttributeDescription serviceAttributes[] = {
{ "acknowledgement", Attribute_Replicated }, { "acknowledgement", Attribute_Replicated },
{ "acknowledgement_expiry", Attribute_Replicated }, { "acknowledgement_expiry", Attribute_Replicated },
{ "downtimes", Attribute_Replicated }, { "downtimes", Attribute_Replicated },
{ "comments", Attribute_Replicated } { "comments", Attribute_Replicated },
{ "last_notification", Attribute_Replicated },
{ "next_notification", Attribute_Replicated }
}; };
REGISTER_TYPE(Service, serviceAttributes); REGISTER_TYPE(Service, serviceAttributes);
@ -227,22 +229,6 @@ bool Service::IsReachable(void) const
return true; return true;
} }
bool Service::IsInDowntime(void) const
{
Dictionary::Ptr downtimes = GetDowntimes();
if (!downtimes)
return false;
Dictionary::Ptr downtime;
BOOST_FOREACH(tie(tuples::ignore, downtime), downtimes) {
if (Service::IsDowntimeActive(downtime))
return true;
}
return false;
}
void Service::SetSchedulingOffset(long offset) void Service::SetSchedulingOffset(long offset)
{ {
Set("scheduling_offset", offset); Set("scheduling_offset", offset);

View File

@ -224,7 +224,7 @@ public:
/* Notifications */ /* Notifications */
void RequestNotifications(NotificationType type) const; void RequestNotifications(NotificationType type) const;
void SendNotifications(NotificationType type) const; void SendNotifications(NotificationType type);
static void InvalidateNotificationsCache(void); static void InvalidateNotificationsCache(void);
static void ValidateNotificationsCache(void); static void ValidateNotificationsCache(void);
@ -233,6 +233,12 @@ public:
void UpdateSlaveNotifications(void); void UpdateSlaveNotifications(void);
double GetLastNotification(void) const;
void SetLastNotification(double time);
double GetNextNotification(void) const;
void SetNextNotification(double time);
protected: protected:
virtual void OnAttributeChanged(const String& name, const Value& oldValue); virtual void OnAttributeChanged(const String& name, const Value& oldValue);