diff --git a/Cargo.lock b/Cargo.lock index ea1da06de14e68eeb2101a4531e0773b5ad14755..46b8969fd3988fbd27847602970c20dd4bc14c8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -397,6 +397,7 @@ dependencies = [ "dup-crypto 0.6.0", "durs-common-tools 0.1.0", "durs-module 0.1.0-a0.1", + "envy 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -619,6 +620,14 @@ name = "either" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "envy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.86 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "failure" version = "0.1.5" @@ -1627,6 +1636,7 @@ dependencies = [ "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" +"checksum envy 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "261b836bcf13f42a01c70351f56bd7b66db6e6fb58352bd214cb77e9269a34b4" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" diff --git a/lib/core/conf/Cargo.toml b/lib/core/conf/Cargo.toml index 9094937b9d3b69d1d6c03b6a63087bccc9ff5d55..8af117b4aabea6303d20cceca1cde21e4f791bfd 100644 --- a/lib/core/conf/Cargo.toml +++ b/lib/core/conf/Cargo.toml @@ -22,5 +22,6 @@ serde = "1.0.*" serde_derive = "1.0.*" serde_json = "1.0.*" rpassword = "1.0.0" +envy = "0.4.*" [features] diff --git a/lib/core/conf/src/lib.rs b/lib/core/conf/src/lib.rs index 061f15a262dc6eda2f1bf88f87e1796caf6420f3..3233d48c344ca5af51dbfe2a9db035e5fa3edc9b 100644 --- a/lib/core/conf/src/lib.rs +++ b/lib/core/conf/src/lib.rs @@ -118,6 +118,20 @@ impl Default for DuRsConfV1 { } } +#[derive(Debug, Copy, Clone, Deserialize, PartialEq)] +#[serde(field_identifier)] +/// Ressource usage +pub enum ResourceUsageConf { //TODO: Hack the serializer!!! + /// Minimal use of the resource, to the detriment of performance + Minimal, + /// Trade-off between resource use and performance + Medium, + /// A performance-oriented trade-off, the use of the resource is slightly limited + Large, + /// No restrictions on the use of the resource, maximizes performance + Infinite, +} + #[derive(Debug, Copy, Clone, Deserialize, PartialEq, Serialize)] /// Ressource usage pub enum ResourceUsage { @@ -156,7 +170,7 @@ impl Default for ResourcesUsage { #[derive(Debug, Clone, Deserialize, PartialEq, Serialize)] /// Duniter configuration v2 -pub struct DuRsConfV2 { +pub struct DuRsConfV2 { //TODO: Only for V2, use ARG ENV /// Currency name pub currency: CurrencyName, /// Duniter node unique identifier @@ -171,6 +185,32 @@ pub struct DuRsConfV2 { pub enabled: HashSet<ModuleName>, } +// TODO: implem from DursConfV2 +#[derive(Debug, Clone, Deserialize, PartialEq)] +/// Optional configs loaded by the user (from config file or environment variables) +pub struct DursUserConfV3 { + /// Currency name + pub currency: Option<CurrencyName>, + /// Duniter node unique identifier + pub my_node_id: Option<u32>, + /// Name of the module used by default for synchronization + pub default_sync_module: Option<ModuleName>, + /// Cpu usage + pub cpu_usage: Option<ResourceUsageConf>, + /// Network usage + pub network_usage: Option<ResourceUsageConf>, + /// Memory usage + pub memory_usage: Option<ResourceUsageConf>, + /// Disk space usage + pub disk_space_usage: Option<ResourceUsageConf>, + /// Disabled modules + pub disabled: Option<HashSet<ModuleName>>, + /// Enabled modules + pub enabled: Option<HashSet<ModuleName>>, + /// Config modules in Json + pub modules_conf: Option<ModulesConf> +} + impl Default for DuRsConfV2 { fn default() -> Self { DuRsConfV2 { @@ -197,9 +237,21 @@ impl From<DuRsConfV1> for DuRsConfV2 { } } +#[derive(Clone, Debug, Deserialize)] +/// For the moment use less, check if needed. +pub enum DursUserConf { + /// + V3 { + /// + global_conf: DursUserConfV3, + /// + modules_conf: ModulesConf + } +} + #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] /// Durs node configuration -pub enum DuRsConf { +pub enum DuRsConf { //TODO: Duplicate to DursUserConf (versioning) /// Durs node configuration v1 V1(DuRsConfV1), /// Durs node configuration v2 @@ -209,6 +261,7 @@ pub enum DuRsConf { /// Modules configuration modules_conf: ModulesConf, }, + //TODO: Add V3 } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] @@ -253,6 +306,8 @@ impl Default for DuRsConf { } } +// TODO: Add fn to (UserConfV3 from file , UserConfV3 from ENV) => DursConfV3 (computeRealConf) + impl DursConfTrait for DuRsConf { type GlobalConf = DuRsGlobalConf; @@ -264,6 +319,7 @@ impl DursConfTrait for DuRsConf { } => DuRsGlobalConf::V2(global_conf.clone()), } } + //TODO: Don't implem V1 => V3 fn upgrade(self) -> (Self, bool) { if let DuRsConf::V1(conf_v1) = self { let modules_conf = conf_v1.modules.clone(); @@ -499,7 +555,7 @@ pub fn get_profile_path(profiles_path: &Option<PathBuf>, profile_name: &str) -> } /// Get keypairs file path -pub fn keypairs_filepath(profiles_path: &Option<PathBuf>, profile: &str) -> PathBuf { +pub fn keypairs_filepath(profiles_path: &Option<PathBuf>, profile: &str) -> PathBuf { //TODO: Is it used??? let profile_path = get_profile_path(profiles_path, profile); let mut conf_keys_path = profile_path.clone(); conf_keys_path.push(constants::KEYPAIRS_FILENAME); @@ -631,20 +687,47 @@ pub fn load_conf_at_path( keypairs }; + +// #[derive(Serialize, Deserialize, Debug)] +// struct TestConf { +// name:String +// } + // Open conf file let mut conf_path = profile_path; conf_path.push(constants::CONF_FILENAME); let conf = if conf_path.as_path().exists() { match File::open(conf_path.as_path()) { Ok(mut f) => { + let mut contents = String::new(); f.read_to_string(&mut contents) .map_err(DursConfFileError::ReadError)?; + + println!("CONF.JSON: \n {}",&contents); + // Parse conf file - let conf: DuRsConf = + let file_conf: DursUserConfV3 = serde_json::from_str(&contents).map_err(DursConfFileError::ParseError)?; + + println!("Conf from file: {:?}",file_conf); + + let env_conf = envy::from_env::<DursUserConfV3>().unwrap_or_else(|e| { + panic!(dbg!(format!("Fatal error : fail to parse environment variable : {}", e))); + }); + + println!("Conf from env: {:?}",env_conf); + + let conf = generate_from_user_conf(file_conf); + + println!("Final conf: {:?}", conf); // Upgrade conf to latest version let (conf, upgraded) = conf.upgrade(); + + //TODO: gen ENV conf + //TODO: merge + //Then compute the real conf from both + // If conf is upgraded, rewrite conf file if upgraded { write_conf_file(conf_path.as_path(), &conf) @@ -666,6 +749,10 @@ pub fn load_conf_at_path( Ok((conf, keypairs)) } +fn generate_from_user_conf(conf:DursUserConfV3) -> DuRsConf { + DuRsConf::default() +} + /// Save keypairs in profile folder // Warning: This function cannot use the macro fatal_error! because the logger is not yet initialized, so it must use panic ! pub fn write_keypairs_file( diff --git a/lib/core/core/src/commands/mod.rs b/lib/core/core/src/commands/mod.rs index bea553d7be56134be34c2333da12d554d4708eea..cc955a4466b909cd1451ddeac86980b6244657a2 100644 --- a/lib/core/core/src/commands/mod.rs +++ b/lib/core/core/src/commands/mod.rs @@ -45,6 +45,7 @@ pub struct DursCoreOptions { pub profile_name: Option<String>, /// Path where user profiles are persisted pub profiles_path: Option<PathBuf>, + //TODO: add env prefix } /// Durs executable command diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs index 32826c329cbb1e2dfc7cb7dfa011d0a2c7864d8a..71aa50b487acae6369350f5d54ad81488a427c39 100644 --- a/lib/core/core/src/lib.rs +++ b/lib/core/core/src/lib.rs @@ -56,6 +56,7 @@ use std::path::PathBuf; use std::sync::mpsc; use std::thread; use unwrap::unwrap; +use std::process::exit; #[macro_export] /// Plug modules in durs core @@ -238,6 +239,7 @@ impl DursCore<DuRsConf> { .map_err(DursCoreError::ConfFileError)?; info!("Success to load global conf."); + exit(42); // Instanciate durs core Ok(DursCore { keypairs, @@ -523,6 +525,7 @@ pub fn get_module_conf<M: DursModule<DuRsConf, DursMsg>>( if let Some(module_conf_json) = module_conf_json { let module_user_conf: Option<M::ModuleUserConf> = serde_json::from_str(module_conf_json.to_string().as_str())?; + //TODO: Call fn merge of M::ModuleUserConf M::generate_module_conf(global_conf, module_user_conf) } else { M::generate_module_conf(global_conf, None) diff --git a/lib/core/module/src/lib.rs b/lib/core/module/src/lib.rs index 629f84fa7b26153d0664a7a4f1ad47131a4668c1..08be57875e0deba2b02b56e269c8c2adaba2b756 100644 --- a/lib/core/module/src/lib.rs +++ b/lib/core/module/src/lib.rs @@ -400,7 +400,7 @@ pub trait DursModule<DC: DursConfTrait, M: ModuleMessage> { + Debug + Default + DeserializeOwned - + Merge + + Merge //Note: Added trait Merge + Send + Serialize + Sync;