1 unstable release
0.1.0-alpha.0 | Dec 22, 2024 |
---|
#1375 in Asynchronous
25KB
561 lines
dnsaur
An asynchronous DNS stub resolver.
Motivation
The monoio async runtime does not ship with an asynchronous DNS resolver, and rather relies
on a threadpool to handle the blocking calls (like most other runtimes). This library aims to do the resolution in an async manner, including the file system access (using io_uring
).
Usage
use std::net::IpAddr;
use std::time::Duration;
use std::collections::BTreeSet;
use dnsaur::{StubResolver, Error};
#[monoio::main(driver = "iouring", enable_timer = true)]
async fn main() -> Result<(), Error> {
let mut dns = dnsaur::StubResolver::load().await?;
// pairs of (ip, ttl)
let ips: Vec<(IpAddr, Duration)> = dns.lookup("example.com").await?;
let ips = dns.lookup::<BTreeSet<_>>("example.com").await?;
// reload
let _ = dns.reload().await?;
Ok(())
}
or if you want a global client instance, enable the feature global
:
use std::net::IpAddr;
use std::time::Duration;
use std::collections::BTreeSet;
use dnsaur::Error;
#[monoio::main(driver = "iouring", enable_timer = true)]
async fn main() -> Result<(), Error> {
// pairs of (ip, ttl)
let ips: Vec<(IpAddr, Duration)> = dnsaur::lookup("example.com").await?;
let ips = dnsaur::lookup::<BTreeSet<_>>("example.com").await?;
// reload
let _ = dnsaur::reload().await?;
// autoreload
monoio::spawn(async {
loop {
monoio::time::sleep(Duration::from_secs(5 * 60)).await;
let _ = dnsaur::reload().await?;
}
Ok::<(), Error>(())
});
Ok(())
}
Details
/etc/hosts
and/etc/resolv.conf
are parsed to build the configuration.- The entries in the
hosts
are tried first, and if not present, thenameservers
fromresolv.conf
will be queried. - Querying of the nameservers is done sequentially (i.e. we query the second nameserver only if the first one has failed).
- A and AAAA records are queried concurrently.
- Default UDP buffer size is 1232 bytes.
Non-standard behavior
limitation | glibc | dnsaur |
---|---|---|
nameserver |
3 | unlimited |
timeout |
30 | u8::MAX |
ndots |
15 | u8::MAX |
attempts |
5 | u8::MAX |
TODO
- Support for
rotate
Status
Hic Sunt Dracones
License
Mozilla Public License Version 2.0. See the LICENSE file for details.
Acknowledgement
This library is inspired by async-dns
Dependencies
~6–17MB
~176K SLoC