aboutsummaryrefslogtreecommitdiff
path: root/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs39
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");
+ }
+ }
+
}