mirror of
https://git.proxmox.com/git/proxmox
synced 2025-08-07 13:33:17 +00:00
add proxmox-section-config crate
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
41f3fdfeb9
commit
f35dbbd651
@ -8,6 +8,7 @@ members = [
|
|||||||
"proxmox-lang",
|
"proxmox-lang",
|
||||||
"proxmox-router",
|
"proxmox-router",
|
||||||
"proxmox-schema",
|
"proxmox-schema",
|
||||||
|
"proxmox-section-config",
|
||||||
"proxmox-sortable-macro",
|
"proxmox-sortable-macro",
|
||||||
"proxmox-tfa",
|
"proxmox-tfa",
|
||||||
"proxmox-time",
|
"proxmox-time",
|
||||||
|
1
Makefile
1
Makefile
@ -9,6 +9,7 @@ CRATES = \
|
|||||||
proxmox-lang \
|
proxmox-lang \
|
||||||
proxmox-router \
|
proxmox-router \
|
||||||
proxmox-schema \
|
proxmox-schema \
|
||||||
|
proxmox-section-config \
|
||||||
proxmox-sortable-macro \
|
proxmox-sortable-macro \
|
||||||
proxmox-tfa \
|
proxmox-tfa \
|
||||||
proxmox-time \
|
proxmox-time \
|
||||||
|
19
proxmox-section-config/Cargo.toml
Normal file
19
proxmox-section-config/Cargo.toml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
[package]
|
||||||
|
name = "proxmox-section-config"
|
||||||
|
version = "1.0.0"
|
||||||
|
authors = ["Proxmox Support Team <support@proxmox.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
license = "AGPL-3"
|
||||||
|
description = "proxmox schema based section config format parsing"
|
||||||
|
|
||||||
|
exclude = [ "debian" ]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0"
|
||||||
|
hex = "0.4"
|
||||||
|
serde = "1.0"
|
||||||
|
serde_json = "1.0"
|
||||||
|
|
||||||
|
proxmox-schema = { path = "../proxmox-schema", version = "1.0.0" }
|
||||||
|
# FIXME: remove!
|
||||||
|
proxmox-lang = { path = "../proxmox-lang", version = "1.0.0" }
|
5
proxmox-section-config/debian/changelog
Normal file
5
proxmox-section-config/debian/changelog
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
rust-proxmox-section-config (1.0.0-1) stable; urgency=medium
|
||||||
|
|
||||||
|
* initial split out of `librust-proxmox-dev`
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 06 Oct 2021 11:04:36 +0200
|
42
proxmox-section-config/debian/control
Normal file
42
proxmox-section-config/debian/control
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
Source: rust-proxmox-section-config
|
||||||
|
Section: rust
|
||||||
|
Priority: optional
|
||||||
|
Build-Depends: debhelper (>= 12),
|
||||||
|
dh-cargo (>= 24),
|
||||||
|
cargo:native <!nocheck>,
|
||||||
|
rustc:native <!nocheck>,
|
||||||
|
libstd-rust-dev <!nocheck>,
|
||||||
|
librust-anyhow-1+default-dev <!nocheck>,
|
||||||
|
librust-hex-0.4+default-dev <!nocheck>,
|
||||||
|
librust-proxmox-lang-1+default-dev <!nocheck>,
|
||||||
|
librust-proxmox-schema-1+default-dev <!nocheck>,
|
||||||
|
librust-serde-1+default-dev <!nocheck>,
|
||||||
|
librust-serde-json-1+default-dev <!nocheck>
|
||||||
|
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||||
|
Standards-Version: 4.5.1
|
||||||
|
Vcs-Git: git://git.proxmox.com/git/proxmox.git
|
||||||
|
Vcs-Browser: https://git.proxmox.com/?p=proxmox.git
|
||||||
|
Rules-Requires-Root: no
|
||||||
|
|
||||||
|
Package: librust-proxmox-section-config-dev
|
||||||
|
Architecture: any
|
||||||
|
Multi-Arch: same
|
||||||
|
Depends:
|
||||||
|
${misc:Depends},
|
||||||
|
librust-anyhow-1+default-dev,
|
||||||
|
librust-hex-0.4+default-dev,
|
||||||
|
librust-proxmox-lang-1+default-dev,
|
||||||
|
librust-proxmox-schema-1+default-dev,
|
||||||
|
librust-serde-1+default-dev,
|
||||||
|
librust-serde-json-1+default-dev
|
||||||
|
Provides:
|
||||||
|
librust-proxmox-section-config+default-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1+default-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1.0-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1.0+default-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1.0.0-dev (= ${binary:Version}),
|
||||||
|
librust-proxmox-section-config-1.0.0+default-dev (= ${binary:Version})
|
||||||
|
Description: Proxmox schema based section config format parsing - Rust source code
|
||||||
|
This package contains the source for the Rust proxmox-section-config crate,
|
||||||
|
packaged by debcargo for use with cargo and dh-cargo.
|
16
proxmox-section-config/debian/copyright
Normal file
16
proxmox-section-config/debian/copyright
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Copyright (C) 2021 Proxmox Server Solutions GmbH
|
||||||
|
|
||||||
|
This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
7
proxmox-section-config/debian/debcargo.toml
Normal file
7
proxmox-section-config/debian/debcargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
overlay = "."
|
||||||
|
crate_src_path = ".."
|
||||||
|
maintainer = "Proxmox Support Team <support@proxmox.com>"
|
||||||
|
|
||||||
|
[source]
|
||||||
|
vcs_git = "git://git.proxmox.com/git/proxmox.git"
|
||||||
|
vcs_browser = "https://git.proxmox.com/?p=proxmox.git"
|
@ -18,18 +18,18 @@
|
|||||||
//! ...
|
//! ...
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use anyhow::*;
|
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
use anyhow::{bail, format_err, Error};
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use serde::ser::Serialize;
|
use serde::ser::Serialize;
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
|
|
||||||
use super::schema::*;
|
use proxmox_lang::try_block;
|
||||||
use crate::try_block;
|
use proxmox_schema::format::{dump_properties, wrap_text, ParameterDisplayStyle};
|
||||||
|
use proxmox_schema::*;
|
||||||
|
|
||||||
/// Associates a section type name with a `Schema`.
|
/// Associates a section type name with a `Schema`.
|
||||||
pub struct SectionConfigPlugin {
|
pub struct SectionConfigPlugin {
|
||||||
@ -180,7 +180,7 @@ impl SectionConfigData {
|
|||||||
let mut list: Vec<Value> = vec![];
|
let mut list: Vec<Value> = vec![];
|
||||||
|
|
||||||
let digest: Value = match digest {
|
let digest: Value = match digest {
|
||||||
Some(v) => crate::tools::digest_to_hex(v).into(),
|
Some(v) => hex::encode(v).into(),
|
||||||
None => Value::Null,
|
None => Value::Null,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -294,62 +294,64 @@ impl SectionConfig {
|
|||||||
/// plugins. Please note that `filename` is only used to improve
|
/// plugins. Please note that `filename` is only used to improve
|
||||||
/// error messages.
|
/// error messages.
|
||||||
pub fn write(&self, filename: &str, config: &SectionConfigData) -> Result<String, Error> {
|
pub fn write(&self, filename: &str, config: &SectionConfigData) -> Result<String, Error> {
|
||||||
try_block!({
|
self.write_do(config)
|
||||||
let mut list = VecDeque::new();
|
.map_err(|e: Error| format_err!("writing '{}' failed: {}", filename, e))
|
||||||
|
}
|
||||||
|
|
||||||
let mut done = HashSet::new();
|
fn write_do(&self, config: &SectionConfigData) -> Result<String, Error> {
|
||||||
|
let mut list = VecDeque::new();
|
||||||
|
|
||||||
for section_id in &config.order {
|
let mut done = HashSet::new();
|
||||||
if config.sections.get(section_id) == None {
|
|
||||||
continue;
|
for section_id in &config.order {
|
||||||
};
|
if config.sections.get(section_id) == None {
|
||||||
list.push_back(section_id);
|
continue;
|
||||||
done.insert(section_id);
|
};
|
||||||
|
list.push_back(section_id);
|
||||||
|
done.insert(section_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
for section_id in config.sections.keys() {
|
||||||
|
if done.contains(section_id) {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
list.push_back(section_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut raw = String::new();
|
||||||
|
|
||||||
|
for section_id in list {
|
||||||
|
let (type_name, section_config) = config.sections.get(section_id).unwrap();
|
||||||
|
let plugin = self.plugins.get(type_name).unwrap();
|
||||||
|
|
||||||
|
let id_schema = plugin.get_id_schema().unwrap_or(self.id_schema);
|
||||||
|
if let Err(err) = parse_simple_value(§ion_id, &id_schema) {
|
||||||
|
bail!("syntax error in section identifier: {}", err.to_string());
|
||||||
|
}
|
||||||
|
if section_id.chars().any(|c| c.is_control()) {
|
||||||
|
bail!("detected unexpected control character in section ID.");
|
||||||
|
}
|
||||||
|
if let Err(err) = verify_json_object(section_config, plugin.properties) {
|
||||||
|
bail!("verify section '{}' failed - {}", section_id, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
for section_id in config.sections.keys() {
|
if !raw.is_empty() {
|
||||||
if done.contains(section_id) {
|
raw += "\n"
|
||||||
continue;
|
|
||||||
};
|
|
||||||
list.push_back(section_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut raw = String::new();
|
raw += &(self.format_section_header)(type_name, section_id, section_config)?;
|
||||||
|
|
||||||
for section_id in list {
|
for (key, value) in section_config.as_object().unwrap() {
|
||||||
let (type_name, section_config) = config.sections.get(section_id).unwrap();
|
if let Some(id_property) = &plugin.id_property {
|
||||||
let plugin = self.plugins.get(type_name).unwrap();
|
if id_property == key {
|
||||||
|
continue; // skip writing out id properties, they are in the section header
|
||||||
let id_schema = plugin.get_id_schema().unwrap_or(self.id_schema);
|
|
||||||
if let Err(err) = parse_simple_value(§ion_id, &id_schema) {
|
|
||||||
bail!("syntax error in section identifier: {}", err.to_string());
|
|
||||||
}
|
|
||||||
if section_id.chars().any(|c| c.is_control()) {
|
|
||||||
bail!("detected unexpected control character in section ID.");
|
|
||||||
}
|
|
||||||
if let Err(err) = verify_json_object(section_config, plugin.properties) {
|
|
||||||
bail!("verify section '{}' failed - {}", section_id, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if !raw.is_empty() {
|
|
||||||
raw += "\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
raw += &(self.format_section_header)(type_name, section_id, section_config)?;
|
|
||||||
|
|
||||||
for (key, value) in section_config.as_object().unwrap() {
|
|
||||||
if let Some(id_property) = &plugin.id_property {
|
|
||||||
if id_property == key {
|
|
||||||
continue; // skip writing out id properties, they are in the section header
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
raw += &(self.format_section_content)(type_name, section_id, key, value)?;
|
|
||||||
}
|
}
|
||||||
|
raw += &(self.format_section_content)(type_name, section_id, key, value)?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(raw)
|
Ok(raw)
|
||||||
})
|
|
||||||
.map_err(|e: Error| format_err!("writing '{}' failed: {}", filename, e))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse configuration data.
|
/// Parse configuration data.
|
Loading…
Reference in New Issue
Block a user