server-configs/machines/gerd/services/stalwart/patches/stalwart-cli-dns-records.patch

86 lines
2.8 KiB
Diff

diff --git a/crates/cli/src/modules/cli.rs b/crates/cli/src/modules/cli.rs
index 865b7c8e..f30ee8a8 100644
--- a/crates/cli/src/modules/cli.rs
+++ b/crates/cli/src/modules/cli.rs
@@ -330,6 +330,12 @@ pub enum DomainCommands {
name: String,
},
+ /// List DNS records for domain
+ DNSRecords {
+ /// Domain name to list DNS records for
+ name: String,
+ },
+
/// List all domains
List {
/// Starting point for listing domains
diff --git a/crates/cli/src/modules/domain.rs b/crates/cli/src/modules/domain.rs
index bc0dd898..462e0251 100644
--- a/crates/cli/src/modules/domain.rs
+++ b/crates/cli/src/modules/domain.rs
@@ -6,7 +6,7 @@
use std::borrow::Cow;
-use prettytable::{Attr, Cell, Row, Table};
+use prettytable::{Attr, Cell, Row, Table, format};
use reqwest::Method;
use serde_json::Value;
@@ -14,6 +14,15 @@ use crate::modules::List;
use super::cli::{Client, DomainCommands};
+use serde::{Deserialize, Serialize};
+#[derive(Debug, Serialize, Deserialize, Clone)]
+struct DnsRecord {
+ #[serde(rename = "type")]
+ typ: String,
+ name: String,
+ content: String,
+}
+
impl DomainCommands {
pub async fn exec(self, client: Client) {
match self {
@@ -37,6 +46,39 @@ impl DomainCommands {
.await;
eprintln!("Successfully deleted domain {name:?}");
}
+ DomainCommands::DNSRecords { name } => {
+ let records = client
+ .http_request::<Vec<DnsRecord>, String>(
+ Method::GET,
+ &format!("/api/domain/{name}"),
+ None,
+ )
+ .await;
+
+ if !records.is_empty() {
+ let mut table = Table::new();
+ // no borderline separator, as long values will mess it up
+ table.set_format(*format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR);
+
+ table.add_row(Row::new(vec![
+ Cell::new("Type").with_style(Attr::Bold),
+ Cell::new("Name").with_style(Attr::Bold),
+ Cell::new("Contents").with_style(Attr::Bold),
+ ]));
+
+ for record in &records {
+ table.add_row(Row::new(vec![
+ Cell::new(&record.typ),
+ Cell::new(&record.name),
+ Cell::new(&record.content),
+ ]));
+ }
+
+ eprintln!();
+ table.printstd();
+ eprintln!();
+ }
+ }
DomainCommands::List { from, limit } => {
let query = if from.is_none() && limit.is_none() {
Cow::Borrowed("/api/domain")