tuwunel_admin/query/
resolver.rs1use clap::Subcommand;
2use futures::StreamExt;
3use ruma::OwnedServerName;
4use tuwunel_core::{Result, utils::time};
5
6use crate::{admin_command, admin_command_dispatch};
7
8#[admin_command_dispatch]
9#[derive(Debug, Subcommand)]
10pub(crate) enum ResolverCommand {
12 DestinationsCache {
14 server_name: Option<OwnedServerName>,
15 },
16
17 OverridesCache {
19 name: Option<String>,
20 },
21}
22
23#[admin_command]
24async fn destinations_cache(&self, server_name: Option<OwnedServerName>) -> Result {
25 use tuwunel_service::resolver::cache::CachedDest;
26
27 writeln!(self, "| Server Name | Destination | Hostname | Expires |").await?;
28 writeln!(self, "| ----------- | ----------- | -------- | ------- |").await?;
29
30 let mut destinations = self
31 .services
32 .resolver
33 .cache
34 .destinations()
35 .boxed();
36
37 while let Some((name, CachedDest { dest, host, expire })) = destinations.next().await {
38 if let Some(server_name) = server_name.as_ref()
39 && name != server_name
40 {
41 continue;
42 }
43
44 let expire = time::format(expire, "%+");
45 self.write_str(&format!("| {name} | {dest} | {host} | {expire} |\n"))
46 .await?;
47 }
48
49 Ok(())
50}
51
52#[admin_command]
53async fn overrides_cache(&self, server_name: Option<String>) -> Result {
54 use tuwunel_service::resolver::cache::CachedOverride;
55
56 writeln!(self, "| Server Name | IP | Port | Expires | Overriding |").await?;
57 writeln!(self, "| ----------- | --- | ----:| ------- | ---------- |").await?;
58
59 let mut overrides = self.services.resolver.cache.overrides().boxed();
60
61 while let Some((name, CachedOverride { ips, port, expire, overriding })) =
62 overrides.next().await
63 {
64 if let Some(server_name) = server_name.as_ref()
65 && name != server_name
66 {
67 continue;
68 }
69
70 let expire = time::format(expire, "%+");
71 self.write_str(&format!("| {name} | {ips:?} | {port} | {expire} | {overriding:?} |\n"))
72 .await?;
73 }
74
75 Ok(())
76}