mirror of
https://github.com/SeriousBug/gandi-live-dns-rust
synced 2025-01-07 20:49:56 -06:00
Rename binary, 1.0.0 release, docker images
This commit is contained in:
parent
517c77ee05
commit
7eca3fbe5f
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/target
|
/target
|
||||||
gandi.toml
|
gandi.toml
|
||||||
|
*.tar*
|
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -225,8 +225,8 @@ dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gandi-rust-dns-updater"
|
name = "gandi-live-dns"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"die-exit",
|
"die-exit",
|
||||||
|
|
10
Cargo.toml
10
Cargo.toml
|
@ -1,8 +1,12 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gandi-rust-dns-updater"
|
name = "gandi-live-dns"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
strip = true
|
||||||
|
lto = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
reqwest = { version = "0.11.7", default-features= false, features = ["json", "rustls-tls"] }
|
reqwest = { version = "0.11.7", default-features= false, features = ["json", "rustls-tls"] }
|
||||||
|
@ -15,4 +19,4 @@ tokio = { version = "1.14.0", features = ["full"] }
|
||||||
futures = "0.3.17"
|
futures = "0.3.17"
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
# TODO: Relies on a yet-unreleased interface. Switch to an actual crate release once available
|
# TODO: Relies on a yet-unreleased interface. Switch to an actual crate release once available
|
||||||
die-exit = { git = "https://github.com/Xavientois/die.git", rev = "31d3801f4e21654b0b28430987b1e21fc7728676" }
|
die-exit = { git = "https://github.com/Xavientois/die.git", rev = "31d3801f4e21654b0b28430987b1e21fc7728676" }
|
||||||
|
|
1
Docker/.gitignore
vendored
Normal file
1
Docker/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
binaries
|
8
Docker/Dockerfile
Normal file
8
Docker/Dockerfile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
|
ARG TARGETPLATFORM
|
||||||
|
|
||||||
|
ADD binaries/$TARGETPLATFORM/gandi-live-dns /
|
||||||
|
|
||||||
|
WORKDIR /
|
||||||
|
ENTRYPOINT ["/gandi-live-dns"]
|
78
Readme.md
78
Readme.md
|
@ -1,24 +1,76 @@
|
||||||
## gandi-live-dns-rust
|
## gandi-live-dns-rust
|
||||||
|
|
||||||
A program that can set the IP addresses for configured DNS entries in [Gandi](https://gandi.net)'s domain configuration.
|
A program that can set the IP addresses for configured DNS entries in
|
||||||
Thanks to Gandi's [LiveDNS API](https://api.gandi.net/docs/livedns/), this creates a dynamic DNS system.
|
[Gandi](https://gandi.net)'s domain configuration. Thanks to Gandi's
|
||||||
|
[LiveDNS API](https://api.gandi.net/docs/livedns/),
|
||||||
|
this creates a dynamic DNS system.
|
||||||
|
|
||||||
|
If you want to host web services but you don't have a static IP address, this
|
||||||
|
tool will allow you to keep your domains pointed at the right IP address. This
|
||||||
|
program can update both IPv4 and IPv6 addresses for one or more domains and
|
||||||
|
subdomains. It's a one-shot tool that's meant to be managed with a systemd timer
|
||||||
|
or cron.
|
||||||
|
|
||||||
Inspired by [cavebeat's similar tool](https://github.com/cavebeat/gandi-live-dns),
|
Inspired by [cavebeat's similar tool](https://github.com/cavebeat/gandi-live-dns),
|
||||||
which seems to be unmaintained at the time I'm writing this. I decided to rewrite it in Rust as a learning project.
|
which seems to be unmaintained at the time I'm writing this. I decided to rewrite
|
||||||
|
it in Rust as a learning project.
|
||||||
This tool can update both IPv4 and IPv6 addresses for one or more domains and subdomains.
|
|
||||||
It's a "one-shot" tool that's then orchestrated with a systemd timer or cron.
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
> Warning!
|
||||||
|
>
|
||||||
|
> This tool does not rate limit itself, or otherwise do anything that limits how
|
||||||
|
> often it sends changes to Gandi's servers. It's up to you to use the tool
|
||||||
|
> properly and avoid abusing Gandi's servers. The tool is one-shot, so all you
|
||||||
|
> have to do is to avoid running it too often.
|
||||||
|
|
||||||
|
### Prebuilt binaries
|
||||||
|
|
||||||
|
`gandi-live-dns-rust` provides pre-built binaries with the releases. See the
|
||||||
|
[releases page](https://github.com/SeriousBug/gandi-live-dns-rust/releases) to
|
||||||
|
get the latest version. These binaries are statically linked, and provided for
|
||||||
|
both Linux and Windows, including ARM architectures for the Linux version.
|
||||||
|
|
||||||
|
Download the latest version from the releases page, extract it from the archive, and place it somewhere in your `$PATH` to use it.
|
||||||
|
|
||||||
- Create a file `gandi.toml`, then copy and paste the contents of [`example.toml`](https://raw.githubusercontent.com/SeriousBug/gandi-live-dns-rust/master/example.toml)
|
- Create a file `gandi.toml`, then copy and paste the contents of [`example.toml`](https://raw.githubusercontent.com/SeriousBug/gandi-live-dns-rust/master/example.toml)
|
||||||
- Follow the instructions in the example config to get your API key and put it in the config
|
- Follow the instructions in the example config to get your API key and put it in the config
|
||||||
- Follow the examples in the config to set up the entries you want to update
|
- Follow the examples in the config to set up the entries you want to update
|
||||||
- Download and extract the correct binary from the [releases page](https://github.com/SeriousBug/gandi-live-dns-rust/releases) and place it in your `PATH`, or just the current directory
|
- Run `gandi-live-dns` inside the directory with the configration to update your DNS entries
|
||||||
- Run `gandi-rust-dns-updater` to update your DNS entries
|
|
||||||
|
|
||||||
> Warning!
|
### With docker
|
||||||
>
|
|
||||||
> This tool does not rate limit itself, or otherwise do anything that limits how often it sends changes to Gandi's servers.
|
`gandi-live-dns-rust` has Docker images available for x86_64, arm64, armv6, and armv7 platforms.
|
||||||
> It's up to you to use the tool properly and avoid abusing Gandi's servers. The tool is one-shot, so all you have to do is
|
Follow the steps below to use these images.
|
||||||
> to avoid running it too often.
|
|
||||||
|
- Create a file `gandi.toml`, then copy and paste the contents of [`example.toml`](https://raw.githubusercontent.com/SeriousBug/gandi-live-dns-rust/master/example.toml)
|
||||||
|
- Follow the instructions in the example config to get your API key and put it in the config
|
||||||
|
- Follow the examples in the config to set up the entries you want to update
|
||||||
|
- Run `docker run --rm -it -v $(pwd)/gandi.toml:/gandi.toml:ro seriousbug/gandi-live-dns-rust:latest`
|
||||||
|
|
||||||
|
> Docker doesn't [support IPv6](https://docs.docker.com/config/daemon/ipv6/) out
|
||||||
|
> of the box. Check the linked page to enable it, or use the native option.
|
||||||
|
|
||||||
|
> If you get [errors](https://stackoverflow.com/questions/42248198/how-to-mount-a-single-file-in-a-volume) about not finding the config file, make sure your command
|
||||||
|
> has a full path to the config file (`$(pwd)/gandi.toml` part). Otherwise
|
||||||
|
> Docker will create a directory.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Local builds
|
||||||
|
|
||||||
|
`cargo build` and `cargo build --release` are sufficient for development and release builds.
|
||||||
|
No special instructions are needed.
|
||||||
|
|
||||||
|
### Making a release
|
||||||
|
|
||||||
|
To make a release, first set up `cross` and `docker`. Make sure you log into
|
||||||
|
Docker with `docker login`. Then follow these steps:
|
||||||
|
|
||||||
|
- bump up the version in `Cargo.toml` according to [semver](https://semver.org/)
|
||||||
|
- run `./make-release.sh`
|
||||||
|
> This will build binaries, then package them into archives, as well as
|
||||||
|
> build and upload docker images.
|
||||||
|
- Create a release on Github
|
||||||
|
- Make sure to create a tag for the release version on `master`
|
||||||
|
- Upload the binary archives to the Github release
|
||||||
|
|
70
make-release.sh
Executable file
70
make-release.sh
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Make sure `cross` is installed.
|
||||||
|
# You'll also need `sed`, and a relatively recent version of `tar`.
|
||||||
|
#
|
||||||
|
# This script runs does `sudo docker` to build and push the release to docker.
|
||||||
|
# If you have rootless docker set up, remove sudo from this variable.
|
||||||
|
DOCKER="sudo docker"
|
||||||
|
#
|
||||||
|
# Trap errors and interrupts
|
||||||
|
set -Eeuo pipefail
|
||||||
|
shopt -s extglob
|
||||||
|
function handle_sigint() {
|
||||||
|
echo "SIGINT, exiting..."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
trap handle_sigint SIGINT
|
||||||
|
function handle_err() {
|
||||||
|
echo "Error in run.sh!" 1>&2
|
||||||
|
echo "$(caller): ${BASH_COMMAND}" 1>&2
|
||||||
|
echo "Exiting..."
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
trap handle_err ERR
|
||||||
|
|
||||||
|
# Go to the root of the project
|
||||||
|
SCRIPT=$(realpath "${0}")
|
||||||
|
SCRIPTPATH=$(dirname "${SCRIPT}")
|
||||||
|
cd "${SCRIPTPATH}" || exit 12
|
||||||
|
|
||||||
|
declare -A TARGETS=(
|
||||||
|
['x86_64-unknown-linux-musl']='linux-x86_64'
|
||||||
|
['x86_64-pc-windows-gnu']='windows-x86_64'
|
||||||
|
['aarch64-unknown-linux-musl']='linux-arm64'
|
||||||
|
['armv7-unknown-linux-musleabihf']='linux-armv7'
|
||||||
|
['arm-unknown-linux-musleabihf']='linux-armv6'
|
||||||
|
)
|
||||||
|
|
||||||
|
declare -A DOCKER_TARGETS=(
|
||||||
|
['x86_64-unknown-linux-musl']='linux/amd64'
|
||||||
|
['aarch64-unknown-linux-musl']='linux/arm64'
|
||||||
|
['armv7-unknown-linux-musleabihf']='linux/arm/v7'
|
||||||
|
['arm-unknown-linux-musleabihf']='linux/arm/v6'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get the version number
|
||||||
|
VERSION=$(sed -nr 's/^version *= *"([0-9.]+)"/\1/p' Cargo.toml)
|
||||||
|
|
||||||
|
# Make the builds
|
||||||
|
for target in "${!TARGETS[@]}"; do
|
||||||
|
echo Building "${target}"
|
||||||
|
cross build -j $(($(nproc) / 2)) --release --target "${target}"
|
||||||
|
tar -acf "gandi-live-dns.${VERSION}.${TARGETS[${target}]}.tar.xz" target/"${target}"/release/gandi-live-dns?(|.exe)
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy files into place so Docker can get them easily
|
||||||
|
cd Docker
|
||||||
|
echo Building Docker images
|
||||||
|
mkdir -p binaries
|
||||||
|
for target in "${!DOCKER_TARGETS[@]}"; do
|
||||||
|
mkdir -p "binaries/${DOCKER_TARGETS[${target}]}"
|
||||||
|
cp ../target/"${target}"/release/gandi-live-dns?(|.exe) "binaries/${DOCKER_TARGETS[${target}]}/gandi-live-dns"
|
||||||
|
done
|
||||||
|
|
||||||
|
${DOCKER} buildx build . \
|
||||||
|
--platform=linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 \
|
||||||
|
--file "Dockerfile" \
|
||||||
|
--tag "seriousbug/gandi-live-dns-rust:latest" \
|
||||||
|
--tag "seriousbug/gandi-live-dns-rust:${VERSION}" \
|
||||||
|
--push
|
2
rust-toolchain.toml
Normal file
2
rust-toolchain.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "nightly"
|
Loading…
Reference in a new issue