dns-server 0.2.4

A threaded DNS server.
Documentation
dns-server
========
[![crates.io version](https://img.shields.io/crates/v/dns-server.svg)](https://crates.io/crates/dns-server)
[![license: Apache 2.0](https://gitlab.com/leonhard-llc/ops/-/raw/main/license-apache-2.0.svg)](https://gitlab.com/leonhard-llc/ops/-/raw/main/dns-server/LICENSE)
[![unsafe forbidden](https://gitlab.com/leonhard-llc/ops/-/raw/main/unsafe-forbidden.svg)](https://github.com/rust-secure-code/safety-dance/)
[![pipeline status](https://gitlab.com/leonhard-llc/ops/badges/main/pipeline.svg)](https://gitlab.com/leonhard-llc/ops/-/pipelines)

A threaded DNS server library.

# Use Cases
- Make your API server its own DNS server.
  This eliminates the DNS server as a separate point of failure.
- Keep your DNS config in code, next to your server code.
  Include it in code reviews and integration tests.
- DNS-based
  [domain validation for free ACME certificates]https://letsencrypt.org/how-it-works/.
  This is useful for servers that don't listen on port 80.
  Servers on port 80 can use HTTP for domain validation and don't need to use this.

# Features
- Depends only on `std`
- `forbid(unsafe_code)`
- ?% test coverage

# Limitations
- Brand new.

# Example
```rust
use dns_server::DnsRecord;
use permit::Permit;
use signal_hook::consts::{SIGHUP, SIGINT, SIGQUIT, SIGTERM};
use signal_hook::iterator::Signals;

let top_permit = Permit::new();
let permit = top_permit.new_sub();
std::thread::spawn(move || {
    Signals::new([SIGHUP, SIGINT, SIGQUIT, SIGTERM])
        .unwrap()
        .forever()
        .next();
    drop(top_permit);
});
let records = vec![
    DnsRecord::new_a("aaa.example.com", "10.0.0.1").unwrap(),
    DnsRecord::new_aaaa("aaa.example.com", "2606:2800:220:1:248:1893:25c8:1946").unwrap(),
    DnsRecord::new_cname("bbb.example.com", "ccc.example.com").unwrap(),
];
dns_server::Builder::new_port(8053)
    .unwrap()
    .with_permit(permit)
    .serve_static(&records)
    .unwrap();
```

# Related Crates

# Cargo Geiger Safety Report
```

Metric output format: x/y
    x = unsafe code used by the build
    y = total unsafe code found in the crate

Symbols: 
    🔒  = No `unsafe` usage found, declares #![forbid(unsafe_code)]
    ❓  = No `unsafe` usage found, missing #![forbid(unsafe_code)]
    ☢️  = `unsafe` usage found

Functions  Expressions  Impls  Traits  Methods  Dependency

0/0        0/0          0/0    0/0     0/0      🔒  dns-server 0.2.4
0/0        0/0          0/0    0/0     0/0      🔒  ├── prob-rate-limiter 0.1.1
0/0        0/0          0/0    0/0     0/0      🔒  │   └── oorandom 11.1.3
0/0        0/0          0/0    0/0     0/0      🔒  ├── fixed-buffer 0.3.1
0/0        0/0          0/0    0/0     0/0      🔒  ├── oorandom 11.1.3
0/0        0/0          0/0    0/0     0/0      🔒  └── permit 0.2.1

0/0        0/0          0/0    0/0     0/0    

```
# Changelog
- v0.2.4 - Depend on `permit` v0.2
- v0.2.3 - Remove a dependency
- v0.2.2 - Support [case randomization]https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00.
- v0.2.1
    - New API supporting dynamic responses.
    - Randomize order of static responses.
- v0.1.0 - Initial version

# To Do
- Message compression
- Decide whether to send back error responses.
- Ergonomic constructors that take `OsStr`, for using environment variables
- Custom TTLs
- NS records (and glue)
- Client
- Caching client
- Recursive resolver

# Alternatives


License: Apache-2.0