diff --git a/components/db_ido_pgsql/schema/pgsql.sql b/components/db_ido_pgsql/schema/pgsql.sql index bd01157ac..4cf055ec6 100644 --- a/components/db_ido_pgsql/schema/pgsql.sql +++ b/components/db_ido_pgsql/schema/pgsql.sql @@ -1420,7 +1420,6 @@ ALTER TABLE icinga_servicechecks ADD COLUMN endpoint_object_id bigint default NU ALTER TABLE icinga_statehistory ADD COLUMN endpoint_object_id bigint default NULL; ALTER TABLE icinga_systemcommands ADD COLUMN endpoint_object_id bigint default NULL; - -- ----------------------------------------- -- add index (delete) -- ----------------------------------------- diff --git a/lib/base/dynamicobject.cpp b/lib/base/dynamicobject.cpp index 65c831096..11be09821 100644 --- a/lib/base/dynamicobject.cpp +++ b/lib/base/dynamicobject.cpp @@ -44,7 +44,7 @@ INITIALIZE_ONCE(&DynamicObject::StaticInitialize); boost::signals2::signal DynamicObject::OnStarted; boost::signals2::signal DynamicObject::OnStopped; -boost::signals2::signal DynamicObject::OnStateChanged; +boost::signals2::signal DynamicObject::OnStateChanged; boost::signals2::signal DynamicObject::OnAuthorityChanged; void DynamicObject::StaticInitialize(void) diff --git a/lib/base/dynamicobject.h b/lib/base/dynamicobject.h index c2b433797..fa7e57617 100644 --- a/lib/base/dynamicobject.h +++ b/lib/base/dynamicobject.h @@ -56,7 +56,7 @@ public: static boost::signals2::signal OnStarted; static boost::signals2::signal OnStopped; - static boost::signals2::signal OnStateChanged; + static boost::signals2::signal OnStateChanged; static boost::signals2::signal OnAuthorityChanged; Value InvokeMethod(const String& method, const std::vector& arguments); diff --git a/lib/db_ido/dbobject.cpp b/lib/db_ido/dbobject.cpp index 89307a72c..f20f731a3 100644 --- a/lib/db_ido/dbobject.cpp +++ b/lib/db_ido/dbobject.cpp @@ -21,6 +21,7 @@ #include "db_ido/dbtype.h" #include "db_ido/dbvalue.h" #include "icinga/service.h" +#include "cluster/endpoint.h" #include "base/dynamictype.h" #include "base/objectlock.h" #include "base/utility.h" @@ -41,7 +42,7 @@ DbObject::DbObject(const shared_ptr& type, const String& name1, const St void DbObject::StaticInitialize(void) { /* triggered in ProcessCheckResult(), requires UpdateNextCheck() to be called before */ - DynamicObject::OnStateChanged.connect(boost::bind(&DbObject::StateChangedHandler, _1)); + DynamicObject::OnStateChanged.connect(boost::bind(&DbObject::StateChangedHandler, _1, _2)); } void DbObject::SetObject(const DynamicObject::Ptr& object) @@ -95,10 +96,12 @@ void DbObject::SendConfigUpdate(void) OnConfigUpdate(); } -void DbObject::SendStatusUpdate(void) +void DbObject::SendStatusUpdate(const String& authority) { Dictionary::Ptr fields = GetStatusFields(); + Endpoint::Ptr endpoint = Endpoint::GetByName(authority); + if (!fields) return; @@ -109,6 +112,10 @@ void DbObject::SendStatusUpdate(void) query.Fields = fields; query.Fields->Set(GetType()->GetIDColumn(), GetObject()); query.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + if (endpoint) + query.Fields->Set("endpoint_object_id", endpoint); + query.Fields->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime())); query.WhereCriteria = make_shared(); query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject()); @@ -183,12 +190,12 @@ DbObject::Ptr DbObject::GetOrCreateByObject(const DynamicObject::Ptr& object) return dbobj; } -void DbObject::StateChangedHandler(const DynamicObject::Ptr& object) +void DbObject::StateChangedHandler(const DynamicObject::Ptr& object, const String& authority) { DbObject::Ptr dbobj = GetOrCreateByObject(object); if (!dbobj) return; - dbobj->SendStatusUpdate(); + dbobj->SendStatusUpdate(authority); } diff --git a/lib/db_ido/dbobject.h b/lib/db_ido/dbobject.h index d6bc9abbb..896f73089 100644 --- a/lib/db_ido/dbobject.h +++ b/lib/db_ido/dbobject.h @@ -79,7 +79,7 @@ public: static boost::signals2::signal OnQuery; void SendConfigUpdate(void); - void SendStatusUpdate(void); + void SendStatusUpdate(const String& authority = String()); double GetLastConfigUpdate(void) const; double GetLastStatusUpdate(void) const; @@ -100,7 +100,7 @@ private: double m_LastConfigUpdate; double m_LastStatusUpdate; - static void StateChangedHandler(const DynamicObject::Ptr& object); + static void StateChangedHandler(const DynamicObject::Ptr& object, const String& authority); friend class DbType; }; diff --git a/lib/icinga/service-check.cpp b/lib/icinga/service-check.cpp index 6fb654d39..b68854853 100644 --- a/lib/icinga/service-check.cpp +++ b/lib/icinga/service-check.cpp @@ -417,7 +417,7 @@ void Service::ProcessCheckResult(const CheckResult::Ptr& cr, const String& autho OnNewCheckResult(GetSelf(), cr, authority); /* signal status updates to for example db_ido */ - OnStateChanged(GetSelf()); + OnStateChanged(GetSelf(), authority); if (hardChange) OnStateChange(GetSelf(), cr, StateTypeHard, authority);