//ClearConfigTable("contactstatus");
ClearConfigTable("customvariables");
ClearConfigTable("customvariablestatus");
+ ClearConfigTable("endpoints");
+ ClearConfigTable("endpointstatus");
ClearConfigTable("host_contactgroups");
ClearConfigTable("host_contacts");
ClearConfigTable("host_parenthosts");
query.Category = DbCatState;
query.Fields = fields;
query.Fields->Set(GetType()->GetIDColumn(), GetObject());
- query.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
- String node = IcingaApplication::GetInstance()->GetNodeName();
+ /* do not override our own endpoint dbobject id */
+ if (GetType()->GetTable() != "endpoint") {
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Log(LogDebug, "db_ido", "Endpoint node: '" + node + "' status update for '" + GetObject()->GetName() + "'");
- Log(LogWarning, "db_ido", "Endpoint node: '" + node + "'");
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ query.Fields->Set("endpoint_object_id", endpoint);
+ }
- Endpoint::Ptr endpoint = Endpoint::GetByName(node);
- if (endpoint)
- query.Fields->Set("endpoint_object_id", endpoint);
+ query.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
query.Fields->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime()));
query.WhereCriteria = make_shared<Dictionary>();
#include "base/initialize.h"
#include "base/dynamictype.h"
#include "base/utility.h"
+#include "base/convert.h"
#include "base/logger_fwd.h"
#include <boost/foreach.hpp>
void EndpointDbObject::StaticInitialize(void)
{
Endpoint::OnConnected.connect(boost::bind(&EndpointDbObject::UpdateConnectedStatus, _1));
- Endpoint::OnDisconnected.connect(boost::bind(&EndpointDbObject::UpdateConnectedStatus, _1));
+ Endpoint::OnDisconnected.connect(boost::bind(&EndpointDbObject::UpdateDisconnectedStatus, _1));
}
EndpointDbObject::EndpointDbObject(const DbType::Ptr& type, const String& name1, const String& name2)
Dictionary::Ptr fields = make_shared<Dictionary>();
Endpoint::Ptr endpoint = static_pointer_cast<Endpoint>(GetObject());
+ Log(LogDebug, "db_ido", "update status for endpoint '" + endpoint->GetName() + "'");
+
fields->Set("identity", endpoint->GetName());
fields->Set("node", IcingaApplication::GetInstance()->GetNodeName());
fields->Set("is_connected", EndpointIsConnected(endpoint));
void EndpointDbObject::UpdateConnectedStatus(const Endpoint::Ptr& endpoint)
{
- Log(LogDebug, "db_ido", "update is_connected for endpoint '" + endpoint->GetName() + "'");
+ UpdateConnectedStatusInternal(endpoint, true);
+}
+
+void EndpointDbObject::UpdateDisconnectedStatus(const Endpoint::Ptr& endpoint)
+{
+ UpdateConnectedStatusInternal(endpoint, false);
+}
+
+void EndpointDbObject::UpdateConnectedStatusInternal(const Endpoint::Ptr& endpoint, bool connected)
+{
+ Log(LogDebug, "db_ido", "update is_connected=" + Convert::ToString(connected ? 1 : 0) + " for endpoint '" + endpoint->GetName() + "'");
DbQuery query1;
query1.Table = "endpointstatus";
query1.Type = DbQueryUpdate;
Dictionary::Ptr fields1 = make_shared<Dictionary>();
- fields1->Set("is_connected", EndpointIsConnected(endpoint));
+ fields1->Set("is_connected", (connected ? 1 : 0));
fields1->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime()));
query1.Fields = fields1;
return is_connected;
}
+
+void EndpointDbObject::OnConfigUpdate(void)
+{
+ /* update current status on config dump once */
+ Endpoint::Ptr endpoint = static_pointer_cast<Endpoint>(GetObject());
+
+ DbQuery query1;
+ query1.Table = "endpointstatus";
+ query1.Type = DbQueryInsert;
+
+ Dictionary::Ptr fields1 = make_shared<Dictionary>();
+ fields1->Set("identity", endpoint->GetName());
+ fields1->Set("node", IcingaApplication::GetInstance()->GetNodeName());
+ fields1->Set("is_connected", EndpointIsConnected(endpoint));
+ fields1->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime()));
+ fields1->Set("endpoint_object_id", endpoint);
+ fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ query1.Fields = fields1;
+
+ OnQuery(query1);
+}
virtual Dictionary::Ptr GetConfigFields(void) const;
virtual Dictionary::Ptr GetStatusFields(void) const;
+protected:
+ virtual void OnConfigUpdate(void);
+
private:
static void UpdateConnectedStatus(const Endpoint::Ptr& endpoint);
+ static void UpdateDisconnectedStatus(const Endpoint::Ptr& endpoint);
+ static void UpdateConnectedStatusInternal(const Endpoint::Ptr& endpoint, bool connected);
static int EndpointIsConnected(const Endpoint::Ptr& endpoint);
};
#include "base/initialize.h"
#include "base/dynamictype.h"
#include "base/utility.h"
+#include "remote/endpoint.h"
#include "icinga/notification.h"
#include "icinga/checkcommand.h"
#include "icinga/eventcommand.h"
fields1->Set("expiration_time", DbValue::FromTimestamp(comment->GetExpireTime()));
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
DbQuery query1;
if (!historical) {
query1.Table = "comments";
fields1->Set("trigger_time", DbValue::FromTimestamp(downtime->GetTriggerTime()));
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
DbQuery query1;
if (!historical) {
query1.Table = "scheduleddowntime";
fields1->Set("end_time", DbValue::FromTimestamp(end_time));
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("contacts_notified", static_cast<long>(users.size()));
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
fields1->Set("service_object_id", service);
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */
+ String node = IcingaApplication::GetInstance()->GetNodeName();
+
+ Endpoint::Ptr endpoint = Endpoint::GetByName(node);
+ if (endpoint)
+ fields1->Set("endpoint_object_id", endpoint);
+
query1.Fields = fields1;
OnQuery(query1);
}