From 7efa41a48c29bbdd28880d5f6c0ff8df17790146 Mon Sep 17 00:00:00 2001 From: Neshura Date: Mon, 25 Dec 2023 16:24:18 +0100 Subject: [PATCH] New config module --- src/config.rs | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/config.rs diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..42d1cd8 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,108 @@ +use std::collections::HashMap; +use std::error::Error; +use std::fs; +use std::hash::Hash; +use log::{error, warn}; +use serde_derive::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub(crate) struct InterfaceConfig { + pub(crate) host_address: String, + pub(crate) interfaces: HashMap, +} + +impl InterfaceConfig { + pub(crate) fn load() -> Result> { + let cfg: Self = match confy::load(env!("CARGO_PKG_NAME"),"interfaces") { + Ok(data) => data, + Err(e) => { + error!("[ERROR] {}", e); + return Err(Box::new(e)); + } + }; + + Ok(cfg) + } +} + +impl Default for InterfaceConfig { + fn default() -> Self { + InterfaceConfig { + host_address: "::".to_string(), + interfaces: HashMap::from([(" ".to_string(), "::".to_string())]), + } + } +} + +/////////////// + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub(crate) struct ZoneEntry { + pub(crate) name: String, + pub(crate) rtype: u8, + pub(crate) interface: String, +} + +impl Default for ZoneEntry { + fn default() -> Self { + ZoneEntry { + name: " ".to_string(), + rtype: 10, + interface: " ".to_string(), + } + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub(crate) struct ZoneConfig { + pub(crate) email: String, + pub(crate) zone: String, + pub(crate) id: String, + #[serde(alias="entry")] + pub(crate) entries: Vec +} + +impl ZoneConfig { + pub(crate) fn load() -> Result, Box> { + let path = confy::get_configuration_file_path(env!("CARGO_PKG_NAME"), "interfaces").expect("Something went wrong with confy"); + let zones_dir = path.parent().expect("Something went wrong with confy").join("zones.d/"); + + let zones = fs::read_dir(zones_dir).unwrap(); + + let mut zone_configs: Vec = vec![]; + + for entry in zones { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + warn!("[WARN] Subdirectory in zones.d detected, this should not be the case"); + } + else { + let zone_config_path = format!("zones.d/{}", path.file_stem() + .expect("stem could not be extracted from filename").to_str() + .expect("&OsStr could not be converted to &str")); + match confy::load(env!("CARGO_PKG_NAME"), zone_config_path.as_str()) { + Ok(data) => zone_configs.push(data), + Err(e) => { + error!("[ERROR] {}", e); + return Err(Box::new(e)); + } + }; + } + } + + Ok(zone_configs) + } +} + +impl Default for ZoneConfig { + fn default() -> Self { + ZoneConfig { + email: " ".to_string(), + zone: " ".to_string(), + id: " ".to_string(), + entries: vec![ZoneEntry::default()], + } + } +} + diff --git a/src/main.rs b/src/main.rs index 1be5b33..5f22021 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use reqwest::blocking::get; use serde_derive::{Deserialize, Serialize}; use std::{fs, thread::{sleep}}; use chrono::{Utc, Duration}; +mod config; mod cloudflare; fn default_key() -> String { @@ -359,7 +360,8 @@ fn main() { let mut now = Utc::now() - Duration::seconds(59); let mut current = now; - loop { + let ifaces = config::InterfaceConfig::load().unwrap(); + let zone_cfgs= config::ZoneConfig::load().unwrap(); now = Utc::now(); if now >= current + Duration::seconds(60) { current = now;