#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
use crate::Algorithm;
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
use hickory_client::proto::dnssec::SigningKey;
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
use crate::providers::ovh::{OvhEndpoint, OvhProvider};
#[cfg(feature = "test_provider")]
use crate::providers::{in_memory::InMemoryProvider, pebble::PebbleProvider};
#[cfg(feature = "test_provider")]
use crate::NamedDnsRecord;
#[cfg(feature = "test_provider")]
use std::sync::{Arc, Mutex};
use crate::{
DnsRecord, DnsRecordType, DnsUpdater, IntoFqdn, TsigAlgorithm,
providers::{
bunny::BunnyProvider,
cloudflare::CloudflareProvider,
desec::DesecProvider,
digitalocean::DigitalOceanProvider,
dnsimple::DNSimpleProvider,
porkbun::PorkBunProvider,
rfc2136::{DnsAddress, Rfc2136Provider},
route53::Route53Provider,
spaceship::SpaceshipProvider,
},
};
use std::time::Duration;
impl DnsUpdater {
pub fn new_rfc2136_tsig(
addr: impl TryInto<DnsAddress>,
key_name: impl AsRef<str>,
key: impl Into<Vec<u8>>,
algorithm: TsigAlgorithm,
) -> crate::Result<Self> {
Ok(DnsUpdater::Rfc2136(Rfc2136Provider::new_tsig(
addr,
key_name,
key,
algorithm.into(),
)?))
}
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
#[deprecated(
since = "0.2.1",
note = "SIG(0) will be removed in v0.3.0, upstream hickory-client v0.26 drops SIG(0) message authentication; use `new_rfc2136_tsig` instead"
)]
pub fn new_rfc2136_sig0(
addr: impl TryInto<DnsAddress>,
signer_name: impl AsRef<str>,
key: Box<dyn SigningKey>,
public_key: impl Into<Vec<u8>>,
algorithm: Algorithm,
) -> crate::Result<Self> {
Ok(DnsUpdater::Rfc2136(Rfc2136Provider::new_sig0(
addr,
signer_name,
key,
public_key,
algorithm.into(),
)?))
}
pub fn new_cloudflare(
secret: impl AsRef<str>,
email: Option<impl AsRef<str>>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::Cloudflare(CloudflareProvider::new(
secret, email, timeout,
)?))
}
pub fn new_digitalocean(
auth_token: impl AsRef<str>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::DigitalOcean(DigitalOceanProvider::new(
auth_token, timeout,
)))
}
pub fn new_desec(
auth_token: impl AsRef<str>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::Desec(DesecProvider::new(auth_token, timeout)))
}
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
pub fn new_ovh(
application_key: impl AsRef<str>,
application_secret: impl AsRef<str>,
consumer_key: impl AsRef<str>,
endpoint: OvhEndpoint,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::Ovh(OvhProvider::new(
application_key,
application_secret,
consumer_key,
endpoint,
timeout,
)?))
}
pub fn new_bunny(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
Ok(DnsUpdater::Bunny(BunnyProvider::new(api_key, timeout)?))
}
pub fn new_porkbun(
api_key: impl AsRef<str>,
secret_api_key: impl AsRef<str>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::Porkbun(PorkBunProvider::new(
api_key,
secret_api_key,
timeout,
)))
}
pub fn new_spaceship(
api_key: impl AsRef<str>,
api_secret: impl AsRef<str>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::Spaceship(SpaceshipProvider::new(
api_key, api_secret, timeout,
)))
}
pub fn new_dnsimple(
auth_token: impl AsRef<str>,
account_id: impl AsRef<str>,
timeout: Option<Duration>,
) -> crate::Result<Self> {
Ok(DnsUpdater::DNSimple(DNSimpleProvider::new(
auth_token, account_id, timeout,
)))
}
pub fn new_google_cloud_dns(
config: crate::providers::google_cloud_dns::GoogleCloudDnsConfig,
) -> crate::Result<Self> {
Ok(DnsUpdater::GoogleCloudDns(
crate::providers::google_cloud_dns::GoogleCloudDnsProvider::new(config)?,
))
}
pub fn new_route53(config: crate::providers::route53::Route53Config) -> crate::Result<Self> {
Ok(DnsUpdater::Route53(Route53Provider::new(config)))
}
#[cfg(feature = "test_provider")]
pub fn new_pebble(base_url: impl AsRef<str>, timeout: Option<Duration>) -> Self {
DnsUpdater::Pebble(PebbleProvider::new(base_url, timeout))
}
#[cfg(feature = "test_provider")]
pub fn new_in_memory(records: Arc<Mutex<Vec<NamedDnsRecord>>>) -> Self {
DnsUpdater::InMemory(InMemoryProvider::new(records))
}
pub async fn create(
&self,
name: impl IntoFqdn<'_>,
record: DnsRecord,
ttl: u32,
origin: impl IntoFqdn<'_>,
) -> crate::Result<()> {
match self {
DnsUpdater::Bunny(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Cloudflare(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Desec(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::DigitalOcean(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::DNSimple(provider) => provider.create(name, record, ttl, origin).await,
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
DnsUpdater::Ovh(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Porkbun(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Rfc2136(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Route53(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::Spaceship(provider) => provider.create(name, record, ttl, origin).await,
DnsUpdater::GoogleCloudDns(provider) => {
provider.create(name, record, ttl, origin).await
}
#[cfg(feature = "test_provider")]
DnsUpdater::Pebble(provider) => provider.create(name, record, ttl, origin).await,
#[cfg(feature = "test_provider")]
DnsUpdater::InMemory(provider) => provider.create(name, record, ttl, origin).await,
}
}
pub async fn update(
&self,
name: impl IntoFqdn<'_>,
record: DnsRecord,
ttl: u32,
origin: impl IntoFqdn<'_>,
) -> crate::Result<()> {
match self {
DnsUpdater::Bunny(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Cloudflare(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Desec(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::DigitalOcean(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::DNSimple(provider) => provider.update(name, record, ttl, origin).await,
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
DnsUpdater::Ovh(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Porkbun(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Rfc2136(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Route53(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::Spaceship(provider) => provider.update(name, record, ttl, origin).await,
DnsUpdater::GoogleCloudDns(provider) => {
provider.update(name, record, ttl, origin).await
}
#[cfg(feature = "test_provider")]
DnsUpdater::Pebble(provider) => provider.update(name, record, ttl, origin).await,
#[cfg(feature = "test_provider")]
DnsUpdater::InMemory(provider) => provider.update(name, record, ttl, origin).await,
}
}
pub async fn delete(
&self,
name: impl IntoFqdn<'_>,
origin: impl IntoFqdn<'_>,
record: DnsRecordType,
) -> crate::Result<()> {
match self {
DnsUpdater::Bunny(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Cloudflare(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Desec(provider) => provider.delete(name, origin, record).await,
DnsUpdater::DigitalOcean(provider) => provider.delete(name, origin, record).await,
DnsUpdater::DNSimple(provider) => provider.delete(name, origin, record).await,
#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
DnsUpdater::Ovh(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Porkbun(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Rfc2136(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Route53(provider) => provider.delete(name, origin, record).await,
DnsUpdater::Spaceship(provider) => provider.delete(name, origin, record).await,
DnsUpdater::GoogleCloudDns(provider) => provider.delete(name, origin, record).await,
#[cfg(feature = "test_provider")]
DnsUpdater::Pebble(provider) => provider.delete(name, origin, record).await,
#[cfg(feature = "test_provider")]
DnsUpdater::InMemory(provider) => provider.delete(name, origin, record).await,
}
}
}