Refactored User Config loading, closes #3
All checks were successful
Run Tests on Code / run-tests (push) Successful in 11s

This commit is contained in:
Neshura 2024-04-10 18:55:17 +02:00
parent e1260877b6
commit 20af5172b4
Signed by: Neshura
GPG key ID: B6983AAA6B9A7A6C

View file

@ -1,8 +1,7 @@
use std::error::Error;
use std::fmt::{Display, format, Formatter};
use std::fs;
use std::net::{IpAddr, Ipv6Addr};
use std::path::Path;
use std::path::{Path, PathBuf};
use actix_web::{web, App, HttpResponse, HttpServer, get, Responder, HttpRequest};
use log::{LevelFilter};
use systemd_journal_logger::{connected_to_journal, JournalLog};
@ -74,36 +73,42 @@ impl Config {
// query every home directory for a config file (just attempt a load, an empty config is perfectly fine)
// merge all configs into one
let mut user_config = UserConfig::default();
for entry in fs::read_dir("/home").expect("home directory is expected") {
let entry = entry.expect("home directory is expected to have at least one directory");
let path = entry.path();
let root_contents = match fs::read_dir("/") {
Ok(contents) => { contents }
Err(e) => {
error!(e);
return Err(Box::new(e));
}
};
root_contents.for_each(|directory| {
let path = directory.expect("Unexpected Error while Unwrapping the listed Dir Entry").path();
if path.is_dir() {
let config_path = format!("{}/.config/{}/config.toml", path.display().to_string().as_str(), env!("CARGO_PKG_NAME"));
let mut path_config: UserConfig = match confy::load_path(config_path) {
Ok(data) => data,
Err(e) => {
match &e {
confy::ConfyError::GeneralLoadError(os_error) => {
if os_error.raw_os_error() == Some(13) {
let msg = format!("Missing read permissions for {}, skipping", path.display().to_string().as_str());
warn!(msg);
UserConfig::default()
}
else {
error!(e);
return Err(Box::new(e));
}
match path.display().to_string().as_str() {
"/root" => {
let mut root_configs = Self::load_user_config_directory(path);
user_config.domain_configs.append(&mut root_configs.domain_configs);
},
"/home" => {
match fs::read_dir(path) {
Ok(home_contents) => {
home_contents.for_each(|home_folder| {
let home_folder_path = home_folder.expect("Unexpected Error while Unwrapping the listed Home Dir Entry").path();
if home_folder_path.is_dir() {
let mut user_folder_configs = Self::load_user_config_directory(home_folder_path);
user_config.domain_configs.append(&mut user_folder_configs.domain_configs);
}
})
},
_ => {
Err(e) => {
error!(e);
return Err(Box::new(e));
}
}
}
};
user_config.domain_configs.append(&mut path_config.domain_configs)
},
_ => {}
}
}
}
});
let etc_path = format!("/etc/{}", env!("CARGO_PKG_NAME"));
let usr_path = format!("/usr/local/share/{}", env!("CARGO_PKG_NAME"));
@ -123,7 +128,7 @@ impl Config {
}
};
let path = format!("{}/config.toml", system_path.display().to_string().as_str());
let path = format!("{}/config.toml", system_path.display());
match confy::load_path(path.clone()) {
Ok(data) => {
let msg = format!("Using {}", path);
@ -139,6 +144,32 @@ impl Config {
}
}
}
fn load_user_config_directory(path: PathBuf) -> UserConfig {
let config_path = format!("{}/.config/{}/domains.toml", path.display(), env!("CARGO_PKG_NAME"));
match confy::load_path(config_path) {
Ok(data) => data,
Err(e) => {
match &e {
confy::ConfyError::GeneralLoadError(os_error) => {
if os_error.raw_os_error() == Some(13) {
let msg = format!("Missing read permissions for {}, skipping", path.display().to_string().as_str());
warn!(msg);
UserConfig::default()
}
else {
error!(e);
UserConfig::default()
}
},
_ => {
error!(e);
UserConfig::default()
}
}
}
}
}
}
#[actix_web::main]