# Zone Update
[](https://crates.io/crates/zone-update)
[](https://docs.rs/zone-update)
[](https://github.com/tarka/zone-update/actions)
[](https://github.com/tarka/zone-update/blob/main/README.md#License)
A minimal Rust library providing CRUD-like operations on DNS records with various DNS providers.
## Overview
Zone Update is a lightweight library that provides a simple interface for
programmatically managing DNS zone records through provider APIs.
The library is both blocking and async, and supports multiple async runtimes
(see below).
### Supported DNS providers
Currently, Zone Update supports the following DNS providers:
* Cloudflare
* deSEC
* DigitalOcean
* Dnsimple
* DnsMadeEasy
* Gandi
* Linode
* Porkbun
See the [DNS providers matrix](docs/PROVIDERS.md) for more details.
### Supported Runtimes
`zone-update` supports both blocking and async APIs. For async the library
attempts to be as provider-agnostic; it is known (tested) to work with the
following runtimes:
* [tokio](https://tokio.rs/)
* [smol](https://docs.rs/smol/)
* [compio](https://compio.rs/)
* [monoio](https://github.com/bytedance/monoio)
* [glommio](https://github.com/DataDog/glommio)
### Feature flags
Each DNS provider is gated behind their name, however all provider are enabled
by default. To limit the providers you can add `zone-update` to your
`Cargo.toml` in the following format:
```text
zone-update = { version = "*", default-features = false, features = ["digitalocean", "desec"] }
```
The other notable flag is `async`, which is not enabled by default.
## Usage
### Basic Example
```rust
use zone_update::{gandi, DnsProvider, errors::Result};
use std::net::Ipv4Addr;
fn update_gandi_record() -> Result<()> {
let config = zone_update::Config {
domain: "example.com".to_string(),
dry_run: false,
};
let auth = gandi::Auth::ApiKey("your-api-key".to_string());
let client = gandi::Gandi::new(config, auth);
let host = "www";
let new_ip = Ipv4Addr::new(192, 0, 2, 1);
// Update the A record for www.example.com
client.update_a_record(host, &new_ip)?;
Ok(())
}
```
See the `examples` directory for other use-cases.
## Contributing
At this point the most useful contributions would be to add additional DNS
provider APIs. However other contributions are welcome.
### AI Contribution Policy
This reason this project will not accept runtime code generated by
AI. Generation of _draft_ documentation and test code is acceptable, but should
be reviewed by the submitter before raising a PR.
## License
This project is licensed under either of:
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE-2.0.txt))
- MIT license ([LICENSE-MIT](LICENSE-MIT))
at your option.