diff --git a/eden/fs/cli_rs/edenfs-client/src/instance.rs b/eden/fs/cli_rs/edenfs-client/src/instance.rs index 99730674be..da5f5791be 100644 --- a/eden/fs/cli_rs/edenfs-client/src/instance.rs +++ b/eden/fs/cli_rs/edenfs-client/src/instance.rs @@ -14,6 +14,7 @@ use std::time::Duration; use anyhow::{anyhow, Context, Result}; use tokio::net::UnixStream; +use edenfs_config::EdenFsConfig; use fb303_core::types::fb303_status; use fbthrift_socket::SocketTransport; use thrift_types::edenfs::{client::EdenService, types::DaemonInfo}; @@ -26,11 +27,11 @@ use crate::EdenFsClient; pub struct EdenFsInstance { config_dir: PathBuf, etc_eden_dir: PathBuf, - home_dir: PathBuf, + home_dir: Option, } impl EdenFsInstance { - pub fn new(config_dir: PathBuf, etc_eden_dir: PathBuf, home_dir: PathBuf) -> Self { + pub fn new(config_dir: PathBuf, etc_eden_dir: PathBuf, home_dir: Option) -> Self { Self { config_dir, etc_eden_dir, @@ -38,6 +39,13 @@ impl EdenFsInstance { } } + pub fn get_config(&self) -> Result { + edenfs_config::load_config( + &self.etc_eden_dir, + self.home_dir.as_ref().map(|x| x.as_ref()), + ) + } + async fn _connect(&self, socket_path: &PathBuf) -> Result { let stream = UnixStream::connect(&socket_path) .await diff --git a/eden/fs/cli_rs/edenfs-commands/src/lib.rs b/eden/fs/cli_rs/edenfs-commands/src/lib.rs index ee972019e1..ee7d89e31c 100644 --- a/eden/fs/cli_rs/edenfs-commands/src/lib.rs +++ b/eden/fs/cli_rs/edenfs-commands/src/lib.rs @@ -18,16 +18,18 @@ use util::path::expand_path; mod pid; mod status; +#[cfg(unix)] const DEFAULT_CONFIG_DIR: &str = "~/local/.eden"; +#[cfg(unix)] const DEFAULT_ETC_EDEN_DIR: &str = "/etc/eden"; -const DEFAULT_HOME_DIR: &str = "~"; + +#[cfg(windows)] +const DEFAULT_CONFIG_DIR: &str = "~/.eden"; +#[cfg(windows)] +const DEFAULT_ETC_EDEN_DIR: &str = "C:\\ProgramData\\facebook\\eden"; type ExitCode = i32; -fn expand_default(default: &'static str) -> impl Fn() -> PathBuf { - move || expand_path(default) -} - #[derive(StructOpt, Debug)] #[structopt( name = "edenfsctl", @@ -65,17 +67,35 @@ pub enum SubCommand { } impl Command { + fn get_etc_eden_dir(&self) -> PathBuf { + if let Some(etc_eden_dir) = &self.etc_eden_dir { + etc_eden_dir.clone() + } else { + DEFAULT_ETC_EDEN_DIR.into() + } + } + + fn get_config_dir(&self) -> PathBuf { + if let Some(config_dir) = &self.config_dir { + config_dir.clone() + } else { + expand_path(DEFAULT_CONFIG_DIR) + } + } + + fn get_home_dir(&self) -> Option { + if let Some(home_dir) = &self.home_dir { + Some(home_dir.clone()) + } else { + dirs::home_dir() + } + } + fn get_instance(&self) -> EdenFsInstance { EdenFsInstance::new( - self.config_dir - .clone() - .unwrap_or_else(expand_default(DEFAULT_CONFIG_DIR)), - self.etc_eden_dir - .clone() - .unwrap_or_else(expand_default(DEFAULT_ETC_EDEN_DIR)), - self.home_dir - .clone() - .unwrap_or_else(expand_default(DEFAULT_HOME_DIR)), + self.get_config_dir(), + self.get_etc_eden_dir(), + self.get_home_dir(), ) } diff --git a/eden/fs/cli_rs/edenfs-config/src/lib.rs b/eden/fs/cli_rs/edenfs-config/src/lib.rs index d90147fb80..7299a3d745 100644 --- a/eden/fs/cli_rs/edenfs-config/src/lib.rs +++ b/eden/fs/cli_rs/edenfs-config/src/lib.rs @@ -20,14 +20,10 @@ pub struct Core { #[derive(Deserialize, StackConfig, Debug)] pub struct EdenFsConfig { + #[stack(nested)] core: Core, } -#[cfg(windows)] -const ETC_EDENFS_DIR: &str = "C:\\ProgramData\\facebook\\eden"; -#[cfg(unix)] -const ETC_EDENFS_DIR: &str = "/etc/eden"; - fn load_path(loader: &mut EdenFsConfigLoader, path: &Path) -> Result<()> { let content = String::from_utf8(std::fs::read(&path)?)?; loader.load(toml::from_str(&content)?); @@ -84,21 +80,29 @@ fn load_user(loader: &mut EdenFsConfigLoader, home_dir: &Path) -> Result<()> { load_path(loader, &home_rc) } -pub fn load_config(etc_eden_dir: Option<&Path>, home_dir: Option<&Path>) -> Result { +pub fn load_config(etc_eden_dir: &Path, home_dir: Option<&Path>) -> Result { let mut loader = EdenFsConfig::loader(); - let etc_eden_dir = if let Some(dir) = etc_eden_dir.as_ref() { - dir.as_ref() - } else { - ETC_EDENFS_DIR.as_ref() - }; - load_system(&mut loader, &etc_eden_dir)?; - load_system_rcs(&mut loader, &etc_eden_dir)?; + if let Err(e) = load_system(&mut loader, &etc_eden_dir) { + event!( + Level::INFO, + etc_eden_dir = ?etc_eden_dir, + "Unable to load system configuration, skipped: {:?}", + e + ); + } - if let Some(dir) = home_dir.as_ref() { - load_user(&mut loader, &dir)?; - } else if let Some(dir) = dirs::home_dir() { - load_user(&mut loader, &dir)?; + if let Err(e) = load_system_rcs(&mut loader, &etc_eden_dir) { + event!( + Level::INFO, + etc_eden_dir = ?etc_eden_dir, + "Unable to load system RC configurations, skipped: {:?}", + e + ); + } + + if let Some(home) = home_dir { + load_user(&mut loader, &home)?; } else { event!( Level::INFO,