mirror of
https://github.com/hinto-janai/cuprate.git
synced 2025-01-19 01:04:32 +00:00
connection_info
This commit is contained in:
parent
8a3229b369
commit
9422c07cc8
8 changed files with 123 additions and 30 deletions
|
@ -1,6 +1,7 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
|
use cuprate_p2p_core::{client::handshaker::builder::DummyAddressBook, ClearNet};
|
||||||
use cuprate_types::HardFork;
|
use cuprate_types::HardFork;
|
||||||
use monero_serai::block::Block;
|
use monero_serai::block::Block;
|
||||||
use tower::{Service, ServiceExt};
|
use tower::{Service, ServiceExt};
|
||||||
|
@ -40,7 +41,7 @@ use cuprate_rpc_types::{
|
||||||
|
|
||||||
use crate::rpc::{
|
use crate::rpc::{
|
||||||
helper,
|
helper,
|
||||||
request::{blockchain, blockchain_context, blockchain_manager},
|
request::{address_book, blockchain, blockchain_context, blockchain_manager},
|
||||||
CupratedRpcHandler,
|
CupratedRpcHandler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -314,9 +315,11 @@ async fn get_connections(
|
||||||
state: CupratedRpcHandler,
|
state: CupratedRpcHandler,
|
||||||
request: GetConnectionsRequest,
|
request: GetConnectionsRequest,
|
||||||
) -> Result<GetConnectionsResponse, Error> {
|
) -> Result<GetConnectionsResponse, Error> {
|
||||||
|
let connections = address_book::connection_info::<ClearNet>(&mut DummyAddressBook).await?;
|
||||||
|
|
||||||
Ok(GetConnectionsResponse {
|
Ok(GetConnectionsResponse {
|
||||||
base: ResponseBase::ok(),
|
base: ResponseBase::ok(),
|
||||||
connections: todo!(),
|
connections,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
use std::convert::Infallible;
|
use std::convert::Infallible;
|
||||||
|
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
|
use cuprate_rpc_types::misc::ConnectionInfo;
|
||||||
use tower::ServiceExt;
|
use tower::ServiceExt;
|
||||||
|
|
||||||
use cuprate_helper::cast::usize_to_u64;
|
use cuprate_helper::cast::usize_to_u64;
|
||||||
|
@ -31,6 +32,56 @@ pub(crate) async fn peerlist_size<Z: NetworkZone>(
|
||||||
Ok((usize_to_u64(white), usize_to_u64(grey)))
|
Ok((usize_to_u64(white), usize_to_u64(grey)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// [`AddressBookRequest::ConnectionInfo`]
|
||||||
|
pub(crate) async fn connection_info<Z: NetworkZone>(
|
||||||
|
address_book: &mut impl AddressBook<Z>,
|
||||||
|
) -> Result<Vec<ConnectionInfo>, Error> {
|
||||||
|
let AddressBookResponse::ConnectionInfo(vec) = address_book
|
||||||
|
.ready()
|
||||||
|
.await
|
||||||
|
.map_err(|e| anyhow!(e))?
|
||||||
|
.call(AddressBookRequest::ConnectionInfo)
|
||||||
|
.await
|
||||||
|
.map_err(|e| anyhow!(e))?
|
||||||
|
else {
|
||||||
|
unreachable!();
|
||||||
|
};
|
||||||
|
|
||||||
|
// FIXME: impl this map somewhere instead of inline.
|
||||||
|
let vec = vec
|
||||||
|
.into_iter()
|
||||||
|
.map(|info| ConnectionInfo {
|
||||||
|
address: info.address.to_string(),
|
||||||
|
address_type: info.address_type,
|
||||||
|
avg_download: info.avg_download,
|
||||||
|
avg_upload: info.avg_upload,
|
||||||
|
connection_id: info.connection_id,
|
||||||
|
current_download: info.current_download,
|
||||||
|
current_upload: info.current_upload,
|
||||||
|
height: info.height,
|
||||||
|
host: info.host,
|
||||||
|
incoming: info.incoming,
|
||||||
|
ip: info.ip,
|
||||||
|
live_time: info.live_time,
|
||||||
|
localhost: info.localhost,
|
||||||
|
local_ip: info.local_ip,
|
||||||
|
peer_id: info.peer_id,
|
||||||
|
port: info.port,
|
||||||
|
pruning_seed: info.pruning_seed,
|
||||||
|
recv_count: info.recv_count,
|
||||||
|
recv_idle_time: info.recv_idle_time,
|
||||||
|
rpc_credits_per_hash: info.rpc_credits_per_hash,
|
||||||
|
rpc_port: info.rpc_port,
|
||||||
|
send_count: info.send_count,
|
||||||
|
send_idle_time: info.send_idle_time,
|
||||||
|
state: info.state,
|
||||||
|
support_flags: info.support_flags,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(vec)
|
||||||
|
}
|
||||||
|
|
||||||
/// [`AddressBookRequest::ConnectionCount`]
|
/// [`AddressBookRequest::ConnectionCount`]
|
||||||
pub(crate) async fn connection_count<Z: NetworkZone>(
|
pub(crate) async fn connection_count<Z: NetworkZone>(
|
||||||
address_book: &mut impl AddressBook<Z>,
|
address_book: &mut impl AddressBook<Z>,
|
||||||
|
@ -52,7 +103,7 @@ pub(crate) async fn connection_count<Z: NetworkZone>(
|
||||||
/// [`AddressBookRequest::SetBan`]
|
/// [`AddressBookRequest::SetBan`]
|
||||||
pub(crate) async fn set_ban<Z: NetworkZone>(
|
pub(crate) async fn set_ban<Z: NetworkZone>(
|
||||||
address_book: &mut impl AddressBook<Z>,
|
address_book: &mut impl AddressBook<Z>,
|
||||||
peer: cuprate_p2p_core::ban::SetBan<Z::Addr>,
|
peer: cuprate_p2p_core::types::SetBan<Z::Addr>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let AddressBookResponse::Ok = address_book
|
let AddressBookResponse::Ok = address_book
|
||||||
.ready()
|
.ready()
|
||||||
|
|
|
@ -423,7 +423,8 @@ impl<Z: BorshNetworkZone> Service<AddressBookRequest<Z>> for AddressBook<Z> {
|
||||||
AddressBookRequest::PeerlistSize
|
AddressBookRequest::PeerlistSize
|
||||||
| AddressBookRequest::ConnectionCount
|
| AddressBookRequest::ConnectionCount
|
||||||
| AddressBookRequest::SetBan(_)
|
| AddressBookRequest::SetBan(_)
|
||||||
| AddressBookRequest::GetBans => {
|
| AddressBookRequest::GetBans
|
||||||
|
| AddressBookRequest::ConnectionInfo => {
|
||||||
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
|
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
//! Data structures related to bans.
|
|
||||||
|
|
||||||
use std::time::{Duration, Instant};
|
|
||||||
|
|
||||||
use crate::NetZoneAddress;
|
|
||||||
|
|
||||||
/// Data within [`crate::services::AddressBookRequest::SetBan`].
|
|
||||||
pub struct SetBan<A: NetZoneAddress> {
|
|
||||||
/// Address of the peer.
|
|
||||||
pub address: A,
|
|
||||||
/// - If [`Some`], how long this peer should be banned for
|
|
||||||
/// - If [`None`], the peer will be unbanned
|
|
||||||
pub ban: Option<Duration>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Data within [`crate::services::AddressBookResponse::GetBans`].
|
|
||||||
pub struct BanState<A: NetZoneAddress> {
|
|
||||||
/// Address of the peer.
|
|
||||||
pub address: A,
|
|
||||||
/// - If [`Some`], the peer is banned until this [`Instant`]
|
|
||||||
/// - If [`None`], the peer is not currently banned
|
|
||||||
pub unban_instant: Option<Instant>,
|
|
||||||
}
|
|
|
@ -111,7 +111,8 @@ impl<N: NetworkZone> Service<AddressBookRequest<N>> for DummyAddressBook {
|
||||||
AddressBookRequest::PeerlistSize
|
AddressBookRequest::PeerlistSize
|
||||||
| AddressBookRequest::ConnectionCount
|
| AddressBookRequest::ConnectionCount
|
||||||
| AddressBookRequest::SetBan(_)
|
| AddressBookRequest::SetBan(_)
|
||||||
| AddressBookRequest::GetBans => {
|
| AddressBookRequest::GetBans
|
||||||
|
| AddressBookRequest::ConnectionInfo => {
|
||||||
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
|
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -75,7 +75,6 @@ use cuprate_wire::{
|
||||||
NetworkAddress,
|
NetworkAddress,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod ban;
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
mod constants;
|
mod constants;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
@ -83,6 +82,7 @@ pub mod handles;
|
||||||
mod network_zones;
|
mod network_zones;
|
||||||
pub mod protocol;
|
pub mod protocol;
|
||||||
pub mod services;
|
pub mod services;
|
||||||
|
pub mod types;
|
||||||
|
|
||||||
pub use error::*;
|
pub use error::*;
|
||||||
pub use network_zones::{ClearNet, ClearNetServerCfg};
|
pub use network_zones::{ClearNet, ClearNetServerCfg};
|
||||||
|
|
|
@ -4,9 +4,9 @@ use cuprate_pruning::{PruningError, PruningSeed};
|
||||||
use cuprate_wire::{CoreSyncData, PeerListEntryBase};
|
use cuprate_wire::{CoreSyncData, PeerListEntryBase};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ban::{BanState, SetBan},
|
|
||||||
client::InternalPeerID,
|
client::InternalPeerID,
|
||||||
handles::ConnectionHandle,
|
handles::ConnectionHandle,
|
||||||
|
types::{BanState, ConnectionInfo, SetBan},
|
||||||
NetZoneAddress, NetworkAddressIncorrectZone, NetworkZone,
|
NetZoneAddress, NetworkAddressIncorrectZone, NetworkZone,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -118,6 +118,9 @@ pub enum AddressBookRequest<Z: NetworkZone> {
|
||||||
/// Get the amount of white & grey peers.
|
/// Get the amount of white & grey peers.
|
||||||
PeerlistSize,
|
PeerlistSize,
|
||||||
|
|
||||||
|
/// Get information on all connections.
|
||||||
|
ConnectionInfo,
|
||||||
|
|
||||||
/// Get the amount of incoming & outgoing connections.
|
/// Get the amount of incoming & outgoing connections.
|
||||||
ConnectionCount,
|
ConnectionCount,
|
||||||
|
|
||||||
|
@ -152,6 +155,9 @@ pub enum AddressBookResponse<Z: NetworkZone> {
|
||||||
/// Response to [`AddressBookRequest::PeerlistSize`].
|
/// Response to [`AddressBookRequest::PeerlistSize`].
|
||||||
PeerlistSize { white: usize, grey: usize },
|
PeerlistSize { white: usize, grey: usize },
|
||||||
|
|
||||||
|
/// Response to [`AddressBookRequest::ConnectionInfo`].
|
||||||
|
ConnectionInfo(Vec<ConnectionInfo<Z::Addr>>),
|
||||||
|
|
||||||
/// Response to [`AddressBookRequest::ConnectionCount`].
|
/// Response to [`AddressBookRequest::ConnectionCount`].
|
||||||
ConnectionCount { incoming: usize, outgoing: usize },
|
ConnectionCount { incoming: usize, outgoing: usize },
|
||||||
|
|
||||||
|
|
54
p2p/p2p-core/src/types.rs
Normal file
54
p2p/p2p-core/src/types.rs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
//! General data structures.
|
||||||
|
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
|
use crate::NetZoneAddress;
|
||||||
|
|
||||||
|
/// Data within [`crate::services::AddressBookRequest::SetBan`].
|
||||||
|
pub struct SetBan<A: NetZoneAddress> {
|
||||||
|
/// Address of the peer.
|
||||||
|
pub address: A,
|
||||||
|
/// - If [`Some`], how long this peer should be banned for
|
||||||
|
/// - If [`None`], the peer will be unbanned
|
||||||
|
pub ban: Option<Duration>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Data within [`crate::services::AddressBookResponse::GetBans`].
|
||||||
|
pub struct BanState<A: NetZoneAddress> {
|
||||||
|
/// Address of the peer.
|
||||||
|
pub address: A,
|
||||||
|
/// - If [`Some`], the peer is banned until this [`Instant`]
|
||||||
|
/// - If [`None`], the peer is not currently banned
|
||||||
|
pub unban_instant: Option<Instant>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: reduce fields and map to RPC type.
|
||||||
|
//
|
||||||
|
/// Data within [`crate::services::AddressBookResponse::ConnectionInfo`].
|
||||||
|
pub struct ConnectionInfo<A: NetZoneAddress> {
|
||||||
|
pub address: A,
|
||||||
|
pub address_type: u8,
|
||||||
|
pub avg_download: u64,
|
||||||
|
pub avg_upload: u64,
|
||||||
|
pub connection_id: String,
|
||||||
|
pub current_download: u64,
|
||||||
|
pub current_upload: u64,
|
||||||
|
pub height: u64,
|
||||||
|
pub host: String,
|
||||||
|
pub incoming: bool,
|
||||||
|
pub ip: String,
|
||||||
|
pub live_time: u64,
|
||||||
|
pub localhost: bool,
|
||||||
|
pub local_ip: bool,
|
||||||
|
pub peer_id: String,
|
||||||
|
pub port: String,
|
||||||
|
pub pruning_seed: u32,
|
||||||
|
pub recv_count: u64,
|
||||||
|
pub recv_idle_time: u64,
|
||||||
|
pub rpc_credits_per_hash: u32,
|
||||||
|
pub rpc_port: u16,
|
||||||
|
pub send_count: u64,
|
||||||
|
pub send_idle_time: u64,
|
||||||
|
pub state: String,
|
||||||
|
pub support_flags: u32,
|
||||||
|
}
|
Loading…
Reference in a new issue