DNS, DKIM and ACME improvements - part 3
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user