]>
Commit | Line | Data |
---|---|---|
1 | use anyhow::Error; | |
2 | use lazy_static::lazy_static; | |
3 | use std::collections::HashMap; | |
4 | ||
5 | use proxmox_schema::{ApiType, Schema}; | |
6 | use proxmox_section_config::{SectionConfig, SectionConfigData, SectionConfigPlugin}; | |
7 | ||
8 | use pbs_api_types::{TapeBackupJobConfig, JOB_ID_SCHEMA}; | |
9 | ||
10 | use crate::{open_backup_lockfile, replace_backup_config, BackupLockGuard}; | |
11 | ||
12 | lazy_static! { | |
13 | pub static ref CONFIG: SectionConfig = init(); | |
14 | } | |
15 | ||
16 | fn init() -> SectionConfig { | |
17 | let obj_schema = match TapeBackupJobConfig::API_SCHEMA { | |
18 | Schema::AllOf(ref allof_schema) => allof_schema, | |
19 | _ => unreachable!(), | |
20 | }; | |
21 | ||
22 | let plugin = | |
23 | SectionConfigPlugin::new("backup".to_string(), Some(String::from("id")), obj_schema); | |
24 | let mut config = SectionConfig::new(&JOB_ID_SCHEMA); | |
25 | config.register_plugin(plugin); | |
26 | ||
27 | config | |
28 | } | |
29 | ||
30 | pub const TAPE_JOB_CFG_FILENAME: &str = "/etc/proxmox-backup/tape-job.cfg"; | |
31 | pub const TAPE_JOB_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.tape-job.lck"; | |
32 | ||
33 | /// Get exclusive lock | |
34 | pub fn lock() -> Result<BackupLockGuard, Error> { | |
35 | open_backup_lockfile(TAPE_JOB_CFG_LOCKFILE, None, true) | |
36 | } | |
37 | ||
38 | pub fn config() -> Result<(SectionConfigData, [u8; 32]), Error> { | |
39 | let content = | |
40 | proxmox_sys::fs::file_read_optional_string(TAPE_JOB_CFG_FILENAME)?.unwrap_or_default(); | |
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 | ||
47 | pub fn save_config(config: &SectionConfigData) -> Result<(), Error> { | |
48 | let raw = CONFIG.write(TAPE_JOB_CFG_FILENAME, config)?; | |
49 | replace_backup_config(TAPE_JOB_CFG_FILENAME, raw.as_bytes()) | |
50 | } | |
51 | ||
52 | // shell completion helper | |
53 | ||
54 | /// List all tape job IDs | |
55 | pub 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(), | |
58 | Err(_) => Vec::new(), | |
59 | } | |
60 | } |