Fix subdomain matching
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
b26d4d7bba
commit
2e3442faa9
|
@ -51,7 +51,10 @@ pub async fn dns_updater_task(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip entries for unallowed domains
|
// Skip entries for unallowed domains
|
||||||
if !allowed_domains.iter().any(|d| key.dns_path.ends_with(d)) {
|
if !allowed_domains
|
||||||
|
.iter()
|
||||||
|
.any(|d| key.dns_path == *d || key.dns_path.ends_with(&format!(".{}", d)))
|
||||||
|
{
|
||||||
error!(
|
error!(
|
||||||
domain = key.dns_path,
|
domain = key.dns_path,
|
||||||
"domain/subdomain/hostname not in allowed list",
|
"domain/subdomain/hostname not in allowed list",
|
||||||
|
@ -59,7 +62,9 @@ pub async fn dns_updater_task(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let provider = providers.iter().find(|p| key.dns_path.ends_with(&p.domain));
|
let provider = providers.iter().find(|p| {
|
||||||
|
key.dns_path == p.domain || key.dns_path.ends_with(&format!(".{}", p.domain))
|
||||||
|
});
|
||||||
|
|
||||||
if let Some(provider) = provider {
|
if let Some(provider) = provider {
|
||||||
if let Err(e) = update_dns_entry(key, value, provider).await {
|
if let Err(e) = update_dns_entry(key, value, provider).await {
|
||||||
|
@ -87,11 +92,15 @@ async fn update_dns_entry(
|
||||||
value: &DnsEntryValue,
|
value: &DnsEntryValue,
|
||||||
provider: &DomainProvider,
|
provider: &DomainProvider,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let subdomain = key
|
let subdomain = if key.dns_path == provider.domain {
|
||||||
.dns_path
|
None
|
||||||
.strip_suffix(&provider.domain)
|
} else {
|
||||||
.unwrap()
|
Some(
|
||||||
.trim_end_matches('.');
|
key.dns_path
|
||||||
|
.strip_suffix(&format!(".{}", provider.domain))
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
};
|
||||||
info!(
|
info!(
|
||||||
record = key.to_string(),
|
record = key.to_string(),
|
||||||
target = value.to_string(),
|
target = value.to_string(),
|
||||||
|
@ -116,7 +125,7 @@ async fn update_dns_entry(
|
||||||
}
|
}
|
||||||
provider
|
provider
|
||||||
.provider
|
.provider
|
||||||
.update_a(&provider.domain, &subdomain, &targets)
|
.update_a(&provider.domain, subdomain, &targets)
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
DnsRecordType::AAAA => {
|
DnsRecordType::AAAA => {
|
||||||
|
@ -129,7 +138,7 @@ async fn update_dns_entry(
|
||||||
}
|
}
|
||||||
provider
|
provider
|
||||||
.provider
|
.provider
|
||||||
.update_aaaa(&provider.domain, &subdomain, &targets)
|
.update_aaaa(&provider.domain, subdomain, &targets)
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
DnsRecordType::CNAME => {
|
DnsRecordType::CNAME => {
|
||||||
|
@ -145,7 +154,7 @@ async fn update_dns_entry(
|
||||||
}
|
}
|
||||||
provider
|
provider
|
||||||
.provider
|
.provider
|
||||||
.update_cname(&provider.domain, &subdomain, &targets[0])
|
.update_cname(&provider.domain, subdomain, &targets[0])
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,10 +56,16 @@ impl DnsProvider for GandiProvider {
|
||||||
"gandi"
|
"gandi"
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_a(&self, domain: &str, subdomain: &str, targets: &[Ipv4Addr]) -> Result<()> {
|
async fn update_a(
|
||||||
|
&self,
|
||||||
|
domain: &str,
|
||||||
|
subdomain: Option<&str>,
|
||||||
|
targets: &[Ipv4Addr],
|
||||||
|
) -> Result<()> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/A",
|
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/A",
|
||||||
domain, subdomain
|
domain,
|
||||||
|
subdomain.unwrap_or("@")
|
||||||
);
|
);
|
||||||
|
|
||||||
let rrset = GandiRrset {
|
let rrset = GandiRrset {
|
||||||
|
@ -70,10 +76,16 @@ impl DnsProvider for GandiProvider {
|
||||||
self.put_rrset(&url, &rrset).await
|
self.put_rrset(&url, &rrset).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_aaaa(&self, domain: &str, subdomain: &str, targets: &[Ipv6Addr]) -> Result<()> {
|
async fn update_aaaa(
|
||||||
|
&self,
|
||||||
|
domain: &str,
|
||||||
|
subdomain: Option<&str>,
|
||||||
|
targets: &[Ipv6Addr],
|
||||||
|
) -> Result<()> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/AAAA",
|
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/AAAA",
|
||||||
domain, subdomain
|
domain,
|
||||||
|
subdomain.unwrap_or("@")
|
||||||
);
|
);
|
||||||
|
|
||||||
let rrset = GandiRrset {
|
let rrset = GandiRrset {
|
||||||
|
@ -84,10 +96,16 @@ impl DnsProvider for GandiProvider {
|
||||||
self.put_rrset(&url, &rrset).await
|
self.put_rrset(&url, &rrset).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_cname(&self, domain: &str, subdomain: &str, target: &str) -> Result<()> {
|
async fn update_cname(
|
||||||
|
&self,
|
||||||
|
domain: &str,
|
||||||
|
subdomain: Option<&str>,
|
||||||
|
target: &str,
|
||||||
|
) -> Result<()> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/CNAME",
|
"https://api.gandi.net/v5/livedns/domains/{}/records/{}/CNAME",
|
||||||
domain, subdomain
|
domain,
|
||||||
|
subdomain.unwrap_or("@")
|
||||||
);
|
);
|
||||||
|
|
||||||
let rrset = GandiRrset {
|
let rrset = GandiRrset {
|
||||||
|
|
|
@ -8,9 +8,20 @@ use async_trait::async_trait;
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait DnsProvider: Send + Sync {
|
pub trait DnsProvider: Send + Sync {
|
||||||
fn provider(&self) -> &'static str;
|
fn provider(&self) -> &'static str;
|
||||||
async fn update_a(&self, domain: &str, subdomain: &str, targets: &[Ipv4Addr]) -> Result<()>;
|
async fn update_a(
|
||||||
async fn update_aaaa(&self, domain: &str, subdomain: &str, targets: &[Ipv6Addr]) -> Result<()>;
|
&self,
|
||||||
async fn update_cname(&self, domain: &str, subdomain: &str, target: &str) -> Result<()>;
|
domain: &str,
|
||||||
|
subdomain: Option<&str>,
|
||||||
|
targets: &[Ipv4Addr],
|
||||||
|
) -> Result<()>;
|
||||||
|
async fn update_aaaa(
|
||||||
|
&self,
|
||||||
|
domain: &str,
|
||||||
|
subdomain: Option<&str>,
|
||||||
|
targets: &[Ipv6Addr],
|
||||||
|
) -> Result<()>;
|
||||||
|
async fn update_cname(&self, domain: &str, subdomain: Option<&str>, target: &str)
|
||||||
|
-> Result<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for dyn DnsProvider {
|
impl std::fmt::Debug for dyn DnsProvider {
|
||||||
|
|
Loading…
Reference in New Issue