From 0f9f1c7bf247afff94f74d339f684f568cef08e8 Mon Sep 17 00:00:00 2001 From: Bo QIU <35757521+boqiu@users.noreply.github.com> Date: Mon, 15 Jul 2024 18:19:30 +0800 Subject: [PATCH] Add admin RPC to dump discovered peers (#127) * add admin rpc to dump peers * allow to specify file name * return listen addreses in rpc * add trace for admin rpc parameters --- node/rpc/Cargo.toml | 4 +--- node/rpc/src/admin/api.rs | 3 +++ node/rpc/src/admin/impl.rs | 20 ++++++++++++++++++++ node/rpc/src/types.rs | 2 ++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/node/rpc/Cargo.toml b/node/rpc/Cargo.toml index 0a26652..cb2f354 100644 --- a/node/rpc/Cargo.toml +++ b/node/rpc/Cargo.toml @@ -12,6 +12,7 @@ futures = "0.3.21" jsonrpsee = { version = "0.14.0", features = ["full"] } network = { path = "../network" } serde = { version = "1.0.137", features = ["derive"] } +serde_json = "1.0.82" base64 = "0.13.0" shared_types = { path = "../shared_types" } sync = { path = "../sync" } @@ -24,6 +25,3 @@ storage-async = { path = "../storage-async" } merkle_light = { path = "../../common/merkle_light" } merkle_tree = { path = "../../common/merkle_tree"} futures-channel = "^0.3" - -[dev-dependencies] -serde_json = "1.0.82" diff --git a/node/rpc/src/admin/api.rs b/node/rpc/src/admin/api.rs index 4984995..a83f47d 100644 --- a/node/rpc/src/admin/api.rs +++ b/node/rpc/src/admin/api.rs @@ -32,4 +32,7 @@ pub trait Rpc { #[method(name = "getNetworkInfo")] async fn get_network_info(&self) -> RpcResult; + + #[method(name = "dumpPeers")] + async fn dump_peers(&self, file: Option) -> RpcResult; } diff --git a/node/rpc/src/admin/impl.rs b/node/rpc/src/admin/impl.rs index 6a55da8..b092255 100644 --- a/node/rpc/src/admin/impl.rs +++ b/node/rpc/src/admin/impl.rs @@ -4,7 +4,9 @@ use crate::{error, Context}; use futures::prelude::*; use jsonrpsee::core::async_trait; use jsonrpsee::core::RpcResult; +use network::PeerInfo; use std::collections::HashMap; +use std::fs::File; use sync::{FileSyncInfo, SyncRequest, SyncResponse}; use task_executor::ShutdownReason; @@ -138,6 +140,7 @@ impl RpcServer for RpcServerImpl { Ok(NetworkInfo { peer_id: self.ctx.network_globals.local_peer_id().to_base58(), + listen_addresses: self.ctx.network_globals.listen_multiaddrs(), total_peers: db.peers().count(), banned_peers: db.banned_peers().count(), disconnected_peers: db.disconnected_peers().count(), @@ -146,4 +149,21 @@ impl RpcServer for RpcServerImpl { connected_incoming_peers: connected_peers - connected_outgoing_peers, }) } + + #[tracing::instrument(skip(self), err)] + async fn dump_peers(&self, file: Option) -> RpcResult { + info!("admin_dumpPeers()"); + + let db = self.ctx.network_globals.peers.read(); + + let peers: HashMap = db + .peers() + .map(|(peer_id, info)| (peer_id.to_base58(), info.clone())) + .collect(); + + let file = File::create(file.unwrap_or("peers.json".into()))?; + serde_json::to_writer_pretty(&file, &peers)?; + + Ok(peers.len()) + } } diff --git a/node/rpc/src/types.rs b/node/rpc/src/types.rs index 7d15a2a..1cc9e1e 100644 --- a/node/rpc/src/types.rs +++ b/node/rpc/src/types.rs @@ -4,6 +4,7 @@ use jsonrpsee::core::RpcResult; use merkle_light::hash::Algorithm; use merkle_light::merkle::{log2_pow2, next_pow2, MerkleTree}; use merkle_tree::RawLeafSha3Algorithm; +use network::Multiaddr; use serde::{Deserialize, Serialize}; use shared_types::{ compute_padded_chunk_size, compute_segment_size, DataRoot, FileProof, Transaction, CHUNK_SIZE, @@ -29,6 +30,7 @@ pub struct Status { #[serde(rename_all = "camelCase")] pub struct NetworkInfo { pub peer_id: String, + pub listen_addresses: Vec, pub total_peers: usize, pub banned_peers: usize, pub disconnected_peers: usize,