1
0
mirror of https://github.com/vbrandl/bind9-api.git synced 2025-08-01 11:11:51 +02:00

4 Commits

Author SHA1 Message Date
Valentin Brandl
c42640a088 Add Dockerfile 2021-06-01 08:31:48 +02:00
Valentin Brandl
bee19e4c78 Document building the project 2020-11-30 16:40:07 +01:00
Valentin Brandl
be5c8c6e62 Fix deprecation 2020-11-30 16:35:31 +01:00
Valentin Brandl
55aa95a41c Fix breaking change in ToHex crate 2020-11-30 16:35:19 +01:00
6 changed files with 42 additions and 7 deletions

22
Dockerfile Normal file
View File

@@ -0,0 +1,22 @@
FROM lukemathwalker/cargo-chef as planner
WORKDIR app
COPY . .
RUN cargo chef prepare --recipe-path recipe.json
FROM lukemathwalker/cargo-chef as cacher
WORKDIR app
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
FROM rust as builder
WORKDIR app
COPY . .
# Copy over the cached dependencies
COPY --from=cacher /app/target target
COPY --from=cacher $CARGO_HOME $CARGO_HOME
RUN cargo build --release --bin bind9-api
FROM rust as runtime
WORKDIR app
COPY --from=builder /app/target/release/bind9-api /usr/local/bin
ENTRYPOINT ["/usr/local/bin/bind9-api"]

View File

@@ -7,6 +7,19 @@
This is an attempt to implement an API to create, update or delete DNS records This is an attempt to implement an API to create, update or delete DNS records
on a BIND9 DNS server. on a BIND9 DNS server.
## Building
To compile the code, you first need to [install Rust](https://rustup.rs/). Then
you can run
```
cargo build --release
```
in the project root. The server and client binary will be located in
`./target/release/bind9-api` and `./target/release/bind9-api-client`
respectively.
## Server ## Server
The server will wait for incoming requests and uses the `nsupdate` command to The server will wait for incoming requests and uses the `nsupdate` command to

View File

@@ -106,7 +106,7 @@ fn call_api<D: serde::Serialize>(
let data_s = serde_json::to_string(&data)?; let data_s = serde_json::to_string(&data)?;
info!("body: {}", data_s); info!("body: {}", data_s);
let signature = crypto::sign(config.secret.as_bytes(), data_s.as_bytes()); let signature = crypto::sign(config.secret.as_bytes(), data_s.as_bytes());
let signature = crypto::bytes_to_hex_str(&signature)?; let signature = crypto::bytes_to_hex_str(&signature);
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let url = format!("{}/record", config.host); let url = format!("{}/record", config.host);
Ok(if method == Method::POST { Ok(if method == Method::POST {

View File

@@ -55,10 +55,8 @@ use ring::{digest, hmac};
type Result<T> = std::result::Result<T, Error>; type Result<T> = std::result::Result<T, Error>;
/// Converts a byte slice to a lowercase hex string. /// Converts a byte slice to a lowercase hex string.
pub fn bytes_to_hex_str(bytes: &[u8]) -> Result<String> { pub fn bytes_to_hex_str(bytes: &[u8]) -> String {
let mut output = String::new(); bytes.encode_hex::<String>()
bytes.write_hex(&mut output)?;
Ok(output)
} }
/// Converts a hey string to a vec of bytes. /// Converts a hey string to a vec of bytes.

1
recipe.json Normal file

File diff suppressed because one or more lines are too long

View File

@@ -104,7 +104,7 @@ pub struct Validated<T>(T);
impl<T: 'static + ::serde::de::DeserializeOwned> FromRequest<Arc<Config>> for Validated<T> { impl<T: 'static + ::serde::de::DeserializeOwned> FromRequest<Arc<Config>> for Validated<T> {
type Config = (); type Config = ();
type Result = Box<Future<Item = Self, Error = Error>>; type Result = Box<dyn Future<Item = Self, Error = Error>>;
fn from_request(req: &HttpRequest<Arc<Config>>, _: &Self::Config) -> Self::Result { fn from_request(req: &HttpRequest<Arc<Config>>, _: &Self::Config) -> Self::Result {
let state = req.state().clone(); let state = req.state().clone();
@@ -134,7 +134,8 @@ impl<T> Deref for Validated<T> {
} }
fn extract_signature<S>(req: &HttpRequest<S>) -> Result<Vec<u8>> { fn extract_signature<S>(req: &HttpRequest<S>) -> Result<Vec<u8>> {
Ok(req.headers() Ok(req
.headers()
.get(::data::TOKEN_HEADER) .get(::data::TOKEN_HEADER)
.as_ref() .as_ref()
.ok_or_else(|| ErrorUnauthorized(ParseError::Header))? .ok_or_else(|| ErrorUnauthorized(ParseError::Header))?