add admin query resolver commands
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
2dd68d3fa5
commit
17a3ed4c56
3 changed files with 119 additions and 10 deletions
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
87
src/admin/query/resolver.rs
Normal file
87
src/admin/query/resolver.rs
Normal 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))
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue