src/section_config.rs - convert_to_array: optionally add digest
datastore::config() -> also return digest remotes::config() -> also return digest
This commit is contained in:
parent
4566303b05
commit
d0187a51a9
@ -485,9 +485,9 @@ fn get_datastore_list(
|
||||
_rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<Value, Error> {
|
||||
|
||||
let config = datastore::config()?;
|
||||
let (config, _digest) = datastore::config()?;
|
||||
|
||||
Ok(config.convert_to_array("store"))
|
||||
Ok(config.convert_to_array("store", None))
|
||||
}
|
||||
|
||||
#[sortable]
|
||||
|
@ -28,9 +28,9 @@ pub fn list_datastores(
|
||||
_rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<Value, Error> {
|
||||
|
||||
let config = datastore::config()?;
|
||||
let (config, digest) = datastore::config()?;
|
||||
|
||||
Ok(config.convert_to_array("name"))
|
||||
Ok(config.convert_to_array("name", Some(&digest)))
|
||||
}
|
||||
|
||||
#[api(
|
||||
@ -57,7 +57,7 @@ pub fn create_datastore(name: String, param: Value) -> Result<(), Error> {
|
||||
|
||||
let datastore: datastore::DataStoreConfig = serde_json::from_value(param.clone())?;
|
||||
|
||||
let mut config = datastore::config()?;
|
||||
let (mut config, _digest) = datastore::config()?;
|
||||
|
||||
if let Some(_) = config.sections.get(&name) {
|
||||
bail!("datastore '{}' already exists.", name);
|
||||
@ -91,7 +91,7 @@ pub fn delete_datastore(name: String) -> Result<(), Error> {
|
||||
// fixme: locking ?
|
||||
// fixme: check digest ?
|
||||
|
||||
let mut config = datastore::config()?;
|
||||
let (mut config, _digest) = datastore::config()?;
|
||||
|
||||
match config.sections.get(&name) {
|
||||
Some(_) => { config.sections.remove(&name); },
|
||||
|
@ -25,9 +25,9 @@ pub fn list_remotes(
|
||||
_rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<Value, Error> {
|
||||
|
||||
let config = remotes::config()?;
|
||||
let (config, digest) = remotes::config()?;
|
||||
|
||||
Ok(config.convert_to_array("name"))
|
||||
Ok(config.convert_to_array("name", Some(&digest)))
|
||||
}
|
||||
|
||||
#[api(
|
||||
@ -60,7 +60,7 @@ pub fn create_remote(name: String, param: Value) -> Result<(), Error> {
|
||||
|
||||
let remote: remotes::Remote = serde_json::from_value(param.clone())?;
|
||||
|
||||
let mut config = remotes::config()?;
|
||||
let (mut config, _digest) = remotes::config()?;
|
||||
|
||||
if let Some(_) = config.sections.get(&name) {
|
||||
bail!("remote '{}' already exists.", name);
|
||||
@ -89,7 +89,7 @@ pub fn delete_remote(name: String) -> Result<(), Error> {
|
||||
// fixme: locking ?
|
||||
// fixme: check digest ?
|
||||
|
||||
let mut config = remotes::config()?;
|
||||
let (mut config, _digest) = remotes::config()?;
|
||||
|
||||
match config.sections.get(&name) {
|
||||
Some(_) => { config.sections.remove(&name); },
|
||||
|
@ -35,17 +35,14 @@ impl DataStore {
|
||||
|
||||
pub fn lookup_datastore(name: &str) -> Result<Arc<DataStore>, Error> {
|
||||
|
||||
let config = datastore::config()?;
|
||||
let (_, store_config) = config.sections.get(name)
|
||||
.ok_or(format_err!("no such datastore '{}'", name))?;
|
||||
|
||||
let path = store_config["path"].as_str().unwrap();
|
||||
let (config, _digest) = datastore::config()?;
|
||||
let config: datastore::DataStoreConfig = config.lookup("datastore", name)?;
|
||||
|
||||
let mut map = DATASTORE_MAP.lock().unwrap();
|
||||
|
||||
if let Some(datastore) = map.get(name) {
|
||||
// Compare Config - if changed, create new Datastore object!
|
||||
if datastore.chunk_store.base == PathBuf::from(path) {
|
||||
if datastore.chunk_store.base == PathBuf::from(&config.path) {
|
||||
return Ok(datastore.clone());
|
||||
}
|
||||
}
|
||||
@ -60,7 +57,7 @@ impl DataStore {
|
||||
|
||||
pub fn open(store_name: &str) -> Result<Self, Error> {
|
||||
|
||||
let config = datastore::config()?;
|
||||
let (config, _digest) = datastore::config()?;
|
||||
let (_, store_config) = config.sections.get(store_name)
|
||||
.ok_or(format_err!("no such datastore '{}'", store_name))?;
|
||||
|
||||
|
@ -406,7 +406,7 @@ async fn pull_datastore(
|
||||
|
||||
let mut client = connect()?;
|
||||
|
||||
let remote_config = remotes::config()?;
|
||||
let (remote_config, _digest) = remotes::config()?;
|
||||
let remote: Remote = remote_config.lookup("remote", &remote)?;
|
||||
|
||||
let args = json!({
|
||||
@ -451,7 +451,7 @@ pub fn complete_remote_datastore_name(_arg: &str, param: &HashMap<String, String
|
||||
|
||||
let _ = proxmox::tools::try_block!({
|
||||
let remote = param.get("remote").ok_or_else(|| format_err!("no remote"))?;
|
||||
let remote_config = remotes::config()?;
|
||||
let (remote_config, _digest) = remotes::config()?;
|
||||
|
||||
let remote: Remote = remote_config.lookup("remote", &remote)?;
|
||||
|
||||
|
@ -51,7 +51,7 @@ fn init() -> SectionConfig {
|
||||
|
||||
const DATASTORE_CFG_FILENAME: &str = "/etc/proxmox-backup/datastore.cfg";
|
||||
|
||||
pub fn config() -> Result<SectionConfigData, Error> {
|
||||
pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
|
||||
let content = match std::fs::read_to_string(DATASTORE_CFG_FILENAME) {
|
||||
Ok(c) => c,
|
||||
Err(err) => {
|
||||
@ -63,7 +63,9 @@ pub fn config() -> Result<SectionConfigData, Error> {
|
||||
}
|
||||
};
|
||||
|
||||
CONFIG.parse(DATASTORE_CFG_FILENAME, &content)
|
||||
let digest = openssl::sha::sha256(content.as_bytes());
|
||||
let data = CONFIG.parse(DATASTORE_CFG_FILENAME, &content)?;
|
||||
Ok((data, digest))
|
||||
}
|
||||
|
||||
pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
|
||||
@ -86,7 +88,7 @@ pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
|
||||
// shell completion helper
|
||||
pub fn complete_datastore_name(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
|
||||
match config() {
|
||||
Ok(data) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
|
||||
Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
|
||||
Err(_) => return vec![],
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ fn init() -> SectionConfig {
|
||||
|
||||
const REMOTES_CFG_FILENAME: &str = "/etc/proxmox-backup/remotes.cfg";
|
||||
|
||||
pub fn config() -> Result<SectionConfigData, Error> {
|
||||
pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
|
||||
let content = match std::fs::read_to_string(REMOTES_CFG_FILENAME) {
|
||||
Ok(c) => c,
|
||||
Err(err) => {
|
||||
@ -74,7 +74,9 @@ pub fn config() -> Result<SectionConfigData, Error> {
|
||||
}
|
||||
};
|
||||
|
||||
CONFIG.parse(REMOTES_CFG_FILENAME, &content)
|
||||
let digest = openssl::sha::sha256(content.as_bytes());
|
||||
let data = CONFIG.parse(REMOTES_CFG_FILENAME, &content)?;
|
||||
Ok((data, digest))
|
||||
}
|
||||
|
||||
pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
|
||||
@ -97,7 +99,7 @@ pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
|
||||
// shell completion helper
|
||||
pub fn complete_remote_name(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
|
||||
match config() {
|
||||
Ok(data) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
|
||||
Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
|
||||
Err(_) => return vec![],
|
||||
}
|
||||
}
|
||||
|
@ -84,12 +84,20 @@ impl SectionConfigData {
|
||||
self.order.push_back(section_id.to_string());
|
||||
}
|
||||
|
||||
pub fn convert_to_array(&self, id_prop: &str) -> Value {
|
||||
pub fn convert_to_array(&self, id_prop: &str, digest: Option<&[u8;32]>) -> Value {
|
||||
let mut list: Vec<Value> = vec![];
|
||||
|
||||
let digest: Value = match digest {
|
||||
Some(v) => proxmox::tools::digest_to_hex(v).into(),
|
||||
None => Value::Null,
|
||||
};
|
||||
|
||||
for (section_id, (_, data)) in &self.sections {
|
||||
let mut item = data.clone();
|
||||
item.as_object_mut().unwrap().insert(id_prop.into(), section_id.clone().into());
|
||||
if !digest.is_null() {
|
||||
item.as_object_mut().unwrap().insert("digest".into(), digest.clone());
|
||||
}
|
||||
list.push(item);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user