]>
Commit | Line | Data |
---|---|---|
09989d99 | 1 | use anyhow::Error; |
09989d99 WB |
2 | |
3 | use proxmox::api::schema::Updatable; | |
4 | use proxmox::api::{api, Permission, Router, RpcEnvironment}; | |
5 | ||
6 | use crate::api2::types::NODE_SCHEMA; | |
440472cb | 7 | use crate::api2::node::apt::update_apt_proxy_config; |
2732c474 DM |
8 | use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY}; |
9 | use crate::config::node::{NodeConfig, NodeConfigUpdater}; | |
09989d99 WB |
10 | |
11 | pub const ROUTER: Router = Router::new() | |
12 | .get(&API_METHOD_GET_NODE_CONFIG) | |
13 | .put(&API_METHOD_UPDATE_NODE_CONFIG); | |
14 | ||
15 | #[api( | |
16 | input: { | |
17 | properties: { | |
18 | node: { schema: NODE_SCHEMA }, | |
19 | }, | |
20 | }, | |
21 | access: { | |
2732c474 DM |
22 | permission: &Permission::Privilege(&["system"], PRIV_SYS_AUDIT, false), |
23 | }, | |
24 | returns: { | |
25 | type: NodeConfig, | |
09989d99 WB |
26 | }, |
27 | )] | |
2732c474 DM |
28 | /// Get the node configuration |
29 | pub fn get_node_config(mut rpcenv: &mut dyn RpcEnvironment) -> Result<NodeConfig, Error> { | |
09989d99 WB |
30 | let (config, digest) = crate::config::node::config()?; |
31 | rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into(); | |
2732c474 | 32 | Ok(config) |
09989d99 WB |
33 | } |
34 | ||
35 | #[api( | |
36 | input: { | |
37 | properties: { | |
38 | node: { schema: NODE_SCHEMA }, | |
39 | digest: { | |
40 | description: "Digest to protect against concurrent updates", | |
41 | optional: true, | |
42 | }, | |
43 | updater: { | |
44 | type: NodeConfigUpdater, | |
45 | flatten: true, | |
46 | }, | |
47 | delete: { | |
48 | description: "Options to remove from the configuration", | |
49 | optional: true, | |
50 | }, | |
51 | }, | |
52 | }, | |
53 | access: { | |
54 | permission: &Permission::Privilege(&["system"], PRIV_SYS_MODIFY, false), | |
55 | }, | |
56 | protected: true, | |
57 | )] | |
2732c474 | 58 | /// Update the node configuration |
09989d99 WB |
59 | pub fn update_node_config( |
60 | updater: NodeConfigUpdater, | |
61 | delete: Option<String>, | |
62 | digest: Option<String>, | |
63 | ) -> Result<(), Error> { | |
64 | let _lock = crate::config::node::lock()?; | |
65 | let (mut config, expected_digest) = crate::config::node::config()?; | |
66 | if let Some(digest) = digest { | |
67 | // FIXME: GUI doesn't handle our non-inlined digest part here properly... | |
68 | if !digest.is_empty() { | |
69 | let digest = proxmox::tools::hex_to_digest(&digest)?; | |
70 | crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?; | |
71 | } | |
72 | } | |
73 | ||
74 | let delete: Vec<&str> = delete | |
75 | .as_deref() | |
76 | .unwrap_or("") | |
77 | .split(&[' ', ',', ';', '\0'][..]) | |
78 | .collect(); | |
79 | ||
80 | config.update_from(updater, &delete)?; | |
81 | ||
440472cb DM |
82 | crate::config::node::save_config(&config)?; |
83 | ||
84 | update_apt_proxy_config(config.http_proxy().as_ref())?; | |
85 | ||
86 | Ok(()) | |
09989d99 | 87 | } |