mirror of https://github.com/Icinga/icinga2.git
Refactored subscription handling into a separate component.
This commit is contained in:
parent
fd64dc5a99
commit
2cd43ed8c6
|
@ -81,13 +81,13 @@ void Application::RunEventLoop(void)
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
time_t next = Timer::GetNextCall();
|
time_t next = Timer::GetNextCall();
|
||||||
long sleep = (next < now) ? 0 : (next - now);
|
time_t sleep = (next < now) ? 0 : (next - now);
|
||||||
|
|
||||||
if (m_ShuttingDown)
|
if (m_ShuttingDown)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
timeval tv;
|
timeval tv;
|
||||||
tv.tv_sec = (sleep < 0) ? 0 : sleep;
|
tv.tv_sec = (sleep < 0) ? 0 : (long)sleep;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
int ready;
|
int ready;
|
||||||
|
|
|
@ -7,7 +7,7 @@ void Component::SetApplication(const Application::WeakPtr& application)
|
||||||
m_Application = application;
|
m_Application = application;
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Ptr Component::GetApplication(void)
|
Application::Ptr Component::GetApplication(void) const
|
||||||
{
|
{
|
||||||
return m_Application.lock();
|
return m_Application.lock();
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ void Component::SetConfig(const ConfigObject::Ptr& componentConfig)
|
||||||
m_Config = componentConfig;
|
m_Config = componentConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigObject::Ptr Component::GetConfig(void)
|
ConfigObject::Ptr Component::GetConfig(void) const
|
||||||
{
|
{
|
||||||
return m_Config;
|
return m_Config;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,12 @@ public:
|
||||||
typedef weak_ptr<Component> WeakPtr;
|
typedef weak_ptr<Component> WeakPtr;
|
||||||
|
|
||||||
void SetApplication(const Application::WeakPtr& application);
|
void SetApplication(const Application::WeakPtr& application);
|
||||||
Application::Ptr GetApplication(void);
|
Application::Ptr GetApplication(void) const;
|
||||||
|
|
||||||
void SetConfig(const ConfigObject::Ptr& componentConfig);
|
void SetConfig(const ConfigObject::Ptr& componentConfig);
|
||||||
ConfigObject::Ptr GetConfig(void);
|
ConfigObject::Ptr GetConfig(void) const;
|
||||||
|
|
||||||
virtual string GetName(void) = 0;
|
virtual string GetName(void) const = 0;
|
||||||
virtual void Start(void) = 0;
|
virtual void Start(void) = 0;
|
||||||
virtual void Stop(void) = 0;
|
virtual void Stop(void) = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# define HAVE_CXX11
|
# define HAVE_CXX11
|
||||||
# pragma warning(disable:4251)
|
# pragma warning(disable:4251)
|
||||||
|
# define _CRT_SECURE_NO_DEPRECATE
|
||||||
#else /* _MSC_VER */
|
#else /* _MSC_VER */
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
|
|
|
@ -23,6 +23,7 @@ void Variant::Convert(VariantType newType) const
|
||||||
if (newType == m_Type)
|
if (newType == m_Type)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// TODO: convert variant data
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
string ConfigFileComponent::GetName(void)
|
string ConfigFileComponent::GetName(void) const
|
||||||
{
|
{
|
||||||
return "configfilecomponent";
|
return "configfilecomponent";
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ public:
|
||||||
typedef shared_ptr<ConfigFileComponent> Ptr;
|
typedef shared_ptr<ConfigFileComponent> Ptr;
|
||||||
typedef weak_ptr<ConfigFileComponent> WeakPtr;
|
typedef weak_ptr<ConfigFileComponent> WeakPtr;
|
||||||
|
|
||||||
virtual string GetName(void);
|
virtual string GetName(void) const;
|
||||||
virtual void Start(void);
|
virtual void Start(void);
|
||||||
virtual void Stop(void);
|
virtual void Stop(void);
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,12 +46,12 @@
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(SolutionDir)\cJSON;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(SolutionDir)\cJSON;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
|
|
@ -7,7 +7,7 @@ IcingaApplication::Ptr ConfigRpcComponent::GetIcingaApplication(void)
|
||||||
return static_pointer_cast<IcingaApplication>(GetApplication());
|
return static_pointer_cast<IcingaApplication>(GetApplication());
|
||||||
}
|
}
|
||||||
|
|
||||||
string ConfigRpcComponent::GetName(void)
|
string ConfigRpcComponent::GetName(void) const
|
||||||
{
|
{
|
||||||
return "configcomponent";
|
return "configcomponent";
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ private:
|
||||||
JsonRpcRequest MakeObjectMessage(const ConfigObject::Ptr& object, string method, bool includeProperties);
|
JsonRpcRequest MakeObjectMessage(const ConfigObject::Ptr& object, string method, bool includeProperties);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual string GetName(void);
|
virtual string GetName(void) const;
|
||||||
virtual void Start(void);
|
virtual void Start(void);
|
||||||
virtual void Stop(void);
|
virtual void Stop(void);
|
||||||
};
|
};
|
||||||
|
|
|
@ -43,12 +43,12 @@
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\cJSON;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\cJSON;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\icinga;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
|
|
@ -26,9 +26,8 @@ void EndpointManager::AddListener(unsigned short port)
|
||||||
void EndpointManager::AddConnection(string host, unsigned short port)
|
void EndpointManager::AddConnection(string host, unsigned short port)
|
||||||
{
|
{
|
||||||
JsonRpcEndpoint::Ptr endpoint = make_shared<JsonRpcEndpoint>();
|
JsonRpcEndpoint::Ptr endpoint = make_shared<JsonRpcEndpoint>();
|
||||||
RegisterEndpoint(endpoint);
|
|
||||||
|
|
||||||
endpoint->Connect(host, port);
|
endpoint->Connect(host, port);
|
||||||
|
RegisterEndpoint(endpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EndpointManager::RegisterServer(JsonRpcServer::Ptr server)
|
void EndpointManager::RegisterServer(JsonRpcServer::Ptr server)
|
||||||
|
@ -40,9 +39,8 @@ void EndpointManager::RegisterServer(JsonRpcServer::Ptr server)
|
||||||
int EndpointManager::NewClientHandler(const NewClientEventArgs& ncea)
|
int EndpointManager::NewClientHandler(const NewClientEventArgs& ncea)
|
||||||
{
|
{
|
||||||
JsonRpcEndpoint::Ptr endpoint = make_shared<JsonRpcEndpoint>();
|
JsonRpcEndpoint::Ptr endpoint = make_shared<JsonRpcEndpoint>();
|
||||||
RegisterEndpoint(endpoint);
|
|
||||||
|
|
||||||
endpoint->SetClient(static_pointer_cast<JsonRpcClient>(ncea.Client));
|
endpoint->SetClient(static_pointer_cast<JsonRpcClient>(ncea.Client));
|
||||||
|
RegisterEndpoint(endpoint);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +61,11 @@ void EndpointManager::RegisterEndpoint(Endpoint::Ptr endpoint)
|
||||||
|
|
||||||
endpoint->OnNewMethodSource += bind_weak(&EndpointManager::NewMethodSourceHandler, shared_from_this());
|
endpoint->OnNewMethodSource += bind_weak(&EndpointManager::NewMethodSourceHandler, shared_from_this());
|
||||||
endpoint->ForeachMethodSource(bind(&EndpointManager::NewMethodSourceHandler, this, _1));
|
endpoint->ForeachMethodSource(bind(&EndpointManager::NewMethodSourceHandler, this, _1));
|
||||||
|
|
||||||
|
NewEndpointEventArgs neea;
|
||||||
|
neea.Source = shared_from_this();
|
||||||
|
neea.Endpoint = endpoint;
|
||||||
|
OnNewEndpoint(neea);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EndpointManager::UnregisterEndpoint(Endpoint::Ptr endpoint)
|
void EndpointManager::UnregisterEndpoint(Endpoint::Ptr endpoint)
|
||||||
|
@ -143,9 +146,12 @@ int EndpointManager::NewMethodSourceHandler(const NewMethodEventArgs& ea)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EndpointManager::ForeachEndpoint(function<int (Endpoint::Ptr)> callback)
|
void EndpointManager::ForeachEndpoint(function<int (const NewEndpointEventArgs&)> callback)
|
||||||
{
|
{
|
||||||
|
NewEndpointEventArgs neea;
|
||||||
|
neea.Source = shared_from_this();
|
||||||
for (list<Endpoint::Ptr>::iterator i = m_Endpoints.begin(); i != m_Endpoints.end(); i++) {
|
for (list<Endpoint::Ptr>::iterator i = m_Endpoints.begin(); i != m_Endpoints.end(); i++) {
|
||||||
callback(*i);
|
neea.Endpoint = *i;
|
||||||
|
callback(neea);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,11 @@
|
||||||
namespace icinga
|
namespace icinga
|
||||||
{
|
{
|
||||||
|
|
||||||
|
struct I2_ICINGA_API NewEndpointEventArgs : public EventArgs
|
||||||
|
{
|
||||||
|
Endpoint::Ptr Endpoint;
|
||||||
|
};
|
||||||
|
|
||||||
class I2_ICINGA_API EndpointManager : public Object
|
class I2_ICINGA_API EndpointManager : public Object
|
||||||
{
|
{
|
||||||
list<JsonRpcServer::Ptr> m_Servers;
|
list<JsonRpcServer::Ptr> m_Servers;
|
||||||
|
@ -34,7 +39,9 @@ public:
|
||||||
void SendAnycastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true);
|
void SendAnycastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true);
|
||||||
void SendMulticastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true);
|
void SendMulticastRequest(Endpoint::Ptr sender, const JsonRpcRequest& request, bool fromLocal = true);
|
||||||
|
|
||||||
void ForeachEndpoint(function<int (Endpoint::Ptr)> callback);
|
void ForeachEndpoint(function<int (const NewEndpointEventArgs&)> callback);
|
||||||
|
|
||||||
|
Event<NewEndpointEventArgs> OnNewEndpoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,5 +16,6 @@
|
||||||
#include "virtualendpoint.h"
|
#include "virtualendpoint.h"
|
||||||
#include "endpointmanager.h"
|
#include "endpointmanager.h"
|
||||||
#include "icingaapplication.h"
|
#include "icingaapplication.h"
|
||||||
|
#include "subscriptioncomponent.h"
|
||||||
|
|
||||||
#endif /* I2ICINGA_H */
|
#endif /* I2ICINGA_H */
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<ClCompile Include="endpointmanager.cpp" />
|
<ClCompile Include="endpointmanager.cpp" />
|
||||||
<ClCompile Include="icingaapplication.cpp" />
|
<ClCompile Include="icingaapplication.cpp" />
|
||||||
<ClCompile Include="jsonrpcendpoint.cpp" />
|
<ClCompile Include="jsonrpcendpoint.cpp" />
|
||||||
|
<ClCompile Include="subscriptioncomponent.cpp" />
|
||||||
<ClCompile Include="virtualendpoint.cpp" />
|
<ClCompile Include="virtualendpoint.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
<ClInclude Include="i2-icinga.h" />
|
<ClInclude Include="i2-icinga.h" />
|
||||||
<ClInclude Include="icingaapplication.h" />
|
<ClInclude Include="icingaapplication.h" />
|
||||||
<ClInclude Include="jsonrpcendpoint.h" />
|
<ClInclude Include="jsonrpcendpoint.h" />
|
||||||
|
<ClInclude Include="subscriptioncomponent.h" />
|
||||||
<ClInclude Include="virtualendpoint.h" />
|
<ClInclude Include="virtualendpoint.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
|
@ -55,12 +57,12 @@
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\cJSON;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(SolutionDir)\cJSON;$(IncludePath)</IncludePath>
|
<IncludePath>$(SolutionDir)\base;$(SolutionDir)\jsonrpc;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(OutDir);$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
|
|
@ -54,6 +54,9 @@ int IcingaApplication::Main(const vector<string>& args)
|
||||||
|
|
||||||
connectionCollection->OnObjectRemoved += bind_weak(&IcingaApplication::DeletedRpcConnectionHandler, shared_from_this());
|
connectionCollection->OnObjectRemoved += bind_weak(&IcingaApplication::DeletedRpcConnectionHandler, shared_from_this());
|
||||||
|
|
||||||
|
SubscriptionComponent::Ptr subscriptionsComponent = make_shared<SubscriptionComponent>();
|
||||||
|
RegisterComponent(subscriptionsComponent);
|
||||||
|
|
||||||
ConfigObject::Ptr fileComponentConfig = make_shared<ConfigObject>("component", "configfile");
|
ConfigObject::Ptr fileComponentConfig = make_shared<ConfigObject>("component", "configfile");
|
||||||
fileComponentConfig->SetProperty("configFilename", args[1]);
|
fileComponentConfig->SetProperty("configFilename", args[1]);
|
||||||
fileComponentConfig->SetPropertyInteger("replicate", 0);
|
fileComponentConfig->SetPropertyInteger("replicate", 0);
|
||||||
|
@ -84,7 +87,7 @@ int IcingaApplication::TestTimerHandler(const TimerEventArgs& tea)
|
||||||
request.SetVersion("2.0");
|
request.SetVersion("2.0");
|
||||||
request.SetMethod("test");
|
request.SetMethod("test");
|
||||||
|
|
||||||
for (int i = 0; i < 10000; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
m_EndpointManager->SendMulticastRequest(m_TestEndpoint, request);
|
m_EndpointManager->SendMulticastRequest(m_TestEndpoint, request);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -17,51 +17,12 @@ void JsonRpcEndpoint::Connect(string host, unsigned short port)
|
||||||
SetClient(client);
|
SetClient(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
int JsonRpcEndpoint::SyncSubscription(string type, const NewMethodEventArgs& nmea)
|
|
||||||
{
|
|
||||||
JsonRpcRequest request;
|
|
||||||
request.SetVersion("2.0");
|
|
||||||
request.SetMethod(type);
|
|
||||||
|
|
||||||
Message params;
|
|
||||||
params.GetDictionary()->SetValueString("method", nmea.Method);
|
|
||||||
request.SetParams(params);
|
|
||||||
|
|
||||||
m_Client->SendMessage(request);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int JsonRpcEndpoint::SyncSubscriptions(Endpoint::Ptr endpoint)
|
|
||||||
{
|
|
||||||
if (!endpoint->IsLocal())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
endpoint->ForeachMethodSink(bind(&JsonRpcEndpoint::SyncSubscription, this, "message::Subscribe", _1));
|
|
||||||
endpoint->ForeachMethodSource(bind(&JsonRpcEndpoint::SyncSubscription, this, "message::Provide", _1));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonRpcEndpoint::SetClient(JsonRpcClient::Ptr client)
|
void JsonRpcEndpoint::SetClient(JsonRpcClient::Ptr client)
|
||||||
{
|
{
|
||||||
m_Client = client;
|
m_Client = client;
|
||||||
client->OnNewMessage += bind_weak(&JsonRpcEndpoint::NewMessageHandler, shared_from_this());
|
client->OnNewMessage += bind_weak(&JsonRpcEndpoint::NewMessageHandler, shared_from_this());
|
||||||
client->OnClosed += bind_weak(&JsonRpcEndpoint::ClientClosedHandler, shared_from_this());
|
client->OnClosed += bind_weak(&JsonRpcEndpoint::ClientClosedHandler, shared_from_this());
|
||||||
client->OnError += bind_weak(&JsonRpcEndpoint::ClientErrorHandler, shared_from_this());
|
client->OnError += bind_weak(&JsonRpcEndpoint::ClientErrorHandler, shared_from_this());
|
||||||
|
|
||||||
NewMethodEventArgs nmea;
|
|
||||||
nmea.Source = shared_from_this();
|
|
||||||
|
|
||||||
nmea.Method = "message::Subscribe";
|
|
||||||
SyncSubscription("message::Subscribe", nmea);
|
|
||||||
SyncSubscription("message::Provide", nmea);
|
|
||||||
|
|
||||||
nmea.Method = "message::Provide";
|
|
||||||
SyncSubscription("message::Subscribe", nmea);
|
|
||||||
SyncSubscription("message::Provide", nmea);
|
|
||||||
|
|
||||||
GetEndpointManager()->ForeachEndpoint(bind(&JsonRpcEndpoint::SyncSubscriptions, this, _1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JsonRpcEndpoint::IsLocal(void) const
|
bool JsonRpcEndpoint::IsLocal(void) const
|
||||||
|
|
|
@ -18,9 +18,6 @@ private:
|
||||||
int ClientErrorHandler(const SocketErrorEventArgs& ea);
|
int ClientErrorHandler(const SocketErrorEventArgs& ea);
|
||||||
int ClientReconnectHandler(const TimerEventArgs& ea);
|
int ClientReconnectHandler(const TimerEventArgs& ea);
|
||||||
|
|
||||||
int SyncSubscription(string type, const NewMethodEventArgs& nmea);
|
|
||||||
int SyncSubscriptions(Endpoint::Ptr endpoint);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef shared_ptr<JsonRpcEndpoint> Ptr;
|
typedef shared_ptr<JsonRpcEndpoint> Ptr;
|
||||||
typedef weak_ptr<JsonRpcEndpoint> WeakPtr;
|
typedef weak_ptr<JsonRpcEndpoint> WeakPtr;
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
#include "i2-icinga.h"
|
||||||
|
|
||||||
|
using namespace icinga;
|
||||||
|
|
||||||
|
IcingaApplication::Ptr SubscriptionComponent::GetIcingaApplication(void) const
|
||||||
|
{
|
||||||
|
return static_pointer_cast<IcingaApplication>(GetApplication());
|
||||||
|
}
|
||||||
|
|
||||||
|
string SubscriptionComponent::GetName(void) const
|
||||||
|
{
|
||||||
|
return "subscriptioncomponent";
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriptionComponent::Start(void)
|
||||||
|
{
|
||||||
|
m_SubscriptionEndpoint = make_shared<VirtualEndpoint>();
|
||||||
|
m_SubscriptionEndpoint->RegisterMethodHandler("message::Subscribe", bind_weak(&SubscriptionComponent::SubscribeMessageHandler, shared_from_this()));
|
||||||
|
m_SubscriptionEndpoint->RegisterMethodHandler("message::Provide", bind_weak(&SubscriptionComponent::ProvideMessageHandler, shared_from_this()));
|
||||||
|
m_SubscriptionEndpoint->RegisterMethodSource("message::Subscribe");
|
||||||
|
m_SubscriptionEndpoint->RegisterMethodSource("message::Provide");
|
||||||
|
|
||||||
|
EndpointManager::Ptr mgr = GetIcingaApplication()->GetEndpointManager();
|
||||||
|
mgr->OnNewEndpoint += bind_weak(&SubscriptionComponent::NewEndpointHandler, shared_from_this());
|
||||||
|
mgr->ForeachEndpoint(bind(&SubscriptionComponent::NewEndpointHandler, this, _1));
|
||||||
|
mgr->RegisterEndpoint(m_SubscriptionEndpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubscriptionComponent::Stop(void)
|
||||||
|
{
|
||||||
|
EndpointManager::Ptr mgr = GetIcingaApplication()->GetEndpointManager();
|
||||||
|
mgr->UnregisterEndpoint(m_SubscriptionEndpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SubscriptionComponent::SyncSubscription(Endpoint::Ptr target, string type, const NewMethodEventArgs& nmea)
|
||||||
|
{
|
||||||
|
JsonRpcRequest request;
|
||||||
|
request.SetVersion("2.0");
|
||||||
|
request.SetMethod(type);
|
||||||
|
|
||||||
|
Message params;
|
||||||
|
params.GetDictionary()->SetValueString("method", nmea.Method);
|
||||||
|
request.SetParams(params);
|
||||||
|
|
||||||
|
target->ProcessRequest(m_SubscriptionEndpoint, request);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SubscriptionComponent::SyncSubscriptions(Endpoint::Ptr target, const NewEndpointEventArgs& neea)
|
||||||
|
{
|
||||||
|
Endpoint::Ptr source = neea.Endpoint;
|
||||||
|
|
||||||
|
if (!source->IsLocal())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
source->ForeachMethodSink(bind(&SubscriptionComponent::SyncSubscription, this, target, "message::Subscribe", _1));
|
||||||
|
source->ForeachMethodSource(bind(&SubscriptionComponent::SyncSubscription, this, target, "message::Provide", _1));
|
||||||
|
|
||||||
|
// TODO: bind to endpoint's events
|
||||||
|
//endpoint->OnNewMethodSink...
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SubscriptionComponent::NewEndpointHandler(const NewEndpointEventArgs& neea)
|
||||||
|
{
|
||||||
|
if (neea.Endpoint->IsLocal())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
EndpointManager::Ptr mgr = GetIcingaApplication()->GetEndpointManager();
|
||||||
|
mgr->ForeachEndpoint(bind(&SubscriptionComponent::SyncSubscriptions, this, neea.Endpoint, _1));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SubscriptionComponent::SubscribeMessageHandler(const NewRequestEventArgs& nrea)
|
||||||
|
{
|
||||||
|
Message params;
|
||||||
|
if (!nrea.Request.GetParams(¶ms))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
string method;
|
||||||
|
if (!params.GetDictionary()->GetValueString("method", &method))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
nrea.Sender->RegisterMethodSink(method);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SubscriptionComponent::ProvideMessageHandler(const NewRequestEventArgs& nrea)
|
||||||
|
{
|
||||||
|
Message params;
|
||||||
|
if (!nrea.Request.GetParams(¶ms))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
string method;
|
||||||
|
if (!params.GetDictionary()->GetValueString("method", &method))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
nrea.Sender->RegisterMethodSource(method);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef I2_SUBSCRIPTIONCOMPONENT_H
|
||||||
|
#define I2_SUBSCRIPTIONCOMPONENT_H
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
class SubscriptionComponent : public Component
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
VirtualEndpoint::Ptr m_SubscriptionEndpoint;
|
||||||
|
|
||||||
|
IcingaApplication::Ptr GetIcingaApplication(void) const;
|
||||||
|
|
||||||
|
int NewEndpointHandler(const NewEndpointEventArgs& neea);
|
||||||
|
int SubscribeMessageHandler(const NewRequestEventArgs& nrea);
|
||||||
|
int ProvideMessageHandler(const NewRequestEventArgs& nrea);
|
||||||
|
|
||||||
|
int SyncSubscription(Endpoint::Ptr target, string type, const NewMethodEventArgs& nmea);
|
||||||
|
int SyncSubscriptions(Endpoint::Ptr target, const NewEndpointEventArgs& neea);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual string GetName(void) const;
|
||||||
|
virtual void Start(void);
|
||||||
|
virtual void Stop(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* I2_SUBSCRIPTIONCOMPONENT_H */
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <i2-base.h>
|
#include <i2-base.h>
|
||||||
#include <cJSON.h>
|
|
||||||
|
|
||||||
#ifdef I2_JSONRPC_BUILD
|
#ifdef I2_JSONRPC_BUILD
|
||||||
# define I2_JSONRPC_API I2_EXPORT
|
# define I2_JSONRPC_API I2_EXPORT
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include "i2-jsonrpc.h"
|
#include "i2-jsonrpc.h"
|
||||||
|
#include <cJSON.h>
|
||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
Dictionary::Ptr Netstring::GetDictionaryFromJson(cJSON *json)
|
Dictionary::Ptr Netstring::GetDictionaryFromJson(json_t *json)
|
||||||
{
|
{
|
||||||
Dictionary::Ptr dictionary = make_shared<Dictionary>();
|
Dictionary::Ptr dictionary = make_shared<Dictionary>();
|
||||||
|
|
||||||
|
@ -26,7 +27,7 @@ Dictionary::Ptr Netstring::GetDictionaryFromJson(cJSON *json)
|
||||||
return dictionary;
|
return dictionary;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *Netstring::GetJsonFromDictionary(const Dictionary::Ptr& dictionary)
|
json_t *Netstring::GetJsonFromDictionary(const Dictionary::Ptr& dictionary)
|
||||||
{
|
{
|
||||||
cJSON *json;
|
cJSON *json;
|
||||||
string valueString;
|
string valueString;
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
#ifndef NETSTRING_H
|
#ifndef NETSTRING_H
|
||||||
#define NETSTRING_H
|
#define NETSTRING_H
|
||||||
|
|
||||||
|
struct cJSON;
|
||||||
|
|
||||||
namespace icinga
|
namespace icinga
|
||||||
{
|
{
|
||||||
|
|
||||||
|
typedef ::cJSON json_t;
|
||||||
|
|
||||||
class I2_JSONRPC_API Netstring : public Object
|
class I2_JSONRPC_API Netstring : public Object
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
size_t m_Length;
|
size_t m_Length;
|
||||||
void *m_Data;
|
void *m_Data;
|
||||||
|
|
||||||
static Dictionary::Ptr GetDictionaryFromJson(cJSON *json);
|
static Dictionary::Ptr GetDictionaryFromJson(json_t *json);
|
||||||
static cJSON *GetJsonFromDictionary(const Dictionary::Ptr& dictionary);
|
static json_t *GetJsonFromDictionary(const Dictionary::Ptr& dictionary);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef shared_ptr<Netstring> Ptr;
|
typedef shared_ptr<Netstring> Ptr;
|
||||||
|
|
Loading…
Reference in New Issue