From e0e5317b44f67b6bd8d5f79db478c19a1855542c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Fri, 26 May 2023 16:49:19 +0100 Subject: [PATCH] creating full directory structure on init --- clients/native/src/client/config/mod.rs | 13 +++++--- clients/native/src/commands/init.rs | 11 ++++++- clients/socks5/src/commands/init.rs | 11 ++++++- clients/socks5/src/config/mod.rs | 13 +++++--- gateway/src/commands/init.rs | 9 +++++- gateway/src/config/mod.rs | 13 +++++--- mixnode/src/commands/init.rs | 18 ++++++++--- .../desktop/src-tauri/src/config/mod.rs | 31 +++++++++++-------- .../network-requester/src/cli/init.rs | 9 +++++- 9 files changed, 95 insertions(+), 33 deletions(-) diff --git a/clients/native/src/client/config/mod.rs b/clients/native/src/client/config/mod.rs index a3b3efea90..4770d0b6ba 100644 --- a/clients/native/src/client/config/mod.rs +++ b/clients/native/src/client/config/mod.rs @@ -27,15 +27,20 @@ mod template; const DEFAULT_CLIENTS_DIR: &str = "clients"; -/// Derive default path to client's config file. -/// It should get resolved to `$HOME/.nym/clients//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { +/// Derive default path to clients's config directory. +/// It should get resolved to `$HOME/.nym/mixnodes//config` +pub fn default_config_directory>(id: P) -> PathBuf { must_get_home() .join(NYM_DIR) .join(DEFAULT_CLIENTS_DIR) .join(id) .join(DEFAULT_CONFIG_DIR) - .join(DEFAULT_CONFIG_FILENAME) +} + +/// Derive default path to client's config file. +/// It should get resolved to `$HOME/.nym/clients//config/config.toml` +pub fn default_config_filepath>(id: P) -> PathBuf { + default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) } /// Derive default path to client's data directory where files, such as keys, are stored. diff --git a/clients/native/src/commands/init.rs b/clients/native/src/commands/init.rs index 823d015da5..88b6e3b815 100644 --- a/clients/native/src/commands/init.rs +++ b/clients/native/src/commands/init.rs @@ -1,7 +1,9 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::client::config::default_config_filepath; +use crate::client::config::{ + default_config_directory, default_config_filepath, default_data_directory, +}; use crate::commands::try_upgrade_v1_1_13_config; use crate::{ client::config::Config, @@ -16,6 +18,7 @@ use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; use std::net::IpAddr; +use std::{fs, io}; use tap::TapFallible; #[derive(Args, Clone)] @@ -119,6 +122,11 @@ impl Display for InitResults { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { eprintln!("Initialising client..."); @@ -131,6 +139,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), ClientError> { eprintln!("Client \"{id}\" was already initialised before"); true } else { + init_paths(id)?; false }; diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 89016b343a..a99c64aef6 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use crate::commands::try_upgrade_v1_1_13_config; -use crate::config::{default_config_filepath, Config}; +use crate::config::{ + default_config_directory, default_config_filepath, default_data_directory, Config, +}; use crate::{ commands::{override_config, OverrideConfig}, error::Socks5ClientError, @@ -14,6 +16,7 @@ use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; +use std::{fs, io}; use tap::TapFallible; #[derive(Args, Clone)] @@ -121,6 +124,11 @@ impl Display for InitResults { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { eprintln!("Initialising client..."); @@ -134,6 +142,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { eprintln!("SOCKS5 client \"{id}\" was already initialised before"); true } else { + init_paths(id)?; false }; diff --git a/clients/socks5/src/config/mod.rs b/clients/socks5/src/config/mod.rs index e776bdd5ab..7e576a626a 100644 --- a/clients/socks5/src/config/mod.rs +++ b/clients/socks5/src/config/mod.rs @@ -22,15 +22,20 @@ mod template; const DEFAULT_SOCKS5_CLIENTS_DIR: &str = "socks5-clients"; -/// Derive default path to client's config file. -/// It should get resolved to `$HOME/.nym/socks5-clients//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { +/// Derive default path to clients's config directory. +/// It should get resolved to `$HOME/.nym/socks5-clients//config` +pub fn default_config_directory>(id: P) -> PathBuf { must_get_home() .join(NYM_DIR) .join(DEFAULT_SOCKS5_CLIENTS_DIR) .join(id) .join(DEFAULT_CONFIG_DIR) - .join(DEFAULT_CONFIG_FILENAME) +} + +/// Derive default path to client's config file. +/// It should get resolved to `$HOME/.nym/socks5-clients//config/config.toml` +pub fn default_config_filepath>(id: P) -> PathBuf { + default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) } /// Derive default path to client's data directory where files, such as keys, are stored. diff --git a/gateway/src/commands/init.rs b/gateway/src/commands/init.rs index 117396d4e8..59fd5cad59 100644 --- a/gateway/src/commands/init.rs +++ b/gateway/src/commands/init.rs @@ -1,7 +1,7 @@ // Copyright 2020-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::default_config_filepath; +use crate::config::{default_config_directory, default_config_filepath, default_data_directory}; use crate::{ commands::{override_config, OverrideConfig}, config::Config, @@ -12,6 +12,7 @@ use nym_crypto::asymmetric::{encryption, identity}; use std::error::Error; use std::net::IpAddr; use std::path::PathBuf; +use std::{fs, io}; #[derive(Args, Clone)] pub struct Init { @@ -91,6 +92,11 @@ impl From for OverrideConfig { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub async fn execute(args: Init) -> Result<(), Box> { eprintln!("Initialising gateway {}...", args.id); @@ -102,6 +108,7 @@ pub async fn execute(args: Init) -> Result<(), Box> { ); true } else { + init_paths(&args.id)?; false }; diff --git a/gateway/src/config/mod.rs b/gateway/src/config/mod.rs index e76f3240ac..caf4f576a5 100644 --- a/gateway/src/config/mod.rs +++ b/gateway/src/config/mod.rs @@ -35,15 +35,20 @@ const DEFAULT_MAXIMUM_CONNECTION_BUFFER_SIZE: usize = 2000; const DEFAULT_STORED_MESSAGE_FILENAME_LENGTH: u16 = 16; const DEFAULT_MESSAGE_RETRIEVAL_LIMIT: i64 = 100; -/// Derive default path to gateways's config file. -/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { +/// Derive default path to gateway's config directory. +/// It should get resolved to `$HOME/.nym/gateways//config` +pub fn default_config_directory>(id: P) -> PathBuf { must_get_home() .join(NYM_DIR) .join(DEFAULT_GATEWAYS_DIR) .join(id) .join(DEFAULT_CONFIG_DIR) - .join(DEFAULT_CONFIG_FILENAME) +} + +/// Derive default path to gateways's config file. +/// It should get resolved to `$HOME/.nym/gateways//config/config.toml` +pub fn default_config_filepath>(id: P) -> PathBuf { + default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) } /// Derive default path to gateways's data directory where files, such as keys, are stored. diff --git a/mixnode/src/commands/init.rs b/mixnode/src/commands/init.rs index 7850d5eef5..1bea6e1721 100644 --- a/mixnode/src/commands/init.rs +++ b/mixnode/src/commands/init.rs @@ -3,12 +3,15 @@ use super::OverrideConfig; use crate::commands::override_config; -use crate::config::{default_config_filepath, Config}; +use crate::config::{ + default_config_directory, default_config_filepath, default_data_directory, Config, +}; use crate::node::MixNode; use clap::Args; use nym_bin_common::output_format::OutputFormat; use nym_crypto::asymmetric::{encryption, identity}; use std::net::IpAddr; +use std::{fs, io}; #[derive(Args, Clone)] pub(crate) struct Init { @@ -54,6 +57,11 @@ impl From for OverrideConfig { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub(crate) fn execute(args: &Init) { let override_config_fields = OverrideConfig::from(args.clone()); let id = override_config_fields.id.clone(); @@ -63,6 +71,7 @@ pub(crate) fn execute(args: &Init) { eprintln!("Mixnode \"{id}\" was already initialised before! Config information will be overwritten (but keys will be kept)!"); true } else { + init_paths(&id).expect("failed to initialise storage paths"); false }; @@ -97,9 +106,10 @@ pub(crate) fn execute(args: &Init) { } let config_save_location = config.default_location(); - config - .save_to_default_location() - .expect("Failed to save the config file"); + config.save_to_default_location().expect(&*format!( + "Failed to save the config file to {}", + config_save_location.display() + )); eprintln!( "Saved configuration file to {}", config_save_location.display() diff --git a/nym-connect/desktop/src-tauri/src/config/mod.rs b/nym-connect/desktop/src-tauri/src/config/mod.rs index e8cecdd6df..8564b6312b 100644 --- a/nym-connect/desktop/src-tauri/src/config/mod.rs +++ b/nym-connect/desktop/src-tauri/src/config/mod.rs @@ -3,24 +3,18 @@ use crate::config::persistence::NymConnectPaths; use crate::config::template::CONFIG_TEMPLATE; -use crate::{ - error::{BackendError, Result}, - state::State, -}; +use crate::error::{BackendError, Result}; use nym_client_core::client::key_manager::persistence::OnDiskKeys; -use nym_client_core::config::Config as BaseClientConfig; use nym_config_common::{ must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR, }; use nym_crypto::asymmetric::identity; -use nym_socks5_client_core::config::{Config as Socks5CoreConfig, Socks5}; +use nym_socks5_client_core::config::Config as Socks5CoreConfig; use serde::{Deserialize, Serialize}; -use std::io; use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::{fs, io}; use tap::TapFallible; -use tokio::sync::RwLock; mod persistence; mod template; @@ -30,15 +24,20 @@ static SOCKS5_CONFIG_ID: &str = "nym-connect"; // backwards compatibility : ) const DEFAULT_NYM_CONNECT_CLIENTS_DIR: &str = "socks5-clients"; -/// Derive default path to nym connects's config file. -/// It should get resolved to `$HOME/.nym/socks5-clients//config/config.toml` -pub fn default_config_filepath>(id: P) -> PathBuf { +/// Derive default path to clients's config directory. +/// It should get resolved to `$HOME/.nym/socks5-clients//config` +pub fn default_config_directory>(id: P) -> PathBuf { must_get_home() .join(NYM_DIR) .join(DEFAULT_NYM_CONNECT_CLIENTS_DIR) .join(id) .join(DEFAULT_CONFIG_DIR) - .join(DEFAULT_CONFIG_FILENAME) +} + +/// Derive default path to client's config file. +/// It should get resolved to `$HOME/.nym/socks5-clients//config/config.toml` +pub fn default_config_filepath>(id: P) -> PathBuf { + default_config_directory(id).join(DEFAULT_CONFIG_FILENAME) } /// Derive default path to nym connects's data directory where files, such as keys, are stored. @@ -117,6 +116,11 @@ impl Config { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: String) -> Result<()> { log::trace!("Initialising client..."); @@ -127,6 +131,7 @@ pub async fn init_socks5_config(provider_address: String, chosen_gateway_id: Str eprintln!("SOCKS5 client \"{id}\" was already initialised before"); true } else { + init_paths(&id)?; false }; diff --git a/service-providers/network-requester/src/cli/init.rs b/service-providers/network-requester/src/cli/init.rs index 0764a930dc..f241193111 100644 --- a/service-providers/network-requester/src/cli/init.rs +++ b/service-providers/network-requester/src/cli/init.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::cli::try_upgrade_v1_1_13_config; -use crate::config::default_config_filepath; +use crate::config::{default_config_directory, default_config_filepath, default_data_directory}; use crate::{ cli::{override_config, OverrideConfig}, config::Config, @@ -15,6 +15,7 @@ use nym_crypto::asymmetric::identity; use nym_sphinx::addressing::clients::Recipient; use serde::Serialize; use std::fmt::Display; +use std::{fs, io}; use tap::TapFallible; #[derive(Args, Clone)] @@ -95,6 +96,11 @@ impl Display for InitResults { } } +fn init_paths(id: &str) -> io::Result<()> { + fs::create_dir_all(default_data_directory(id))?; + fs::create_dir_all(default_config_directory(id)) +} + pub(crate) async fn execute(args: &Init) -> Result<(), NetworkRequesterError> { eprintln!("Initialising client..."); @@ -107,6 +113,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), NetworkRequesterError> { eprintln!("Client \"{id}\" was already initialised before"); true } else { + init_paths(&args.id)?; false };