add admin query resolver commands

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-07-04 11:49:13 +00:00
parent 2dd68d3fa5
commit 17a3ed4c56
3 changed files with 119 additions and 10 deletions

View file

@ -614,15 +614,16 @@ pub(super) async fn resolve_true_destination(
let state = &services().server.log.capture; let state = &services().server.log.capture;
let logs = Arc::new(Mutex::new(String::new())); let logs = Arc::new(Mutex::new(String::new()));
let capture = Capture::new(state, Some(filter), capture::fmt_markdown(logs.clone())); let capture = Capture::new(state, Some(filter), capture::fmt_markdown(logs.clone()));
let (actual_dest, hostname_uri);
{ let capture_scope = capture.start();
let _capture_scope = capture.start(); let actual = resolve_actual_dest(&server_name, !no_cache).await?;
(actual_dest, hostname_uri) = resolve_actual_dest(&server_name, !no_cache).await?; drop(capture_scope);
};
let msg = format!( let msg = format!(
"{}\nDestination: {actual_dest}\nHostname URI: {hostname_uri}", "{}\nDestination: {}\nHostname URI: {}",
logs.lock().expect("locked") logs.lock().expect("locked"),
actual.dest,
actual.host,
); );
Ok(RoomMessageEventContent::text_markdown(msg)) Ok(RoomMessageEventContent::text_markdown(msg))
} }

View file

@ -2,6 +2,7 @@ mod account_data;
mod appservice; mod appservice;
mod globals; mod globals;
mod presence; mod presence;
mod resolver;
mod room_alias; mod room_alias;
mod room_state_cache; mod room_state_cache;
mod sending; mod sending;
@ -12,12 +13,12 @@ use conduit::Result;
use room_state_cache::room_state_cache; use room_state_cache::room_state_cache;
use ruma::{ use ruma::{
events::{room::message::RoomMessageEventContent, RoomAccountDataEventType}, events::{room::message::RoomMessageEventContent, RoomAccountDataEventType},
RoomAliasId, RoomId, ServerName, UserId, OwnedServerName, RoomAliasId, RoomId, ServerName, UserId,
}; };
use self::{ use self::{
account_data::account_data, appservice::appservice, globals::globals, presence::presence, room_alias::room_alias, account_data::account_data, appservice::appservice, globals::globals, presence::presence, resolver::resolver,
sending::sending, users::users, room_alias::room_alias, sending::sending, users::users,
}; };
#[cfg_attr(test, derive(Debug))] #[cfg_attr(test, derive(Debug))]
@ -55,6 +56,10 @@ pub(super) enum QueryCommand {
/// - users.rs iterators and getters /// - users.rs iterators and getters
#[command(subcommand)] #[command(subcommand)]
Users(Users), Users(Users),
/// - resolver service
#[command(subcommand)]
Resolver(Resolver),
} }
#[cfg_attr(test, derive(Debug))] #[cfg_attr(test, derive(Debug))]
@ -287,6 +292,21 @@ pub(super) enum Users {
Iter, Iter,
} }
#[cfg_attr(test, derive(Debug))]
#[derive(Subcommand)]
/// Resolver service and caches
pub(super) enum Resolver {
/// Query the destinations cache
DestinationsCache {
server_name: Option<OwnedServerName>,
},
/// Query the overrides cache
OverridesCache {
name: Option<String>,
},
}
/// Processes admin query commands /// Processes admin query commands
pub(super) async fn process(command: QueryCommand, _body: Vec<&str>) -> Result<RoomMessageEventContent> { pub(super) async fn process(command: QueryCommand, _body: Vec<&str>) -> Result<RoomMessageEventContent> {
Ok(match command { Ok(match command {
@ -298,5 +318,6 @@ pub(super) async fn process(command: QueryCommand, _body: Vec<&str>) -> Result<R
QueryCommand::Globals(command) => globals(command).await?, QueryCommand::Globals(command) => globals(command).await?,
QueryCommand::Sending(command) => sending(command).await?, QueryCommand::Sending(command) => sending(command).await?,
QueryCommand::Users(command) => users(command).await?, QueryCommand::Users(command) => users(command).await?,
QueryCommand::Resolver(command) => resolver(command).await?,
}) })
} }

View file

@ -0,0 +1,87 @@
use std::fmt::Write;
use conduit::{utils::time, Result};
use ruma::{events::room::message::RoomMessageEventContent, OwnedServerName};
use super::Resolver;
use crate::services;
/// All the getters and iterators in key_value/users.rs
pub(super) async fn resolver(subcommand: Resolver) -> Result<RoomMessageEventContent> {
match subcommand {
Resolver::DestinationsCache {
server_name,
} => destinations_cache(server_name).await,
Resolver::OverridesCache {
name,
} => overrides_cache(name).await,
}
}
async fn destinations_cache(server_name: Option<OwnedServerName>) -> Result<RoomMessageEventContent> {
use service::sending::CachedDest;
let mut out = String::new();
writeln!(out, "| Server Name | Destination | Hostname | Expires |")?;
writeln!(out, "| ----------- | ----------- | -------- | ------- |")?;
let row = |(
name,
&CachedDest {
ref dest,
ref host,
expire,
},
)| {
let expire = time::format(expire, "%+");
writeln!(out, "| {name} | {dest} | {host} | {expire} |").expect("wrote line");
};
let map = services()
.globals
.resolver
.destinations
.read()
.expect("locked");
if let Some(server_name) = server_name.as_ref() {
map.get_key_value(server_name).map(row);
} else {
map.iter().for_each(row);
}
Ok(RoomMessageEventContent::notice_markdown(out))
}
async fn overrides_cache(server_name: Option<String>) -> Result<RoomMessageEventContent> {
use service::sending::CachedOverride;
let mut out = String::new();
writeln!(out, "| Server Name | IP | Port | Expires |")?;
writeln!(out, "| ----------- | --- | ----:| ------- |")?;
let row = |(
name,
&CachedOverride {
ref ips,
port,
expire,
},
)| {
let expire = time::format(expire, "%+");
writeln!(out, "| {name} | {ips:?} | {port} | {expire} |").expect("wrote line");
};
let map = services()
.globals
.resolver
.overrides
.read()
.expect("locked");
if let Some(server_name) = server_name.as_ref() {
map.get_key_value(server_name).map(row);
} else {
map.iter().for_each(row);
}
Ok(RoomMessageEventContent::notice_markdown(out))
}