pub mod domains;
pub mod drive;
+pub mod media_pool;
pub mod remote;
use anyhow::{format_err, Error};
--- /dev/null
+//! Media Pool configuration (Tape backup)
+//!
+//! This configuration module is based on [`SectionConfig`], and
+//! provides a type safe interface to store [`MediaPoolConfig`],
+//!
+//! [MediaPoolConfig]: crate::api2::types::MediaPoolConfig
+//! [SectionConfig]: proxmox::api::section_config::SectionConfig
+
+use std::collections::HashMap;
+
+use anyhow::Error;
+use lazy_static::lazy_static;
+
+use proxmox::{
+ api::{
+ schema::*,
+ section_config::{
+ SectionConfig,
+ SectionConfigData,
+ SectionConfigPlugin,
+ }
+ },
+};
+
+use pbs_api_types::{MEDIA_POOL_NAME_SCHEMA, MediaPoolConfig};
+
+use crate::{open_backup_lockfile, replace_backup_config, BackupLockGuard};
+
+lazy_static! {
+ /// Static [`SectionConfig`] to access parser/writer functions.
+ pub static ref CONFIG: SectionConfig = init();
+}
+
+fn init() -> SectionConfig {
+ let mut config = SectionConfig::new(&MEDIA_POOL_NAME_SCHEMA);
+
+ let obj_schema = match MediaPoolConfig::API_SCHEMA {
+ Schema::Object(ref obj_schema) => obj_schema,
+ _ => unreachable!(),
+ };
+ let plugin = SectionConfigPlugin::new("pool".to_string(), Some("name".to_string()), obj_schema);
+ config.register_plugin(plugin);
+
+ config
+}
+
+/// Configuration file name
+pub const MEDIA_POOL_CFG_FILENAME: &str = "/etc/proxmox-backup/media-pool.cfg";
+/// Lock file name (used to prevent concurrent access)
+pub const MEDIA_POOL_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.media-pool.lck";
+
+/// Get exclusive lock
+pub fn lock() -> Result<BackupLockGuard, Error> {
+ open_backup_lockfile(MEDIA_POOL_CFG_LOCKFILE, None, true)
+}
+
+/// Read and parse the configuration file
+pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
+
+ let content = proxmox::tools::fs::file_read_optional_string(MEDIA_POOL_CFG_FILENAME)?
+ .unwrap_or_else(|| "".to_string());
+
+ let digest = openssl::sha::sha256(content.as_bytes());
+ let data = CONFIG.parse(MEDIA_POOL_CFG_FILENAME, &content)?;
+ Ok((data, digest))
+}
+
+/// Save the configuration file
+pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
+ let raw = CONFIG.write(MEDIA_POOL_CFG_FILENAME, &config)?;
+ replace_backup_config(MEDIA_POOL_CFG_FILENAME, raw.as_bytes())
+}
+
+// shell completion helper
+
+/// List existing pool names
+pub fn complete_pool_name(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
+ match config() {
+ Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
+ Err(_) => return vec![],
+ }
+}
},
};
+use pbs_api_types::{
+ Authid,
+ MEDIA_POOL_NAME_SCHEMA,
+ MediaPoolConfig,
+ MediaPoolConfigUpdater,
+};
+
use crate::{
- api2::types::{
- Authid,
- MEDIA_POOL_NAME_SCHEMA,
- MediaPoolConfig,
- MediaPoolConfigUpdater,
- },
config::{
- self,
cached_user_info::CachedUserInfo,
acl::{
PRIV_TAPE_AUDIT,
config: MediaPoolConfig,
) -> Result<(), Error> {
- let _lock = config::media_pool::lock()?;
+ let _lock = pbs_config::media_pool::lock()?;
- let (mut section_config, _digest) = config::media_pool::config()?;
+ let (mut section_config, _digest) = pbs_config::media_pool::config()?;
if section_config.sections.get(&config.name).is_some() {
bail!("Media pool '{}' already exists", config.name);
section_config.set_data(&config.name, "pool", &config)?;
- config::media_pool::save_config(§ion_config)?;
+ pbs_config::media_pool::save_config(§ion_config)?;
Ok(())
}
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let user_info = CachedUserInfo::new()?;
- let (config, digest) = config::media_pool::config()?;
+ let (config, digest) = pbs_config::media_pool::config()?;
let list = config.convert_to_typed_array::<MediaPoolConfig>("pool")?;
/// Get media pool configuration
pub fn get_config(name: String) -> Result<MediaPoolConfig, Error> {
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let data: MediaPoolConfig = config.lookup("pool", &name)?;
delete: Option<Vec<DeletableProperty>>,
) -> Result<(), Error> {
- let _lock = config::media_pool::lock()?;
+ let _lock = pbs_config::media_pool::lock()?;
- let (mut config, _digest) = config::media_pool::config()?;
+ let (mut config, _digest) = pbs_config::media_pool::config()?;
let mut data: MediaPoolConfig = config.lookup("pool", &name)?;
config.set_data(&name, "pool", &data)?;
- config::media_pool::save_config(&config)?;
+ pbs_config::media_pool::save_config(&config)?;
Ok(())
}
/// Delete a media pool configuration
pub fn delete_pool(name: String) -> Result<(), Error> {
- let _lock = config::media_pool::lock()?;
+ let _lock = pbs_config::media_pool::lock()?;
- let (mut config, _digest) = config::media_pool::config()?;
+ let (mut config, _digest) = pbs_config::media_pool::config()?;
match config.sections.get(&name) {
Some(_) => { config.sections.remove(&name); },
None => bail!("delete pool '{}' failed - no such pool", name),
}
- config::media_pool::save_config(&config)?;
+ pbs_config::media_pool::save_config(&config)?;
Ok(())
}
let user_info = CachedUserInfo::new()?;
let (job_config, digest) = config::tape_job::config()?;
- let (pool_config, _pool_digest) = config::media_pool::config()?;
+ let (pool_config, _pool_digest) = pbs_config::media_pool::config()?;
let (drive_config, _digest) = pbs_config::drive::config()?;
let job_list_iter = job_config
let datastore = DataStore::lookup_datastore(&setup.store)?;
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let pool_config: MediaPoolConfig = config.lookup("pool", &setup.pool)?;
let (drive_config, _digest) = pbs_config::drive::config()?;
let datastore = DataStore::lookup_datastore(&setup.store)?;
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let pool_config: MediaPoolConfig = config.lookup("pool", &setup.pool)?;
let (drive_config, _digest) = pbs_config::drive::config()?;
rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> {
if let Some(ref pool) = pool {
- let (pool_config, _digest) = config::media_pool::config()?;
+ let (pool_config, _digest) = pbs_config::media_pool::config()?;
if pool_config.sections.get(pool).is_none() {
bail!("no such pool ('{}')", pool);
rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> {
if let Some(ref pool) = pool {
- let (pool_config, _digest) = config::media_pool::config()?;
+ let (pool_config, _digest) = pbs_config::media_pool::config()?;
if pool_config.sections.get(pool).is_none() {
bail!("no such pool ('{}')", pool);
use crate::{
config::{
- self,
cached_user_info::CachedUserInfo,
acl::{
PRIV_TAPE_AUDIT,
},
},
- tape::{
+ tape::{
TAPE_STATUS_DIR,
Inventory,
MediaPool,
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let user_info = CachedUserInfo::new()?;
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let status_path = Path::new(TAPE_STATUS_DIR);
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let user_info = CachedUserInfo::new()?;
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let status_path = Path::new(TAPE_STATUS_DIR);
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let user_info = CachedUserInfo::new()?;
- let (config, _digest) = config::media_pool::config()?;
+ let (config, _digest) = pbs_config::media_pool::config()?;
let status_path = Path::new(TAPE_STATUS_DIR);
let inventory = Inventory::load(status_path)?;
"remote.cfg" => dump_section_config(&pbs_config::remote::CONFIG),
"sync.cfg" => dump_section_config(&config::sync::CONFIG),
"verification.cfg" => dump_section_config(&config::verify::CONFIG),
- "media-pool.cfg" => dump_section_config(&config::media_pool::CONFIG),
+ "media-pool.cfg" => dump_section_config(&pbs_config::media_pool::CONFIG),
"config::acl::Role" => dump_enum_properties(&config::acl::Role::API_SCHEMA)?,
_ => bail!("docgen: got unknown type"),
};
};
use pbs_config::drive::complete_drive_name;
+use pbs_config::media_pool::complete_pool_name;
use proxmox_backup::{
api2::{
},
config::{
datastore::complete_datastore_name,
- media_pool::complete_pool_name,
},
tape::{
BlockReadError,
.completion_cb("id", config::tape_job::complete_tape_job_id)
.completion_cb("schedule", config::datastore::complete_calendar_event)
.completion_cb("store", config::datastore::complete_datastore_name)
- .completion_cb("pool", config::media_pool::complete_pool_name)
+ .completion_cb("pool", pbs_config::media_pool::complete_pool_name)
.completion_cb("drive", crate::complete_drive_name)
)
.insert("update",
.completion_cb("id", config::tape_job::complete_tape_job_id)
.completion_cb("schedule", config::datastore::complete_calendar_event)
.completion_cb("store", config::datastore::complete_datastore_name)
- .completion_cb("pool", config::media_pool::complete_pool_name)
+ .completion_cb("pool", pbs_config::media_pool::complete_pool_name)
.completion_cb("drive", crate::complete_drive_name)
)
.insert("remove",
MediaContentListFilter,
};
use pbs_config::drive::complete_changer_name;
+use pbs_config::media_pool::complete_pool_name;
use proxmox_backup::{
api2,
complete_media_uuid,
complete_media_set_uuid,
},
- config::{
- media_pool::complete_pool_name,
- },
};
pub fn media_commands() -> CommandLineInterface {
},
};
+use pbs_config::media_pool::complete_pool_name;
+
use proxmox_backup::{
api2::{
self,
},
},
config::{
- media_pool::{
- complete_pool_name,
- },
tape_encryption_keys:: {
complete_key_fingerprint,
},
+++ /dev/null
-//! Media Pool configuration (Tape backup)
-//!
-//! This configuration module is based on [`SectionConfig`], and
-//! provides a type safe interface to store [`MediaPoolConfig`],
-//!
-//! [MediaPoolConfig]: crate::api2::types::MediaPoolConfig
-//! [SectionConfig]: proxmox::api::section_config::SectionConfig
-
-use std::collections::HashMap;
-
-use anyhow::Error;
-use lazy_static::lazy_static;
-
-use proxmox::{
- api::{
- schema::*,
- section_config::{
- SectionConfig,
- SectionConfigData,
- SectionConfigPlugin,
- }
- },
-};
-
-use pbs_config::{open_backup_lockfile, BackupLockGuard};
-
-use crate::{
- api2::types::{
- MEDIA_POOL_NAME_SCHEMA,
- MediaPoolConfig,
- },
-};
-
-lazy_static! {
- /// Static [`SectionConfig`] to access parser/writer functions.
- pub static ref CONFIG: SectionConfig = init();
-}
-
-fn init() -> SectionConfig {
- let mut config = SectionConfig::new(&MEDIA_POOL_NAME_SCHEMA);
-
- let obj_schema = match MediaPoolConfig::API_SCHEMA {
- Schema::Object(ref obj_schema) => obj_schema,
- _ => unreachable!(),
- };
- let plugin = SectionConfigPlugin::new("pool".to_string(), Some("name".to_string()), obj_schema);
- config.register_plugin(plugin);
-
- config
-}
-
-/// Configuration file name
-pub const MEDIA_POOL_CFG_FILENAME: &str = "/etc/proxmox-backup/media-pool.cfg";
-/// Lock file name (used to prevent concurrent access)
-pub const MEDIA_POOL_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.media-pool.lck";
-
-/// Get exclusive lock
-pub fn lock() -> Result<BackupLockGuard, Error> {
- open_backup_lockfile(MEDIA_POOL_CFG_LOCKFILE, None, true)
-}
-
-/// Read and parse the configuration file
-pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
-
- let content = proxmox::tools::fs::file_read_optional_string(MEDIA_POOL_CFG_FILENAME)?
- .unwrap_or_else(|| "".to_string());
-
- let digest = openssl::sha::sha256(content.as_bytes());
- let data = CONFIG.parse(MEDIA_POOL_CFG_FILENAME, &content)?;
- Ok((data, digest))
-}
-
-/// Save the configuration file
-pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
- let raw = CONFIG.write(MEDIA_POOL_CFG_FILENAME, &config)?;
- pbs_config::replace_backup_config(MEDIA_POOL_CFG_FILENAME, raw.as_bytes())
-}
-
-// shell completion helper
-
-/// List existing pool names
-pub fn complete_pool_name(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
- match config() {
- Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
- Err(_) => return vec![],
- }
-}
pub mod token_shadow;
pub mod user;
pub mod verify;
-pub mod media_pool;
pub mod tape_encryption_keys;
pub mod tape_job;