From 51e03fad1d3d80f92e45c7eddee452b7bac9d76b Mon Sep 17 00:00:00 2001 From: Zachary Michaels Date: Tue, 24 Jun 2014 16:59:17 -0400 Subject: [PATCH] RPC print_pl --- src/daemon/rpc_command_executor.cpp | 47 +++++++++++++++++++++---- src/daemon/rpc_command_executor.h | 4 +-- src/p2p/net_node.h | 4 +++ src/p2p/net_node.inl | 9 +++++ src/rpc/core_rpc_server.cpp | 22 ++++++++++++ src/rpc/core_rpc_server.h | 2 ++ src/rpc/core_rpc_server_commands_defs.h | 42 ++++++++++++++++++++++ 7 files changed, 122 insertions(+), 8 deletions(-) diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp index ab45302f8..eb33b72ff 100644 --- a/src/daemon/rpc_command_executor.cpp +++ b/src/daemon/rpc_command_executor.cpp @@ -4,9 +4,28 @@ #include "daemon/http_connection.h" #include "daemon/rpc_command_executor.h" #include "rpc/core_rpc_server_commands_defs.h" +#include +#include namespace daemonize { +namespace { + void print_peer(std::string const & prefix, cryptonote::peer const & peer) + { + time_t now; + time(&now); + + std::string id_str; + std::string port_str; + std::string elapsed = epee::misc_utils::get_time_interval_string(now - peer.last_seen); + std::string ip_str = epee::string_tools::get_ip_string_from_int32(peer.ip); + epee::string_tools::xtype_to_string(peer.id, id_str); + epee::string_tools::xtype_to_string(peer.port, port_str); + std::string addr_str = ip_str + ":" + port_str; + tools::msg_writer() << boost::format("%-10s %-25s %-25s %s") % prefix % id_str % addr_str % elapsed; + } +} + t_rpc_command_executor::t_host_result t_rpc_command_executor::parse_host( std::string const & rpc_host_ip_str, std::string const & rpc_host_port_str) { @@ -28,7 +47,23 @@ t_rpc_command_executor::t_rpc_command_executor(std::string && rpc_host_ip_str, s t_rpc_command_executor::t_rpc_command_executor(t_rpc_command_executor && other) = default; bool t_rpc_command_executor::print_peer_list() { - std::cout << "print peer list" << std::endl; + cryptonote::COMMAND_RPC_GET_PEER_LIST::request req; + cryptonote::COMMAND_RPC_GET_PEER_LIST::response res; + + bool ok = rpc_request(req, res, "/get_peer_list", "Couldn't retrieve peer list"); + + if (!ok) return false; + + for (auto & peer : res.white_list) + { + print_peer("white", peer); + } + + for (auto & peer : res.gray_list) + { + print_peer("gray", peer); + } + return true; } @@ -123,8 +158,8 @@ bool t_rpc_command_executor::stop_mining() { template bool t_rpc_command_executor::rpc_request( - T_req & request - , T_res & response + T_req & req + , T_res & res , std::string const & relative_url , std::string const & fail_msg ) @@ -133,15 +168,15 @@ bool t_rpc_command_executor::rpc_request( t_http_connection connection(mp_http_client.get(), m_rpc_host_ip_str, m_rpc_host_port_str); bool ok = connection.is_open(); - ok = ok && epee::net_utils::invoke_http_json_remote_command2(rpc_url, request, response, *mp_http_client); + ok = ok && epee::net_utils::invoke_http_json_remote_command2(rpc_url, req, res, *mp_http_client); if (!ok) { tools::fail_msg_writer() << "Couldn't connect to daemon"; return false; } - else if (response.status != CORE_RPC_STATUS_OK) + else if (res.status != CORE_RPC_STATUS_OK) // TODO - handle CORE_RPC_STATUS_BUSY ? { - tools::fail_msg_writer() << fail_msg << " -- " << response.status; + tools::fail_msg_writer() << fail_msg << " -- " << res.status; return false; } else diff --git a/src/daemon/rpc_command_executor.h b/src/daemon/rpc_command_executor.h index 8ef9e7211..88707277f 100644 --- a/src/daemon/rpc_command_executor.h +++ b/src/daemon/rpc_command_executor.h @@ -60,8 +60,8 @@ public: private: template bool rpc_request( - T_req & request - , T_res & response + T_req & req + , T_res & res , std::string const & relative_url , std::string const & fail_msg ); diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h index e87918038..b886d43c9 100644 --- a/src/p2p/net_node.h +++ b/src/p2p/net_node.h @@ -72,6 +72,10 @@ namespace nodetool a & m_config.m_peer_id; } // debug functions + void get_peerlist( + std::list & white_list + , std::list & gray_list + ); bool log_peerlist(); bool log_connections(); virtual uint64_t get_connections_count(); diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index 16140cf35..0ccb3566a 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -1072,6 +1072,15 @@ namespace nodetool } //----------------------------------------------------------------------------------- template + void node_server::get_peerlist( + std::list & white_list + , std::list & gray_list + ) + { + m_peerlist.get_peerlist_full(gray_list, white_list); + } + //----------------------------------------------------------------------------------- + template bool node_server::log_peerlist() { std::list pl_wite; diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index a19ab8d57..830da12ab 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -11,6 +11,7 @@ using namespace epee; #include "cryptonote_core/cryptonote_format_utils.h" #include "cryptonote_core/account.h" #include "cryptonote_core/cryptonote_basic_impl.h" +#include "p2p/p2p_protocol_defs.h" #include "misc_language.h" #include "crypto/hash.h" #include "core_rpc_server_error_codes.h" @@ -311,6 +312,27 @@ namespace cryptonote return true; } //------------------------------------------------------------------------------------------------------------------------------ + bool core_rpc_server::on_get_peer_list(const COMMAND_RPC_GET_PEER_LIST::request& req, COMMAND_RPC_GET_PEER_LIST::response& res, connection_context& cntx) + { + // No need to worry about the core here + std::list white_list; + std::list gray_list; + m_p2p.get_peerlist(white_list, gray_list); + + for (auto & entry : white_list) + { + res.white_list.emplace_back(entry.id, entry.adr.ip, entry.adr.port, entry.last_seen); + } + + for (auto & entry : gray_list) + { + res.gray_list.emplace_back(entry.id, entry.adr.ip, entry.adr.port, entry.last_seen); + } + + res.status = CORE_RPC_STATUS_OK; + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ bool core_rpc_server::on_getblockcount(const COMMAND_RPC_GETBLOCKCOUNT::request& req, COMMAND_RPC_GETBLOCKCOUNT::response& res, connection_context& cntx) { CHECK_CORE_BUSY(); diff --git a/src/rpc/core_rpc_server.h b/src/rpc/core_rpc_server.h index 82b82cd2a..5ee277647 100644 --- a/src/rpc/core_rpc_server.h +++ b/src/rpc/core_rpc_server.h @@ -46,6 +46,7 @@ namespace cryptonote MAP_URI_AUTO_JON2("/mining_status", on_mining_status, COMMAND_RPC_MINING_STATUS) MAP_URI_AUTO_JON2("/save_bc", on_save_bc, COMMAND_RPC_SAVE_BC) MAP_URI_AUTO_JON2("/getinfo", on_get_info, COMMAND_RPC_GET_INFO) + MAP_URI_AUTO_JON2("/get_peer_list", on_get_peer_list, COMMAND_RPC_GET_PEER_LIST) BEGIN_JSON_RPC_MAP("/json_rpc") MAP_JON_RPC("getblockcount", on_getblockcount, COMMAND_RPC_GETBLOCKCOUNT) MAP_JON_RPC_WE("on_getblockhash", on_getblockhash, COMMAND_RPC_GETBLOCKHASH) @@ -68,6 +69,7 @@ namespace cryptonote bool on_get_random_outs(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res, connection_context& cntx); bool on_get_info(const COMMAND_RPC_GET_INFO::request& req, COMMAND_RPC_GET_INFO::response& res, connection_context& cntx); bool on_save_bc(const COMMAND_RPC_SAVE_BC::request& req, COMMAND_RPC_SAVE_BC::response& res, connection_context& cntx); + bool on_get_peer_list(const COMMAND_RPC_GET_PEER_LIST::request& req, COMMAND_RPC_GET_PEER_LIST::response& res, connection_context& cntx); //json_rpc bool on_getblockcount(const COMMAND_RPC_GETBLOCKCOUNT::request& req, COMMAND_RPC_GETBLOCKCOUNT::response& res, connection_context& cntx); diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index c525b55e2..84a7f1dd0 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -477,5 +477,47 @@ namespace cryptonote }; + struct peer { + uint64_t id; + uint32_t ip; + uint16_t port; + time_t last_seen; + + peer() = default; + + peer(uint64_t id, uint32_t ip, uint16_t port, time_t last_seen) + : id(id), ip(ip), port(port), last_seen(last_seen) + {} + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(id) + KV_SERIALIZE(ip) + KV_SERIALIZE(port) + KV_SERIALIZE(last_seen) + END_KV_SERIALIZE_MAP() + }; + + struct COMMAND_RPC_GET_PEER_LIST + { + struct request + { + BEGIN_KV_SERIALIZE_MAP() + END_KV_SERIALIZE_MAP() + }; + + struct response + { + std::string status; + std::vector white_list; + std::vector gray_list; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(status) + KV_SERIALIZE(white_list) + KV_SERIALIZE(gray_list) + END_KV_SERIALIZE_MAP() + }; + }; + }