Files
continuwuity/src/admin/query/resolver.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

106 lines
2.8 KiB
Rust
Raw Normal View History

2024-07-27 00:11:41 +00:00
use clap::Subcommand;
use conduwuit::{Err, Result, utils::time};
2025-01-22 02:16:51 +00:00
use futures::StreamExt;
use ruma::OwnedServerName;
2024-07-04 11:49:13 +00:00
2024-07-27 00:11:41 +00:00
use crate::{admin_command, admin_command_dispatch};
2024-07-04 11:49:13 +00:00
2024-07-27 00:11:41 +00:00
#[admin_command_dispatch]
#[derive(Debug, Subcommand)]
#[allow(clippy::enum_variant_names)]
2024-07-27 00:11:41 +00:00
/// Resolver service and caches
2025-05-24 00:28:09 +01:00
pub enum ResolverCommand {
2024-07-27 00:11:41 +00:00
/// Query the destinations cache
DestinationsCache {
server_name: Option<OwnedServerName>,
},
/// Query the overrides cache
OverridesCache {
name: Option<String>,
},
/// Flush a given server from the resolver caches or flush them completely
///
/// * Examples:
/// * Flush a specific server:
///
/// `!admin query resolver flush-cache matrix.example.com`
///
/// * Flush all resolver caches completely:
///
/// `!admin query resolver flush-cache --all`
#[command(verbatim_doc_comment)]
FlushCache {
name: Option<OwnedServerName>,
#[arg(short, long)]
all: bool,
},
2024-07-04 11:49:13 +00:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
async fn destinations_cache(&self, server_name: Option<OwnedServerName>) -> Result {
use service::resolver::cache::CachedDest;
2024-07-04 11:49:13 +00:00
2025-01-04 16:57:07 +00:00
writeln!(self, "| Server Name | Destination | Hostname | Expires |").await?;
writeln!(self, "| ----------- | ----------- | -------- | ------- |").await?;
2025-01-22 02:16:51 +00:00
let mut destinations = self.services.resolver.cache.destinations().boxed();
2025-01-04 16:57:07 +00:00
2025-01-22 02:16:51 +00:00
while let Some((name, CachedDest { dest, host, expire })) = destinations.next().await {
if let Some(server_name) = server_name.as_ref() {
2026-04-13 16:58:12 -04:00
if name != *server_name {
2025-01-22 02:16:51 +00:00
continue;
2025-01-04 16:57:07 +00:00
}
}
2024-07-04 11:49:13 +00:00
2025-01-22 02:16:51 +00:00
let expire = time::format(expire, "%+");
self.write_str(&format!("| {name} | {dest} | {host} | {expire} |\n"))
.await?;
}
2025-01-04 16:57:07 +00:00
Ok(())
2024-07-04 11:49:13 +00:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
async fn overrides_cache(&self, server_name: Option<String>) -> Result {
use service::resolver::cache::CachedOverride;
2024-07-04 11:49:13 +00:00
2025-01-22 23:07:13 +00:00
writeln!(self, "| Server Name | IP | Port | Expires | Overriding |").await?;
writeln!(self, "| ----------- | --- | ----:| ------- | ---------- |").await?;
2025-01-04 16:57:07 +00:00
2025-01-22 02:16:51 +00:00
let mut overrides = self.services.resolver.cache.overrides().boxed();
2025-01-04 16:57:07 +00:00
2025-01-22 23:07:13 +00:00
while let Some((name, CachedOverride { ips, port, expire, overriding })) =
overrides.next().await
{
2025-01-22 02:16:51 +00:00
if let Some(server_name) = server_name.as_ref() {
2026-04-13 16:58:12 -04:00
if name != *server_name {
2025-01-22 02:16:51 +00:00
continue;
2025-01-04 16:57:07 +00:00
}
}
2024-07-04 11:49:13 +00:00
2025-01-22 02:16:51 +00:00
let expire = time::format(expire, "%+");
2025-01-22 23:07:13 +00:00
self.write_str(&format!("| {name} | {ips:?} | {port} | {expire} | {overriding:?} |\n"))
2025-01-22 02:16:51 +00:00
.await?;
}
2025-01-04 16:57:07 +00:00
Ok(())
2024-07-04 11:49:13 +00:00
}
#[admin_command]
async fn flush_cache(&self, name: Option<OwnedServerName>, all: bool) -> Result {
if all {
self.services.resolver.cache.clear().await;
writeln!(self, "Resolver caches cleared!").await
} else if let Some(name) = name {
self.services.resolver.cache.del_destination(&name);
self.services.resolver.cache.del_override(&name);
self.write_str(&format!("Cleared {name} from resolver caches!"))
.await
} else {
Err!("Missing name. Supply a name or use --all to flush the whole cache.")
}
}