diff --git a/components/cluster/endpoint.cpp b/components/cluster/endpoint.cpp index adea27395cd..ba8bd378c8e 100644 --- a/components/cluster/endpoint.cpp +++ b/components/cluster/endpoint.cpp @@ -32,6 +32,7 @@ using namespace icinga; REGISTER_TYPE(Endpoint); boost::signals2::signal Endpoint::OnConnected; +boost::signals2::signal Endpoint::OnDisconnected; boost::signals2::signal Endpoint::OnMessageReceived; /** @@ -61,6 +62,10 @@ void Endpoint::SetClient(const Stream::Ptr& client) thread.detach(); OnConnected(GetSelf()); + Log(LogWarning, "cluster", "Endpoint connected: " + GetName()); + } else { + OnDisconnected(GetSelf()); + Log(LogWarning, "cluster", "Endpoint disconnected: " + GetName()); } } @@ -79,6 +84,9 @@ void Endpoint::SendMessage(const Dictionary::Ptr& message) Log(LogWarning, "cluster", msgbuf.str()); m_Client.reset(); + + OnDisconnected(GetSelf()); + Log(LogWarning, "cluster", "Endpoint disconnected: " + GetName()); } } @@ -96,6 +104,9 @@ void Endpoint::MessageThreadProc(const Stream::Ptr& stream) m_Client.reset(); + OnDisconnected(GetSelf()); + Log(LogWarning, "cluster", "Endpoint disconnected: " + GetName()); + return; } diff --git a/components/cluster/endpoint.h b/components/cluster/endpoint.h index 62925012efa..97f369a5e5d 100644 --- a/components/cluster/endpoint.h +++ b/components/cluster/endpoint.h @@ -42,6 +42,7 @@ class Endpoint : public ObjectImpl DECLARE_TYPENAME(Endpoint); static boost::signals2::signal OnConnected; + static boost::signals2::signal OnDisconnected; static boost::signals2::signal OnMessageReceived; Stream::Ptr GetClient(void) const; diff --git a/components/db_ido_mysql/schema/mysql.sql b/components/db_ido_mysql/schema/mysql.sql index 45a23969f9f..6e1deec6e31 100644 --- a/components/db_ido_mysql/schema/mysql.sql +++ b/components/db_ido_mysql/schema/mysql.sql @@ -1392,7 +1392,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/db_ido/CMakeLists.txt b/lib/db_ido/CMakeLists.txt index 2ad7fb90bf1..9d1c8a3533d 100644 --- a/lib/db_ido/CMakeLists.txt +++ b/lib/db_ido/CMakeLists.txt @@ -22,13 +22,13 @@ mkembedconfig_target(db_ido-type.conf db_ido-type.cpp) add_library(db_ido SHARED commanddbobject.cpp dbconnection.cpp dbconnection.th dbconnection.th db_ido-type.cpp dbobject.cpp dbquery.cpp dbreference.cpp dbtype.cpp - dbvalue.cpp hostdbobject.cpp hostgroupdbobject.cpp servicedbobject.cpp - servicegroupdbobject.cpp timeperioddbobject.cpp userdbobject.cpp - usergroupdbobject.cpp + dbvalue.cpp endpointdbobject.cpp hostdbobject.cpp hostgroupdbobject.cpp + servicedbobject.cpp servicegroupdbobject.cpp timeperioddbobject.cpp + userdbobject.cpp usergroupdbobject.cpp ) include_directories(${Boost_INCLUDE_DIRS}) -target_link_libraries(db_ido ${Boost_LIBRARIES} base config icinga) +target_link_libraries(db_ido ${Boost_LIBRARIES} base config icinga cluster) set_target_properties ( db_ido PROPERTIES diff --git a/lib/db_ido/dbobject.h b/lib/db_ido/dbobject.h index 8031eeab6b9..d6bc9abbb32 100644 --- a/lib/db_ido/dbobject.h +++ b/lib/db_ido/dbobject.h @@ -49,6 +49,7 @@ enum DbObjectType DbObjectTypeContact = 10, DbObjectTypeContactGroup = 11, DbObjectTypeCommand = 12, + DbObjectTypeEndpoint = 13, }; /** diff --git a/lib/db_ido/endpointdbobject.cpp b/lib/db_ido/endpointdbobject.cpp new file mode 100644 index 00000000000..33ae555768e --- /dev/null +++ b/lib/db_ido/endpointdbobject.cpp @@ -0,0 +1,89 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-present Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "db_ido/endpointdbobject.h" +#include "db_ido/dbtype.h" +#include "db_ido/dbvalue.h" +#include "icinga/icingaapplication.h" +#include "base/objectlock.h" +#include "base/initialize.h" +#include "base/dynamictype.h" +#include "base/utility.h" +#include "base/logger_fwd.h" +#include + +using namespace icinga; + + +REGISTER_DBTYPE(Endpoint, "endpoint", DbObjectTypeEndpoint, "endpoint_object_id", EndpointDbObject); + +INITIALIZE_ONCE(&EndpointDbObject::StaticInitialize); + +void EndpointDbObject::StaticInitialize(void) +{ + Endpoint::OnConnected.connect(boost::bind(&EndpointDbObject::UpdateConnectedStatus, _1)); + Endpoint::OnDisconnected.connect(boost::bind(&EndpointDbObject::UpdateConnectedStatus, _1)); +} + +EndpointDbObject::EndpointDbObject(const DbType::Ptr& type, const String& name1, const String& name2) + : DbObject(type, name1, name2) +{ } + +Dictionary::Ptr EndpointDbObject::GetConfigFields(void) const +{ + Dictionary::Ptr fields = make_shared(); + Endpoint::Ptr endpoint = static_pointer_cast(GetObject()); + + fields->Set("identity", endpoint->GetName()); + fields->Set("node", IcingaApplication::GetInstance()->GetNodeName()); + + return fields; +} + +Dictionary::Ptr EndpointDbObject::GetStatusFields(void) const +{ + Dictionary::Ptr fields = make_shared(); + Endpoint::Ptr endpoint = static_pointer_cast(GetObject()); + + fields->Set("identity", endpoint->GetName()); + fields->Set("node", IcingaApplication::GetInstance()->GetNodeName()); + fields->Set("is_connected", endpoint->IsConnected() ? 1 : 0); + + return fields; +} + +void EndpointDbObject::UpdateConnectedStatus(const Endpoint::Ptr& endpoint) +{ + Log(LogDebug, "db_ido", "update is_connected for endpoint '" + endpoint->GetName() + "'"); + + DbQuery query1; + query1.Table = "endpointstatus"; + query1.Type = DbQueryUpdate; + + Dictionary::Ptr fields1 = make_shared(); + fields1->Set("is_connected", endpoint->IsConnected() ? 1 : 0); + fields1->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime())); + query1.Fields = fields1; + + query1.WhereCriteria = make_shared(); + query1.WhereCriteria->Set("endpoint_object_id", endpoint); + query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + OnQuery(query1); +} diff --git a/lib/db_ido/endpointdbobject.h b/lib/db_ido/endpointdbobject.h new file mode 100644 index 00000000000..a15a820a67f --- /dev/null +++ b/lib/db_ido/endpointdbobject.h @@ -0,0 +1,53 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-present Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef ENDPOINTDBOBJECT_H +#define ENDPOINTDBOBJECT_H + +#include "db_ido/dbobject.h" +#include "base/dynamicobject.h" +#include "cluster/endpoint.h" + +namespace icinga +{ + +/** + * A Command database object. + * + * @ingroup ido + */ +class EndpointDbObject : public DbObject +{ +public: + DECLARE_PTR_TYPEDEFS(EndpointDbObject); + + EndpointDbObject(const shared_ptr& type, const String& name1, const String& name2); + + static void StaticInitialize(void); + + virtual Dictionary::Ptr GetConfigFields(void) const; + virtual Dictionary::Ptr GetStatusFields(void) const; + +private: + static void UpdateConnectedStatus(const Endpoint::Ptr& endpoint); +}; + +} + +#endif /* ENDPOINTDBOBJECT_H */