mirror of
https://github.com/Icinga/icinga2.git
synced 2025-04-08 17:05:25 +02:00
parent
be4166b99e
commit
4d657163c3
@ -22,7 +22,7 @@ mkclass_target(zone.ti zone.thpp)
|
||||
mkembedconfig_target(remote-type.conf remote-type.cpp)
|
||||
|
||||
set(remote_SOURCES
|
||||
apiclient.cpp apifunction.cpp apilistener.cpp apilistener-sync.cpp
|
||||
apiclient.cpp apiclient-heartbeat.cpp apifunction.cpp apilistener.cpp apilistener-sync.cpp
|
||||
apilistener.thpp authority.cpp endpoint.cpp endpoint.thpp jsonrpc.cpp
|
||||
messageorigin.cpp remote-type.cpp zone.cpp zone.thpp
|
||||
)
|
||||
|
73
lib/remote/apiclient-heartbeat.cpp
Normal file
73
lib/remote/apiclient-heartbeat.cpp
Normal file
@ -0,0 +1,73 @@
|
||||
/******************************************************************************
|
||||
* Icinga 2 *
|
||||
* Copyright (C) 2012-2014 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 "remote/apiclient.hpp"
|
||||
#include "remote/messageorigin.hpp"
|
||||
#include "remote/apifunction.hpp"
|
||||
#include "base/initialize.hpp"
|
||||
#include "base/dynamictype.hpp"
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
using namespace icinga;
|
||||
|
||||
REGISTER_APIFUNCTION(Heartbeat, event, &ApiClient::HeartbeatAPIHandler);
|
||||
|
||||
static Timer::Ptr l_HeartbeatTimer;
|
||||
|
||||
static void StartHeartbeatTimer(void)
|
||||
{
|
||||
l_HeartbeatTimer = new Timer();
|
||||
l_HeartbeatTimer->OnTimerExpired.connect(boost::bind(&ApiClient::HeartbeatTimerHandler));
|
||||
l_HeartbeatTimer->SetInterval(10);
|
||||
l_HeartbeatTimer->Start();
|
||||
}
|
||||
|
||||
INITIALIZE_ONCE(StartHeartbeatTimer);
|
||||
|
||||
void ApiClient::HeartbeatTimerHandler(void)
|
||||
{
|
||||
BOOST_FOREACH(const Endpoint::Ptr& endpoint, DynamicType::GetObjectsByType<Endpoint>()) {
|
||||
BOOST_FOREACH(const ApiClient::Ptr& client, endpoint->GetClients()) {
|
||||
if (client->m_NextHeartbeat != 0 && client->m_NextHeartbeat < Utility::GetTime()) {
|
||||
client->Disconnect();
|
||||
continue;
|
||||
}
|
||||
|
||||
Dictionary::Ptr request = new Dictionary();
|
||||
request->Set("jsonrpc", "2.0");
|
||||
request->Set("method", "event::Heartbeat");
|
||||
|
||||
Dictionary::Ptr params = new Dictionary();
|
||||
params->Set("timeout", 30);
|
||||
|
||||
request->Set("params", params);
|
||||
|
||||
client->SendMessage(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Value ApiClient::HeartbeatAPIHandler(const MessageOrigin& origin, const Dictionary::Ptr& params)
|
||||
{
|
||||
Value vtimeout = params->Get("timeout");
|
||||
|
||||
if (!vtimeout.IsEmpty())
|
||||
origin.FromClient->m_NextHeartbeat = Utility::GetTime() + vtimeout;
|
||||
}
|
||||
|
@ -35,7 +35,8 @@ static Value RequestCertificateHandler(const MessageOrigin& origin, const Dictio
|
||||
REGISTER_APIFUNCTION(RequestCertificate, pki, &RequestCertificateHandler);
|
||||
|
||||
ApiClient::ApiClient(const String& identity, bool authenticated, const TlsStream::Ptr& stream, ConnectionRole role)
|
||||
: m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream), m_Role(role), m_Seen(Utility::GetTime())
|
||||
: m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream), m_Role(role), m_Seen(Utility::GetTime()),
|
||||
m_NextHeartbeat(0)
|
||||
{
|
||||
if (authenticated)
|
||||
m_Endpoint = Endpoint::GetByName(identity);
|
||||
|
@ -35,6 +35,8 @@ enum ClientRole
|
||||
ClientOutbound
|
||||
};
|
||||
|
||||
class MessageOrigin;
|
||||
|
||||
/**
|
||||
* An API client connection.
|
||||
*
|
||||
@ -60,6 +62,9 @@ public:
|
||||
|
||||
void SendMessage(const Dictionary::Ptr& request);
|
||||
|
||||
static void HeartbeatTimerHandler(void);
|
||||
static Value HeartbeatAPIHandler(const MessageOrigin& origin, const Dictionary::Ptr& params);
|
||||
|
||||
private:
|
||||
String m_Identity;
|
||||
bool m_Authenticated;
|
||||
@ -67,6 +72,7 @@ private:
|
||||
TlsStream::Ptr m_Stream;
|
||||
ConnectionRole m_Role;
|
||||
double m_Seen;
|
||||
double m_NextHeartbeat;
|
||||
|
||||
WorkQueue m_WriteQueue;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user