From 51afde9e988529701d445e190131875b340938d9 Mon Sep 17 00:00:00 2001 From: strawberry Date: Sun, 31 Mar 2024 18:57:11 -0400 Subject: [PATCH] admin cmd to send a request/ping to `/_matrix/federation/v1/version` Signed-off-by: strawberry --- src/service/admin/debug.rs | 60 ++++++++++++++++++++++++-- src/service/rooms/event_handler/mod.rs | 2 +- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/service/admin/debug.rs b/src/service/admin/debug.rs index 309111af..8887d133 100644 --- a/src/service/admin/debug.rs +++ b/src/service/admin/debug.rs @@ -61,6 +61,13 @@ pub(crate) enum DebugCommand { room_id: Box, }, + /// - Sends a federation request to the remote server's + /// `/_matrix/federation/v1/version` endpoint and measures the latency it + /// took for the server to respond + Ping { + server: Box, + }, + /// - Forces device lists for all local and remote users to be updated (as /// having new keys available) ForceDeviceListUpdates, @@ -253,10 +260,10 @@ pub(crate) async fn process(command: DebugCommand, body: Vec<&str>) -> Result { - return Ok(RoomMessageEventContent::text_plain( - "Remote server did not have PDU or failed sending request to remote server.", - )); + Err(e) => { + return Ok(RoomMessageEventContent::text_plain(format!( + "Remote server did not have PDU or failed sending request to remote server: {e}" + ))); }, } }, @@ -295,6 +302,51 @@ pub(crate) async fn process(command: DebugCommand, body: Vec<&str>) -> Result { + if server == services().globals.server_name() { + return Ok(RoomMessageEventContent::text_plain( + "Not allowed to send federation requests to ourselves.", + )); + } + + let timer = tokio::time::Instant::now(); + + match services() + .sending + .send_federation_request(&server, ruma::api::federation::discovery::get_server_version::v1::Request {}) + .await + { + Ok(response) => { + let ping_time = timer.elapsed(); + + let json_text_res = serde_json::to_string_pretty(&response.server); + + if let Ok(json) = json_text_res { + return Ok(RoomMessageEventContent::text_html( + format!("Got response which took {ping_time:?} time:\n```json\n{json}\n```"), + format!( + "

Got response which took {ping_time:?} time:

\n
{}\n
\n", + HtmlEscape(&json) + ), + )); + } + + return Ok(RoomMessageEventContent::text_plain(format!( + "Got non-JSON response which took {ping_time:?} time:\n{0:?}", + response + ))); + }, + Err(e) => { + error!("Failed sending federation request to specified server from ping debug command: {e}"); + return Ok(RoomMessageEventContent::text_plain(format!( + "Failed sending federation request to specified server:\n\n{e}", + ))); + }, + } + }, DebugCommand::ForceDeviceListUpdates => { // Force E2EE device list updates for all users for user_id in services().users.iter().filter_map(std::result::Result::ok) { diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index fc28caf2..8627402b 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -1095,7 +1095,7 @@ impl Service { events_all.insert(next_id); }, Err(e) => { - warn!("Failed to fetch event {} | {e}", next_id); + warn!("Failed to fetch event {next_id}: {e}"); back_off((*next_id).to_owned()).await; }, }