Added get_connections RPC call to daemon

This commit is contained in:
Thomas Winget 2014-07-18 19:33:03 -04:00
parent 905b67bc79
commit 9f88b7ce6b
6 changed files with 116 additions and 0 deletions

View file

@ -14,6 +14,41 @@ namespace cryptonote
#define BC_COMMANDS_POOL_BASE 2000
/************************************************************************/
/* P2P connection info, serializable to json */
/************************************************************************/
struct connection_info
{
bool incoming;
std::string ip;
std::string port;
std::string peer_id;
uint64_t recv_count;
time_t recv_idle_time;
uint64_t send_count;
time_t send_idle_time;
std::string state;
time_t live_time;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(incoming)
KV_SERIALIZE(ip)
KV_SERIALIZE(port)
KV_SERIALIZE(peer_id)
KV_SERIALIZE(recv_count)
KV_SERIALIZE(recv_idle_time)
KV_SERIALIZE(send_count)
KV_SERIALIZE(send_idle_time)
KV_SERIALIZE(state)
KV_SERIALIZE(live_time)
END_KV_SERIALIZE_MAP()
};
/************************************************************************/
/* */

View file

@ -5,6 +5,8 @@
#pragma once
#include <boost/program_options/variables_map.hpp>
#include <string>
#include <ctime>
#include "storages/levin_abstract_invoke2.h"
#include "warnings.h"
@ -53,6 +55,7 @@ namespace cryptonote
t_core& get_core(){return m_core;}
bool is_synchronized(){return m_synchronized;}
void log_connections();
std::list<connection_info> get_connections();
private:
//----------------- commands handlers ----------------------------------------------
int handle_notify_new_block(int command, NOTIFY_NEW_BLOCK::request& arg, cryptonote_connection_context& context);

View file

@ -3,6 +3,8 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <boost/interprocess/detail/atomic.hpp>
#include <list>
#include "cryptonote_core/cryptonote_format_utils.h"
#include "profile_tools.h"
namespace cryptonote
@ -90,6 +92,45 @@ namespace cryptonote
});
LOG_PRINT_L0("Connections: " << ENDL << ss.str());
}
//------------------------------------------------------------------------------------------------------------------------
// Returns a list of connection_info objects describing each open p2p connection
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
std::list<connection_info> t_cryptonote_protocol_handler<t_core>::get_connections()
{
std::list<connection_info> connections;
m_p2p->for_each_connection([&](const connection_context& cntxt, nodetool::peerid_type peer_id)
{
connection_info cnx;
auto timestamp = time(NULL);
cnx.incoming = cntxt.m_is_income ? true : false;
cnx.ip = epee::string_tools::get_ip_string_from_int32(cntxt.m_remote_ip);
cnx.port = std::to_string(cntxt.m_remote_port);
std::stringstream peer_id_str;
peer_id_str << std::hex << peer_id;
peer_id_str >> cnx.peer_id;
cnx.recv_count = cntxt.m_recv_cnt;
cnx.recv_idle_time = timestamp - cntxt.m_last_recv;
cnx.send_count = cntxt.m_send_cnt;
cnx.send_idle_time = timestamp;
cnx.state = get_protocol_state_string(cntxt.m_state);
cnx.live_time = timestamp - cntxt.m_started;
connections.push_back(cnx);
return true;
});
return connections;
}
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
bool t_cryptonote_protocol_handler<t_core>::process_payload_sync_data(const CORE_SYNC_DATA& hshd, cryptonote_connection_context& context, bool is_inital)