]> git.proxmox.com Git - proxmox-backup.git/blame - pbs-config/src/tape_job.rs
clippy 1.65 fixes
[proxmox-backup.git] / pbs-config / src / tape_job.rs
CommitLineData
35f151e0 1use anyhow::Error;
e3619d41
DM
2use lazy_static::lazy_static;
3use std::collections::HashMap;
4
35f151e0 5use proxmox_schema::{ApiType, Schema};
6ef1b649 6use proxmox_section_config::{SectionConfig, SectionConfigData, SectionConfigPlugin};
e3619d41
DM
7
8use pbs_api_types::{TapeBackupJobConfig, JOB_ID_SCHEMA};
9
10use crate::{open_backup_lockfile, replace_backup_config, BackupLockGuard};
11
12lazy_static! {
13 pub static ref CONFIG: SectionConfig = init();
14}
15
16fn init() -> SectionConfig {
17 let obj_schema = match TapeBackupJobConfig::API_SCHEMA {
18 Schema::AllOf(ref allof_schema) => allof_schema,
19 _ => unreachable!(),
20 };
21
35f151e0
TL
22 let plugin =
23 SectionConfigPlugin::new("backup".to_string(), Some(String::from("id")), obj_schema);
e3619d41
DM
24 let mut config = SectionConfig::new(&JOB_ID_SCHEMA);
25 config.register_plugin(plugin);
26
27 config
28}
29
30pub const TAPE_JOB_CFG_FILENAME: &str = "/etc/proxmox-backup/tape-job.cfg";
31pub const TAPE_JOB_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.tape-job.lck";
32
33/// Get exclusive lock
34pub fn lock() -> Result<BackupLockGuard, Error> {
35f151e0 35 open_backup_lockfile(TAPE_JOB_CFG_LOCKFILE, None, true)
e3619d41
DM
36}
37
35f151e0 38pub fn config() -> Result<(SectionConfigData, [u8; 32]), Error> {
16f6766a
FG
39 let content =
40 proxmox_sys::fs::file_read_optional_string(TAPE_JOB_CFG_FILENAME)?.unwrap_or_default();
e3619d41
DM
41
42 let digest = openssl::sha::sha256(content.as_bytes());
43 let data = CONFIG.parse(TAPE_JOB_CFG_FILENAME, &content)?;
44 Ok((data, digest))
45}
46
47pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
9a37bd6c 48 let raw = CONFIG.write(TAPE_JOB_CFG_FILENAME, config)?;
e3619d41
DM
49 replace_backup_config(TAPE_JOB_CFG_FILENAME, raw.as_bytes())
50}
51
52// shell completion helper
53
54/// List all tape job IDs
55pub fn complete_tape_job_id(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
56 match config() {
57 Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
4597eedf 58 Err(_) => Vec::new(),
e3619d41
DM
59 }
60}