DNS, DKIM and ACME improvements - part 3

This commit is contained in:
Maurus Decimus
2026-04-02 11:05:52 +02:00
parent d8fa19d105
commit c54ec2397a
22 changed files with 377 additions and 217 deletions

View File

@@ -6,7 +6,9 @@
use crate::task_manager::TaskResult;
use common::Server;
use registry::schema::structs::TaskDnsManagement;
use registry::schema::structs::{DnsManagement, Domain, TaskDnsManagement};
use std::fmt::Write;
use store::ahash::AHashSet;
pub(crate) trait DnsManagementTask: Sync + Send {
fn dns_management(&self, task: &TaskDnsManagement) -> impl Future<Output = TaskResult> + Send;
@@ -28,6 +30,64 @@ impl DnsManagementTask for Server {
}
}
async fn dns_management(server: &Server, imip: &TaskDnsManagement) -> trc::Result<TaskResult> {
todo!()
async fn dns_management(server: &Server, task: &TaskDnsManagement) -> trc::Result<TaskResult> {
if task.update_records.is_empty() {
return Ok(TaskResult::permanent(
"No DNS records to update".to_string(),
));
}
let Some(domain) = server.registry().object::<Domain>(task.domain_id).await? else {
return Ok(TaskResult::permanent("Domain not found".to_string()));
};
let DnsManagement::Automatic(props) = &domain.dns_management else {
return Ok(TaskResult::permanent(
"Domain is not set to automatic DNS management".to_string(),
));
};
let dns_updater = match server.build_dns_updater(props.dns_server_id).await? {
Ok(updater) => updater,
Err(err) => {
return Ok(TaskResult::permanent(format!(
"Failed to build DNS updater: {}",
err
)));
}
};
let origin = props.origin.as_deref().unwrap_or(&domain.name);
let records = server
.build_dns_records(task.domain_id, &domain, task.update_records.as_slice())
.await?;
// Delete any previous records
let delete_records = records
.iter()
.map(|record| (&record.name, record.record.as_type()))
.collect::<AHashSet<_>>();
for (name, record_type) in delete_records {
let _ = dns_updater.delete(origin, name, record_type).await;
}
// Add new records
let mut errors = String::new();
for record in records {
if let Err(err) = dns_updater
.create(origin, &record.name, record.record, false)
.await
{
if !errors.is_empty() {
errors.push_str("; ");
}
let _ = write!(
&mut errors,
"Failed to create DNS record for {}: {}",
record.name, err
);
}
}
if !errors.is_empty() {
Ok(TaskResult::Success(vec![]))
} else {
Ok(TaskResult::permanent(errors))
}
}