diff --git a/.gitignore b/.gitignore index ea8c4bf..36ef3bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +secret.toml diff --git a/Cargo.lock b/Cargo.lock index cba6ad5..91d0c45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,6 +202,7 @@ dependencies = [ "reqwest", "serde", "structopt", + "tokio", "toml", ] @@ -351,6 +352,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "ipnet" version = "2.3.1" @@ -384,6 +394,15 @@ version = "0.2.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98a04dce437184842841303488f70d0188c5f51437d2a834dc097eafa909a01" +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.14" @@ -460,6 +479,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "once_cell" version = "1.8.0" @@ -499,6 +528,31 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -690,6 +744,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "security-framework" version = "2.4.2" @@ -756,12 +816,27 @@ dependencies = [ "serde", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + [[package]] name = "slab" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +[[package]] +name = "smallvec" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" + [[package]] name = "socket2" version = "0.4.2" @@ -862,10 +937,26 @@ dependencies = [ "libc", "memchr", "mio", + "num_cpus", + "once_cell", + "parking_lot", "pin-project-lite", + "signal-hook-registry", + "tokio-macros", "winapi", ] +[[package]] +name = "tokio-macros" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio-native-tls" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 66ff634..d944b57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,9 @@ edition = "2021" [dependencies] -reqwest = "0.11.7" +reqwest = { version = "0.11.7", features = ["json"] } toml = "0.5.8" serde = { version = "1.0", features = ["derive"] } directories = "4.0.1" structopt = "0.3.25" +tokio = { version = "1.14.0", features = ["full"] } diff --git a/config.toml b/config.toml deleted file mode 100644 index 0e238ee..0000000 --- a/config.toml +++ /dev/null @@ -1 +0,0 @@ -fqdn = "remote.kaangenc.me" diff --git a/example.toml b/example.toml new file mode 100644 index 0000000..825073e --- /dev/null +++ b/example.toml @@ -0,0 +1,2 @@ +fqdn = "my-website.example.com" +api_key = "xxxxxxxxxxxxxxxxxxxxxxxx" diff --git a/src/config.rs b/src/config.rs index aa9c99c..0c83d89 100644 --- a/src/config.rs +++ b/src/config.rs @@ -7,7 +7,8 @@ use crate::opts; #[derive(Deserialize, Debug)] pub struct Config { - fqdn: String, + pub fqdn: String, + pub api_key: String, } pub fn load_config(file: PathBuf) -> Result> { diff --git a/src/main.rs b/src/main.rs index 2ceef41..4a7f812 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,41 @@ -use structopt::StructOpt; +use reqwest::{header, Client, ClientBuilder}; use std::error::Error; -mod opts; +use structopt::StructOpt; +use tokio; mod config; - +mod opts; fn gandi_api(fqdn: &str) -> String { return format!("https://api.gandi.net/v5/livedns/domains/{}/records", fqdn); } -fn main() -> Result<(), Box> { +fn api_client(api_key: &str) -> Result> { + let client_builder = ClientBuilder::new(); + + let key = format!("Apikey {}", api_key); + let mut auth_value = header::HeaderValue::from_str(&key)?; + let mut headers = header::HeaderMap::new(); + auth_value.set_sensitive(true); + headers.insert(header::AUTHORIZATION, auth_value); + let accept_value = header::HeaderValue::from_static("application/json"); + headers.insert(header::ACCEPT, accept_value); + let client = client_builder.default_headers(headers).build()?; + return Ok(client); +} + +#[tokio::main] +async fn main() -> Result<(), Box> { let opts = opts::Opts::from_args(); - println!("{:#?}", opts); let conf_path = config::config_path(&opts); - println!("{:#?}", conf_path); - let conf = config::load_config(conf_path); - println!("{:#?}", conf); - println!("Hello, world!"); + println!("Loading config from {:#?}", conf_path); + let conf = config::load_config(conf_path)?; + println!("Checking domain {:#?}", conf.fqdn); + let url = gandi_api(&conf.fqdn); + let client = api_client(&conf.api_key)?; + + let out = client.get(url).send().await?; + println!("Output: {:#?}", out); + println!("Output: {:#?}", out.json().await?); return Ok(()); }