adding infra to load settings from file

This commit is contained in:
2025-11-01 13:12:05 +01:00
parent 636d650e3d
commit 5f85c5b388
5 changed files with 212 additions and 1 deletions

View File

@@ -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"

View File

@@ -4,3 +4,6 @@ version = "0.1.0"
edition = "2024"
[dependencies]
once_cell = "1.19"
serde = "1.0"
serde_json = "1.0"

View File

@@ -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...");
}

View File

@@ -0,0 +1 @@
pub mod settings;

View File

@@ -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<RwLock<Settings>> = 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::<i64>() {
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(),
}
}