This commit is contained in:
D. Scott Boggs 2025-02-09 11:20:08 -05:00
parent 05b51d1c85
commit f55484be15
4 changed files with 44 additions and 7 deletions

7
Cargo.lock generated
View file

@ -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"

View file

@ -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"]

24
src/config.rs Normal file
View file

@ -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<IpAddr, Vec<String>>,
}
impl Config {
pub fn load() -> anyhow::Result<Self> {
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)?)
}
}

View file

@ -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<str>, expected_ip: IpAddr) -> anyhow::Result<()> {