Bump to dns-update 0.5.0

This commit is contained in:
Maurus Decimus
2026-05-23 19:20:25 +02:00
parent 777cf1252b
commit 4866cd331a
13 changed files with 217 additions and 138 deletions

View File

@@ -191,10 +191,25 @@ async fn dkim_management(server: &Server, task: &TaskDomainManagement) -> trc::R
// Publish key
if let Some((updater, origin)) = &dns_updater {
let record = generate_dkim_dns_record(&signature, &domain.name).await?;
let signature_transition = if updater
.create(origin, &record.name, record.record, true, true)
let dns_update::DnsRecord::TXT(txt_value) = &record.record else {
return Ok(TaskResult::permanent(
"DKIM record must be a TXT record".to_string(),
));
};
let propagation_target = txt_value.clone();
let published = updater
.set_rrset(
origin,
&record.name,
dns_update::DnsRecordType::TXT,
vec![record.record.clone()],
)
.await
.is_ok_and(|did_propagate| did_propagate)
.is_ok();
let signature_transition = if published
&& updater
.wait_for_txt_propagation(&record.name, origin, &propagation_target)
.await
{
trc::event!(
Dkim(DkimEvent::SignaturePublished),
@@ -243,10 +258,27 @@ async fn dkim_management(server: &Server, task: &TaskDomainManagement) -> trc::R
for signature in publish_signatures {
let record = generate_dkim_dns_record(&signature.object, &domain.name).await?;
if let Some((updater, origin)) = &dns_updater {
match updater
.create(origin, &record.name, record.record, true, true)
.await
{
let dns_update::DnsRecord::TXT(txt_value) = &record.record else {
return Ok(TaskResult::permanent(
"DKIM record must be a TXT record".to_string(),
));
};
let propagation_target = txt_value.clone();
let publish_result = updater
.set_rrset(
origin,
&record.name,
dns_update::DnsRecordType::TXT,
vec![record.record.clone()],
)
.await;
let propagation_result = match &publish_result {
Ok(_) => Ok(updater
.wait_for_txt_propagation(&record.name, origin, &propagation_target)
.await),
Err(err) => Err(err.clone()),
};
match propagation_result {
Ok(true) => {
let signature_transition =
UTCDateTime::from_timestamp((now + dkim.rotate_after.as_secs()) as i64);
@@ -354,7 +386,12 @@ async fn dkim_management(server: &Server, task: &TaskDomainManagement) -> trc::R
let record = generate_dkim_dns_record_name(&signature.object, &domain.name);
if let Some((updater, origin)) = &dns_updater {
match updater
.delete(origin, &record, dns_update::DnsRecordType::TXT)
.set_rrset(
origin,
&record,
dns_update::DnsRecordType::TXT,
Vec::new(),
)
.await
{
Ok(_) => {

View File

@@ -6,11 +6,11 @@
use crate::task_manager::TaskResult;
use common::Server;
use dns_update::{DnsRecord, DnsRecordType};
use registry::schema::structs::{
DnsManagement, Domain, Task, TaskDnsManagement, TaskDomainManagement, TaskStatus,
};
use std::fmt::Write;
use store::ahash::AHashSet;
use std::{collections::HashMap, fmt::Write};
pub(crate) trait DnsManagementTask: Sync + Send {
fn dns_management(&self, task: &TaskDnsManagement) -> impl Future<Output = TaskResult> + Send;
@@ -60,20 +60,19 @@ async fn dns_management(server: &Server, task: &TaskDnsManagement) -> trc::Resul
.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;
// Group records by (name, type) so each RRSet is published in one call.
let mut by_owner: HashMap<(String, DnsRecordType), Vec<DnsRecord>> = HashMap::new();
for record in records {
by_owner
.entry((record.name, record.record.as_type()))
.or_default()
.push(record.record);
}
// Add new records
let mut errors = String::new();
for record in records {
for ((name, record_type), recs) in by_owner {
if let Err(err) = dns_updater
.create(origin, &record.name, record.record, false, false)
.set_rrset(origin, &name, record_type, recs)
.await
{
if !errors.is_empty() {
@@ -81,8 +80,10 @@ async fn dns_management(server: &Server, task: &TaskDnsManagement) -> trc::Resul
}
let _ = write!(
&mut errors,
"Failed to create DNS record for {}: {}",
record.name, err
"Failed to set DNS RRSet for {}/{}: {}",
name,
record_type.as_str(),
err
);
}
}