cli: add get_config to EdenFsInstance

Summary: You can use `instance.get_config()` to get access to global EdenFS configurations

Reviewed By: chadaustin

Differential Revision: D26407350

fbshipit-source-id: 022cc59fd86b2711c15cfd781872465c6ada9081
This commit is contained in:
Zeyi (Rice) Fan 2021-02-12 14:22:30 -08:00 committed by Facebook GitHub Bot
parent 1ae53c794f
commit 18b79205c8
3 changed files with 65 additions and 33 deletions

View File

@ -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<PathBuf>,
}
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<PathBuf>) -> Self {
Self {
config_dir,
etc_eden_dir,
@ -38,6 +39,13 @@ impl EdenFsInstance {
}
}
pub fn get_config(&self) -> Result<EdenFsConfig> {
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<EdenFsClient> {
let stream = UnixStream::connect(&socket_path)
.await

View File

@ -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<PathBuf> {
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(),
)
}

View File

@ -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<EdenFsConfig> {
pub fn load_config(etc_eden_dir: &Path, home_dir: Option<&Path>) -> Result<EdenFsConfig> {
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,