mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
allow embassy-cli not as root (#1501)
* allow embassy-cli not as root * clean up merge
This commit is contained in:
56
backend/src/util/config.rs
Normal file
56
backend/src/util/config.rs
Normal file
@@ -0,0 +1,56 @@
|
||||
use std::fs::File;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use serde::Deserialize;
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::util::serde::IoFormat;
|
||||
use crate::{Config, Error, ResultExt};
|
||||
|
||||
pub const CONFIG_PATH: &str = "/etc/embassy/config.yaml";
|
||||
pub const CONFIG_PATH_LOCAL: &str = ".embassy/config.yaml";
|
||||
|
||||
pub fn local_config_path() -> Option<PathBuf> {
|
||||
if let Ok(home) = std::env::var("HOME") {
|
||||
Some(Path::new(&home).join(CONFIG_PATH_LOCAL))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// BLOCKING
|
||||
pub fn load_config_from_paths<'a, T: for<'de> Deserialize<'de>>(
|
||||
paths: impl IntoIterator<Item = impl AsRef<Path>>,
|
||||
) -> Result<T, Error> {
|
||||
let mut config = Default::default();
|
||||
for path in paths {
|
||||
if path.as_ref().exists() {
|
||||
let format: IoFormat = path
|
||||
.as_ref()
|
||||
.extension()
|
||||
.and_then(|s| s.to_str())
|
||||
.map(|f| f.parse())
|
||||
.transpose()?
|
||||
.unwrap_or_default();
|
||||
let new = format.from_reader(File::open(path)?)?;
|
||||
config = merge_configs(config, new);
|
||||
}
|
||||
}
|
||||
serde_json::from_value(Value::Object(config)).with_kind(crate::ErrorKind::Deserialization)
|
||||
}
|
||||
|
||||
pub fn merge_configs(mut first: Config, second: Config) -> Config {
|
||||
for (k, v) in second.into_iter() {
|
||||
let new = match first.remove(&k) {
|
||||
None => v,
|
||||
Some(old) => match (old, v) {
|
||||
(Value::Object(first), Value::Object(second)) => {
|
||||
Value::Object(merge_configs(first, second))
|
||||
}
|
||||
(first, _) => first,
|
||||
},
|
||||
};
|
||||
first.insert(k, new);
|
||||
}
|
||||
first
|
||||
}
|
||||
@@ -10,22 +10,21 @@ use std::task::{Context, Poll};
|
||||
use async_trait::async_trait;
|
||||
use clap::ArgMatches;
|
||||
use color_eyre::eyre::{self, eyre};
|
||||
use digest::Digest;
|
||||
use fd_lock_rs::FdLock;
|
||||
use futures::future::BoxFuture;
|
||||
use futures::FutureExt;
|
||||
pub use helpers::NonDetachingJoinHandle;
|
||||
use lazy_static::lazy_static;
|
||||
pub use models::Version;
|
||||
use pin_project::pin_project;
|
||||
use sha2_old::Digest;
|
||||
use tokio::fs::File;
|
||||
use tokio::sync::{Mutex, OwnedMutexGuard, RwLock};
|
||||
use tracing::instrument;
|
||||
|
||||
use crate::shutdown::Shutdown;
|
||||
use crate::{Error, ResultExt as _};
|
||||
|
||||
|
||||
pub use helpers::NonDetachingJoinHandle;
|
||||
pub use models::Version;
|
||||
pub mod config;
|
||||
pub mod io;
|
||||
pub mod logger;
|
||||
pub mod serde;
|
||||
@@ -251,7 +250,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct GeneralGuard<F: FnOnce() -> T, T = ()>(Option<F>);
|
||||
impl<F: FnOnce() -> T, T> GeneralGuard<F, T> {
|
||||
pub fn new(f: F) -> Self {
|
||||
|
||||
Reference in New Issue
Block a user