From 5f85c5b3881aa61e2c65bdad58bc1aeb8b3e913b Mon Sep 17 00:00:00 2001 From: Janis Steiner Date: Sat, 1 Nov 2025 13:12:05 +0100 Subject: [PATCH] adding infra to load settings from file --- client/protector/Cargo.lock | 106 ++++++++++++++++++++++ client/protector/Cargo.toml | 3 + client/protector/src/main.rs | 27 +++++- client/protector/src/settings/mod.rs | 1 + client/protector/src/settings/settings.rs | 76 ++++++++++++++++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 client/protector/src/settings/mod.rs create mode 100644 client/protector/src/settings/settings.rs diff --git a/client/protector/Cargo.lock b/client/protector/Cargo.lock index 840923e..72fbdc7 100644 --- a/client/protector/Cargo.lock +++ b/client/protector/Cargo.lock @@ -2,6 +2,112 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + [[package]] name = "protector" version = "0.1.0" +dependencies = [ + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" diff --git a/client/protector/Cargo.toml b/client/protector/Cargo.toml index 8122b0e..f8b887c 100644 --- a/client/protector/Cargo.toml +++ b/client/protector/Cargo.toml @@ -4,3 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] +once_cell = "1.19" +serde = "1.0" +serde_json = "1.0" diff --git a/client/protector/src/main.rs b/client/protector/src/main.rs index e7a11a9..829d9a2 100644 --- a/client/protector/src/main.rs +++ b/client/protector/src/main.rs @@ -1,3 +1,28 @@ +//protector client + +#![allow(unused_parens)] // do not warn about unused parentheses + +mod settings; +use settings::settings as set; + +//const SETTINGS_FILE: &str = "/etc/protector/conf/protector.conf"; +const DEBUG: bool = true; +//only debug +const SETTINGS_FILE: &str = "protector.conf"; + fn main() { - println!("Hello, world!"); + println!("Starting Protector Client"); + println!("Loading settings from conf file"); + if(!set::load_settings(SETTINGS_FILE)){ + println!("error reading config file\nexiting..."); + std::process::exit(3); + } + if(DEBUG){ + let b = set::get_settings_value_str("server_ip"); + let c = set::get_settings_value_int("server_port"); + let d = set::get_settings_value_str("server_secret"); + let e = set::get_settings_value_str("client_secret"); + println!("Server ip is {} and port is {}.\nAnd server_secret is {} and client_secret is {}",b,c,d,e); + } + println!("Finished, exiting..."); } diff --git a/client/protector/src/settings/mod.rs b/client/protector/src/settings/mod.rs new file mode 100644 index 0000000..2e1da48 --- /dev/null +++ b/client/protector/src/settings/mod.rs @@ -0,0 +1 @@ +pub mod settings; diff --git a/client/protector/src/settings/settings.rs b/client/protector/src/settings/settings.rs new file mode 100644 index 0000000..33f822f --- /dev/null +++ b/client/protector/src/settings/settings.rs @@ -0,0 +1,76 @@ +use std::fs; +use std::sync::RwLock; +use once_cell::sync::Lazy; + +pub struct Settings { + pub server_ip: String, + pub server_port: i64, + pub client_secret: String, + pub server_secret: String, +} + +pub static SETTINGS: Lazy> = Lazy::new(|| { + RwLock::new(Settings { + server_ip: String::new(), + server_port: 0, + client_secret: String::new(), + server_secret: String::new(), + }) +}); + +pub fn load_settings(path: &str) -> bool { + let contents = match fs::read_to_string(path) { + Ok(c) => c, + Err(_) => return false, //file error + }; + + let mut settings = SETTINGS.write().unwrap(); + + for line in contents.lines() { + let line = line.trim(); + if (line.is_empty() || line.starts_with('#') || line.starts_with("//") || line.starts_with("[")) { + continue; //skip comments + } + + let (key, value) = match line.split_once(':') { + Some(kv) => kv, + None => return false, // malformed line, should be name: value + }; + + let key = key.trim(); + let value = value.trim(); + + match key { //can be used with a lot more settings key&values + "server_ip" => settings.server_ip = value.to_string(), + "client_secret" => settings.client_secret = value.to_string(), + "server_secret" => settings.server_secret = value.to_string(), + "server_port" => { + match value.parse::() { + Ok(port) => settings.server_port = port, + Err(_) => return false, // invalid port number + } + } + _ => continue, //return false, // unknown key + } + } + + return true; +} + +pub fn get_settings_value_int(name: &str) -> i64 { + let settings = SETTINGS.read().unwrap(); + match name{ + "server_port" => return settings.server_port, + _ => return 0, + } +} + +pub fn get_settings_value_str(name: &str) -> String { + let settings = SETTINGS.read().unwrap(); + match name{ + "server_ip" => return settings.server_ip.clone(), + "server_secret" => return settings.server_secret.clone(), + "client_secret" => return settings.client_secret.clone(), + _ => return "err_not_found".to_string(), + } +}