diff options
Diffstat (limited to 'src/config.rs')
| -rw-r--r-- | src/config.rs | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/src/config.rs b/src/config.rs index d9dbe74..181f099 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,7 @@ use crate::dyndns_service::DynDnsProvider; use crate::error::{AppError, AppResult}; use crate::ip_service::IpServiceProvider; +use crate::network::get_active_network_adapters; use fqdn::FQDN; use log::warn; use serde::{Deserialize, Serialize}; @@ -50,6 +51,17 @@ impl Config { Err(AppError::ConfigFileNotProvided) } + + pub fn validate(self) -> AppResult<Self> { + let interfaces: Vec<String> = self.networks.iter().filter_map(|network| network.interface.clone()).collect(); + if !interfaces.is_empty() { + let adapters = get_active_network_adapters()?; + adapters.iter().find(|adapter| interfaces.contains(&adapter.name)) + .ok_or(AppError::UnableToFindNetworkInterface(interfaces.join(",")))?; + } + + Ok(self) + } } #[derive(Debug, Deserialize, Serialize)] @@ -80,6 +92,12 @@ pub struct DnsRecord { record_type: DnsRecordType, } +impl DnsRecord { + pub fn new(fqdn: FQDN) -> Self { + Self { fqdn, ttl: default_ttl(), record_type: default_record_type() } + } +} + fn default_record_type() -> DnsRecordType { DnsRecordType::A } @@ -92,10 +110,7 @@ mod tests { use super::*; use crate::dyndns_service::DynDnsProvider::Gandi; use crate::dyndns_service::gandi::GandiConfig; - use crate::{ - assert_config_file_not_found, assert_config_parse_error, assert_error, assert_io_error, - test, - }; + use crate::{assert_config_file_not_found, assert_config_parse_error, assert_error, assert_io_error, assert_unable_to_find_network_interface_error, test}; use serde_json::json; use std::fs::read_dir; use std::path::{Path, PathBuf}; @@ -190,4 +205,20 @@ mod tests { assert_io_error!(Config::load(vec![path.to_path_buf()])); } } + + test! { + fn unknown_network_interface() { + let config = Config { + networks: vec![WanConfig { + interface: Some("unknown0".to_string()), + dns_record: DnsRecord::new(FQDN::from_str("some.domain.com")?), + providers: vec![DynDnsProvider::Noop], + ip_service: IpServiceProvider::Noop, + }] + }; + + assert_unable_to_find_network_interface_error!(config.validate(), "unknown0"); + } + } + } |
