diff --git a/Cargo.lock b/Cargo.lock index ae857ab..f77cc5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,7 @@ dependencies = [ "log", "serde", "serde_yaml_ng", + "xdg", ] [[package]] @@ -413,3 +414,9 @@ dependencies = [ "js-sys", "wasm-bindgen", ] + +[[package]] +name = "xdg" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" diff --git a/Cargo.toml b/Cargo.toml index dc5be1a..a3f5c2b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ anyhow = "1.0.95" femme = "2.2.1" serde = { version = "1.0.217", features = ["derive"] } serde_yaml_ng = "0.10.0" +xdg = "2.5.2" [dependencies.log] version = "0.4.25" features = ["kv", "serde"] diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..86a6d37 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,24 @@ +use std::{collections::BTreeMap, env, fs::File, net::IpAddr, path::PathBuf, str::FromStr}; + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct Config { + pub domains: BTreeMap>, +} + +impl Config { + pub fn load() -> anyhow::Result { + let config_loc = env::var("DNS_CHECK_CONFIG") + .map_err(anyhow::Error::new) + .and_then(|path| PathBuf::from_str(path.as_str()).map_err(anyhow::Error::new)) + .or_else(|_| -> anyhow::Result<_> { + // .or_else::<_, impl FnOnce(_) -> anyhow::Result<_>>(|_| { + let cfg_loc = xdg::BaseDirectories::with_prefix("dns-check")? + .place_config_file("config.yml")?; + Ok(cfg_loc) + })?; + let file = File::open(config_loc)?; + Ok(serde_yaml_ng::from_reader(file)?) + } +} diff --git a/src/main.rs b/src/main.rs index e198e3a..24405df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,23 @@ +mod config; pub mod dig_response; -use std::net::IpAddr; +use std::{net::IpAddr, thread::sleep, time::Duration}; +use config::Config; use dig_response::DigResponse; use anyhow::anyhow; fn main() -> anyhow::Result<()> { - run_dns_check("techwork.zone", "67.240.19.249".parse()?) - // let txt = File::open("example.txt")?; - // let data: DigResponse = serde_yaml_ng::from_reader(txt)?; - // println!("{data:?}"); - // println!("{:?}", data.answers()?); - // Ok(()) + let config = Config::load()?; + println!("starting DNS check for {} domains", config.domains.len()); + for (expected_ip, domains) in config.domains.into_iter() { + for domain in &domains { + sleep(Duration::from_millis(250)); + run_dns_check(domain, expected_ip)?; + } + } + Ok(()) } fn run_dns_check(domain: impl AsRef, expected_ip: IpAddr) -> anyhow::Result<()> {