From 7e31cb639f3114dc0d9d84959f3b05833296c3e2 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 22 Jan 2013 12:44:23 +0100 Subject: [PATCH] Implement property change handler for next_check. Fixes #3547 --- components/checker/checkercomponent.cpp | 15 +++++++++++++++ components/checker/checkercomponent.h | 1 + lib/icinga/service.cpp | 3 +++ lib/icinga/service.h | 1 + 4 files changed, 20 insertions(+) diff --git a/components/checker/checkercomponent.cpp b/components/checker/checkercomponent.cpp index 747da37f4..98fc7f1f1 100644 --- a/components/checker/checkercomponent.cpp +++ b/components/checker/checkercomponent.cpp @@ -30,6 +30,7 @@ void CheckerComponent::Start(void) m_Endpoint->RegisterSubscription("checker"); Service::OnCheckerChanged.connect(bind(&CheckerComponent::CheckerChangedHandler, this, _1)); + Service::OnNextCheckChanged.connect(bind(&CheckerComponent::NextCheckChangedHandler, this, _1)); DynamicObject::OnUnregistered.connect(bind(&CheckerComponent::ObjectRemovedHandler, this, _1)); m_CheckTimer = boost::make_shared(); @@ -144,6 +145,20 @@ void CheckerComponent::CheckerChangedHandler(const Service::Ptr& service) } } +void CheckerComponent::NextCheckChangedHandler(const Service::Ptr& service) +{ + /* remove and re-insert the service from the set in order to force an index update */ + typedef nth_index::type ServiceView; + ServiceView& idx = boost::get<0>(m_IdleServices); + + ServiceView::iterator it = idx.find(service); + if (it == idx.end()) + return; + + idx.erase(it); + idx.insert(service); +} + void CheckerComponent::ObjectRemovedHandler(const DynamicObject::Ptr& object) { Service::Ptr service = dynamic_pointer_cast(object); diff --git a/components/checker/checkercomponent.h b/components/checker/checkercomponent.h index 698cfdb72..66cb9a2f2 100644 --- a/components/checker/checkercomponent.h +++ b/components/checker/checkercomponent.h @@ -74,6 +74,7 @@ private: void AdjustCheckTimer(void); void CheckerChangedHandler(const Service::Ptr& service); + void NextCheckChangedHandler(const Service::Ptr& service); void ObjectRemovedHandler(const DynamicObject::Ptr& object); }; diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 979dd2e5b..704da8854 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -53,6 +53,7 @@ const int Service::CheckIntervalDivisor = 5; boost::signal Service::OnCheckResultReceived; boost::signal Service::OnCheckerChanged; +boost::signal Service::OnNextCheckChanged; Service::Service(const Dictionary::Ptr& serializedObject) : DynamicObject(serializedObject) @@ -479,6 +480,8 @@ void Service::OnAttributeChanged(const String& name, const Value& oldValue) { if (name == "checker") OnCheckerChanged(GetSelf(), oldValue); + else if (name == "next_check") + OnNextCheckChanged(GetSelf(), oldValue); } void Service::BeginExecuteCheck(const function& callback) diff --git a/lib/icinga/service.h b/lib/icinga/service.h index 8fc19559d..65331c289 100644 --- a/lib/icinga/service.h +++ b/lib/icinga/service.h @@ -131,6 +131,7 @@ public: static boost::signal OnCheckResultReceived; static boost::signal OnCheckerChanged; + static boost::signal OnNextCheckChanged; protected: virtual void OnAttributeChanged(const String& name, const Value& oldValue); -- 2.40.0