1#![doc = include_str!("../README.md")]
2#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
14use providers::oraclecloud::OracleCloudProvider;
15#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
16use providers::ovh::OvhProvider;
17#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
18use providers::volcengine::VolcengineProvider;
19#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
20use providers::yandexcloud::YandexCloudProvider;
21
22#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
23use providers::transip::TransipProvider;
24
25#[cfg(feature = "test_provider")]
26use providers::{in_memory::InMemoryProvider, pebble::PebbleProvider};
27
28pub use hickory_proto::dnssec;
29use providers::{
30 alidns::AlidnsProvider, bluecatv2::BluecatV2Provider, bunny::BunnyProvider,
31 cloudflare::CloudflareProvider, cloudns::ClouDnsProvider, constellix::ConstellixProvider,
32 ddnss::DdnssProvider, desec::DesecProvider, digitalocean::DigitalOceanProvider,
33 dnsimple::DNSimpleProvider, dnsmadeeasy::DnsMadeEasyProvider, dreamhost::DreamhostProvider,
34 duckdns::DuckDnsProvider, dynu::DynuProvider, easydns::EasyDnsProvider,
35 exoscale::ExoscaleProvider, freemyip::FreeMyIpProvider, gandiv5::GandiV5Provider,
36 gcore::GcoreProvider, glesys::GlesysProvider, godaddy::GodaddyProvider,
37 hetzner::HetznerProvider, hostingde::HostingDeProvider, infomaniak::InfomaniakProvider,
38 ionos::IonosProvider, ipv64::Ipv64Provider, joker::JokerProvider, linode::LinodeProvider,
39 luadns::LuaDnsProvider, mythicbeasts::MythicBeastsProvider, namecheap::NamecheapProvider,
40 namedotcom::NameDotComProvider, namesilo::NameSiloProvider, netcup::NetcupProvider,
41 netlify::NetlifyProvider, nifcloud::NifcloudProvider, ns1::Ns1Provider, pdns::PdnsProvider,
42 porkbun::PorkBunProvider, rfc2136::Rfc2136Provider, route53::Route53Provider,
43 scaleway::ScalewayProvider, spaceship::SpaceshipProvider, tencentcloud::TencentCloudProvider,
44 vercel::VercelProvider, vultr::VultrProvider, websupport::WebSupportProvider,
45};
46
47use providers::{
48 arvancloud::ArvanCloudProvider, autodns::AutodnsProvider, azuredns::AzureDnsProvider,
49 baiducloud::BaiduCloudProvider, cpanel::CpanelProvider, domeneshop::DomeneshopProvider,
50 edgedns::EdgeDnsProvider, hostinger::HostingerProvider, huaweicloud::HuaweiCloudProvider,
51 hurricane::HurricaneProvider, ibmcloud::IbmCloudProvider, infoblox::InfobloxProvider,
52 inwx::InwxProvider, lightsail::LightsailProvider, plesk::PleskProvider,
53 safedns::SafeDnsProvider, simplycom::SimplyComProvider, ultradns::UltraDnsProvider,
54};
55use std::{
56 borrow::Cow,
57 net::{Ipv4Addr, Ipv6Addr},
58};
59
60pub mod bind;
61pub mod crypto;
62pub mod http;
63pub mod jwt;
64pub mod providers;
65pub mod tests;
66pub mod update;
67pub mod utils;
68
69#[derive(Debug)]
70#[non_exhaustive]
71pub enum Error {
72 Protocol(String),
73 Parse(String),
74 Client(String),
75 Response(String),
76 Api(String),
77 Serialize(String),
78 Unauthorized,
79 NotFound,
80 BadRequest,
81 Unsupported(String),
82 InvalidRegion,
83}
84
85#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
87pub enum DnsRecordType {
88 A,
89 AAAA,
90 CNAME,
91 NS,
92 MX,
93 TXT,
94 SRV,
95 TLSA,
96 CAA,
97}
98
99#[derive(Clone, Debug, PartialEq, Eq, Hash)]
101pub struct NamedDnsRecord {
102 pub name: String,
103 pub record: DnsRecord,
104}
105
106#[derive(Clone, Debug, PartialEq, Eq, Hash)]
108pub enum DnsRecord {
109 A(Ipv4Addr),
110 AAAA(Ipv6Addr),
111 CNAME(String),
112 NS(String),
113 MX(MXRecord),
114 TXT(String),
115 SRV(SRVRecord),
116 TLSA(TLSARecord),
117 CAA(CAARecord),
118}
119
120#[derive(Clone, Debug, PartialEq, Eq, Hash)]
122pub struct MXRecord {
123 pub exchange: String,
124 pub priority: u16,
125}
126
127#[derive(Clone, Debug, PartialEq, Eq, Hash)]
129pub struct SRVRecord {
130 pub target: String,
131 pub priority: u16,
132 pub weight: u16,
133 pub port: u16,
134}
135
136#[derive(Clone, Debug, PartialEq, Eq, Hash)]
138pub struct TLSARecord {
139 pub cert_usage: TlsaCertUsage,
140 pub selector: TlsaSelector,
141 pub matching: TlsaMatching,
142 pub cert_data: Vec<u8>,
143}
144
145#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
146pub enum TlsaCertUsage {
147 PkixTa,
148 PkixEe,
149 DaneTa,
150 DaneEe,
151 Private,
152}
153
154#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
155pub enum TlsaSelector {
156 Full,
157 Spki,
158 Private,
159}
160
161#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
162pub enum TlsaMatching {
163 Raw,
164 Sha256,
165 Sha512,
166 Private,
167}
168
169#[derive(Clone, Debug, PartialEq, Eq, Hash)]
171pub enum CAARecord {
172 Issue {
173 issuer_critical: bool,
174 name: Option<String>,
175 options: Vec<KeyValue>,
176 },
177 IssueWild {
178 issuer_critical: bool,
179 name: Option<String>,
180 options: Vec<KeyValue>,
181 },
182 Iodef {
183 issuer_critical: bool,
184 url: String,
185 },
186}
187
188#[derive(Clone, Debug, PartialEq, Eq, Hash)]
189pub struct KeyValue {
190 pub key: String,
191 pub value: String,
192}
193
194pub enum TsigAlgorithm {
196 HmacMd5,
197 Gss,
198 HmacSha1,
199 HmacSha224,
200 HmacSha256,
201 HmacSha256_128,
202 HmacSha384,
203 HmacSha384_192,
204 HmacSha512,
205 HmacSha512_256,
206}
207
208pub enum Algorithm {
210 RSASHA256,
211 RSASHA512,
212 ECDSAP256SHA256,
213 ECDSAP384SHA384,
214 ED25519,
215}
216
217pub type Result<T> = std::result::Result<T, Error>;
218
219#[derive(Clone)]
220#[non_exhaustive]
221pub enum DnsUpdater {
222 Rfc2136(Rfc2136Provider),
223 Cloudflare(CloudflareProvider),
224 DigitalOcean(DigitalOceanProvider),
225 Desec(DesecProvider),
226 Constellix(ConstellixProvider),
227 DnsMadeEasy(DnsMadeEasyProvider),
228 Exoscale(ExoscaleProvider),
229 Nifcloud(NifcloudProvider),
230 #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
231 Ovh(OvhProvider),
232 #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
233 OracleCloud(OracleCloudProvider),
234 Bunny(BunnyProvider),
235 Linode(LinodeProvider),
236 Porkbun(PorkBunProvider),
237 Spaceship(SpaceshipProvider),
238 WebSupport(WebSupportProvider),
239 DNSimple(DNSimpleProvider),
240 GandiV5(GandiV5Provider),
241 Godaddy(GodaddyProvider),
242 Hetzner(HetznerProvider),
243 NameDotCom(NameDotComProvider),
244 NameSilo(NameSiloProvider),
245 DuckDns(DuckDnsProvider),
246 FreeMyIp(FreeMyIpProvider),
247 Ipv64(Ipv64Provider),
248 Ddnss(DdnssProvider),
249 Dynu(DynuProvider),
250 Pdns(PdnsProvider),
251 Plesk(PleskProvider),
252 Cpanel(CpanelProvider),
253 GoogleCloudDns(providers::google_cloud_dns::GoogleCloudDnsProvider),
254 Ionos(IonosProvider),
255 HostingDe(HostingDeProvider),
256 Infomaniak(InfomaniakProvider),
257 Netcup(NetcupProvider),
258 Netlify(NetlifyProvider),
259 HuaweiCloud(HuaweiCloudProvider),
260 BaiduCloud(BaiduCloudProvider),
261 AzureDns(AzureDnsProvider),
262 IbmCloud(IbmCloudProvider),
263 Hurricane(HurricaneProvider),
264 Hostinger(HostingerProvider),
265 Autodns(AutodnsProvider),
266 Lightsail(LightsailProvider),
267 EdgeDns(EdgeDnsProvider),
268 #[cfg(feature = "test_provider")]
269 Pebble(PebbleProvider),
270 #[cfg(feature = "test_provider")]
271 InMemory(InMemoryProvider),
272 Route53(Route53Provider),
273 Scaleway(ScalewayProvider),
274 Gcore(GcoreProvider),
275 Vercel(VercelProvider),
276 Vultr(VultrProvider),
277 BluecatV2(BluecatV2Provider),
278 EasyDns(EasyDnsProvider),
279 Joker(JokerProvider),
280 MythicBeasts(MythicBeastsProvider),
281 Namecheap(NamecheapProvider),
282 #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
283 Transip(TransipProvider),
284 Ns1(Ns1Provider),
285 LuaDns(LuaDnsProvider),
286 ClouDns(ClouDnsProvider),
287 Glesys(GlesysProvider),
288 Dreamhost(DreamhostProvider),
289 Alidns(AlidnsProvider),
290 TencentCloud(TencentCloudProvider),
291 #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
292 Volcengine(VolcengineProvider),
293 #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
294 YandexCloud(YandexCloudProvider),
295 Domeneshop(DomeneshopProvider),
296 Safedns(SafeDnsProvider),
297 SimplyCom(SimplyComProvider),
298 ArvanCloud(ArvanCloudProvider),
299 Inwx(InwxProvider),
300 UltraDns(UltraDnsProvider),
301 Infoblox(InfobloxProvider),
302}
303
304pub trait IntoFqdn<'x> {
305 fn into_fqdn(self) -> Cow<'x, str>;
306 fn into_name(self) -> Cow<'x, str>;
307}