From 9dd2b28605b620306ab95de6790fa65740741bde Mon Sep 17 00:00:00 2001 From: dasha_uwu <> Date: Tue, 8 Jul 2025 23:49:18 +0000 Subject: [PATCH] Add base64 output for admin query command. Signed-off-by: Jason Volk --- Cargo.lock | 1 + src/admin/Cargo.toml | 1 + src/admin/query/raw.rs | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 473a3414..3108bd78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4837,6 +4837,7 @@ dependencies = [ name = "tuwunel_admin" version = "1.2.0" dependencies = [ + "base64", "clap", "const-str", "ctor", diff --git a/src/admin/Cargo.toml b/src/admin/Cargo.toml index 04178604..e729ef5e 100644 --- a/src/admin/Cargo.toml +++ b/src/admin/Cargo.toml @@ -84,6 +84,7 @@ zstd_compression = [ ] [dependencies] +base64.workspace = true clap.workspace = true tuwunel-api.workspace = true tuwunel-core.workspace = true diff --git a/src/admin/query/raw.rs b/src/admin/query/raw.rs index 44505576..9df63ad7 100644 --- a/src/admin/query/raw.rs +++ b/src/admin/query/raw.rs @@ -1,5 +1,6 @@ use std::{borrow::Cow, collections::BTreeMap, ops::Deref, sync::Arc}; +use base64::prelude::*; use clap::Subcommand; use futures::{FutureExt, Stream, StreamExt, TryStreamExt}; use tokio::time::Instant; @@ -30,6 +31,10 @@ pub(crate) enum RawCommand { /// Key key: String, + + /// Encode as base64 + #[arg(long, short)] + base64: bool, }, /// - Raw database delete (for string keys) @@ -421,13 +426,19 @@ pub(super) async fn raw_del(&self, map: String, key: String) -> Result { } #[admin_command] -pub(super) async fn raw_get(&self, map: String, key: String) -> Result { +pub(super) async fn raw_get(&self, map: String, key: String, base64: bool) -> Result { let map = self.services.db.get(&map)?; let timer = Instant::now(); let handle = map.get(&key).await?; let query_time = timer.elapsed(); - let result = String::from_utf8_lossy(&handle); + + let result = if base64 { + BASE64_STANDARD.encode(&handle) + } else { + String::from_utf8_lossy(&handle).to_string() + }; + self.write_str(&format!("Query completed in {query_time:?}:\n\n```rs\n{result:?}\n```")) .await }