1 //! Media Pool configuration (Tape backup)
3 //! This configuration module is based on [`SectionConfig`], and
4 //! provides a type safe interface to store [`MediaPoolConfig`],
6 //! [MediaPoolConfig]: crate::api2::types::MediaPoolConfig
7 //! [SectionConfig]: proxmox_section_config::SectionConfig
9 use std
::collections
::HashMap
;
12 use lazy_static
::lazy_static
;
14 use proxmox_schema
::*;
15 use proxmox_section_config
::{SectionConfig, SectionConfigData, SectionConfigPlugin}
;
17 use pbs_api_types
::{MEDIA_POOL_NAME_SCHEMA, MediaPoolConfig}
;
19 use crate::{open_backup_lockfile, replace_backup_config, BackupLockGuard}
;
22 /// Static [`SectionConfig`] to access parser/writer functions.
23 pub static ref CONFIG
: SectionConfig
= init();
26 fn init() -> SectionConfig
{
27 let mut config
= SectionConfig
::new(&MEDIA_POOL_NAME_SCHEMA
);
29 let obj_schema
= match MediaPoolConfig
::API_SCHEMA
{
30 Schema
::Object(ref obj_schema
) => obj_schema
,
33 let plugin
= SectionConfigPlugin
::new("pool".to_string(), Some("name".to_string()), obj_schema
);
34 config
.register_plugin(plugin
);
39 /// Configuration file name
40 pub const MEDIA_POOL_CFG_FILENAME
: &str = "/etc/proxmox-backup/media-pool.cfg";
41 /// Lock file name (used to prevent concurrent access)
42 pub const MEDIA_POOL_CFG_LOCKFILE
: &str = "/etc/proxmox-backup/.media-pool.lck";
44 /// Get exclusive lock
45 pub fn lock() -> Result
<BackupLockGuard
, Error
> {
46 open_backup_lockfile(MEDIA_POOL_CFG_LOCKFILE
, None
, true)
49 /// Read and parse the configuration file
50 pub fn config() -> Result
<(SectionConfigData
, [u8;32]), Error
> {
52 let content
= proxmox_sys
::fs
::file_read_optional_string(MEDIA_POOL_CFG_FILENAME
)?
53 .unwrap_or_else(|| "".to_string());
55 let digest
= openssl
::sha
::sha256(content
.as_bytes());
56 let data
= CONFIG
.parse(MEDIA_POOL_CFG_FILENAME
, &content
)?
;
60 /// Save the configuration file
61 pub fn save_config(config
: &SectionConfigData
) -> Result
<(), Error
> {
62 let raw
= CONFIG
.write(MEDIA_POOL_CFG_FILENAME
, &config
)?
;
63 replace_backup_config(MEDIA_POOL_CFG_FILENAME
, raw
.as_bytes())
66 // shell completion helper
68 /// List existing pool names
69 pub fn complete_pool_name(_arg
: &str, _param
: &HashMap
<String
, String
>) -> Vec
<String
> {
71 Ok((data
, _digest
)) => data
.sections
.iter().map(|(id
, _
)| id
.to_string()).collect(),
72 Err(_
) => return vec
![],