]> git.proxmox.com Git - proxmox-backup.git/commitdiff
tape: create tmp dirs early at server startup
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 16:49:50 +0000 (17:49 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 19 Feb 2021 17:10:02 +0000 (18:10 +0100)
src/bin/proxmox-backup-api.rs
src/tape/changer/mod.rs
src/tape/drive/mod.rs
src/tape/mod.rs

index cf61b85cf2b53e9dc85234e465636411439cc8d3..7d800259d7c9cfd456577eb3f1fa8b73667d3c2b 100644 (file)
@@ -39,6 +39,8 @@ async fn run() -> Result<(), Error> {
     proxmox_backup::rrd::create_rrdb_dir()?;
     proxmox_backup::server::jobstate::create_jobstate_dir()?;
     proxmox_backup::tape::create_tape_status_dir()?;
+    proxmox_backup::tape::create_drive_state_dir()?;
+    proxmox_backup::tape::create_changer_state_dir()?;
 
     if let Err(err) = generate_auth_key() {
         bail!("unable to generate auth key - {}", err);
index e1dda621f5e10a272963d27357fa4b1ab5f70283..af9217280208fe7d2e05706d3caf83f914dc7512 100644 (file)
@@ -463,10 +463,12 @@ fn save_changer_state_cache(
     changer: &str,
     state: &MtxStatus,
 ) -> Result<(), Error> {
-    let mut path = PathBuf::from("/run/proxmox-backup/changer-state");
-    std::fs::create_dir_all(&path)?;
+
+    let mut path = PathBuf::from(crate::tape::CHANGER_STATE_DIR);
     path.push(changer);
 
+    let state = serde_json::to_string_pretty(state)?;
+
     let backup_user = crate::backup::backup_user()?;
     let mode = nix::sys::stat::Mode::from_bits_truncate(0o0644);
     let options = CreateOptions::new()
@@ -474,8 +476,6 @@ fn save_changer_state_cache(
         .owner(backup_user.uid)
         .group(backup_user.gid);
 
-    let state = serde_json::to_string_pretty(state)?;
-
     replace_file(path, state.as_bytes(), options)
 }
 
index 4abb95de034f78bd261bba0c21e750b9add84721..a7e0b2c68d19c315b49c388ed940cfb8e3c88251 100644 (file)
@@ -20,6 +20,7 @@ mod mam;
 pub use mam::*;
 
 use std::os::unix::io::AsRawFd;
+use std::path::PathBuf;
 
 use anyhow::{bail, format_err, Error};
 use ::serde::{Deserialize};
@@ -470,10 +471,9 @@ pub fn set_tape_device_state(
     drive: &str,
     state: &str,
 ) -> Result<(), Error> {
-    let mut path = "/run/proxmox-backup/drive-state".to_string();
-    std::fs::create_dir_all(&path)?;
-    use std::fmt::Write;
-    write!(path, "/{}", drive)?;
+
+    let mut path = PathBuf::from(crate::tape::DRIVE_STATE_DIR);
+    path.push(drive);
 
     let backup_user = crate::backup::backup_user()?;
     let mode = nix::sys::stat::Mode::from_bits_truncate(0o0644);
index 98af0bd736d3a73dff4d78b3d7d52276154a797a..ed03d8a72131cad2c929899f655e81af2e688049 100644 (file)
@@ -46,6 +46,12 @@ pub use pool_writer::*;
 /// Directory path where we store all tape status information
 pub const TAPE_STATUS_DIR: &str = "/var/lib/proxmox-backup/tape";
 
+/// Directory path where we store temporary drive state
+pub const DRIVE_STATE_DIR: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/drive-state");
+
+/// Directory path where we store cached changer state
+pub const CHANGER_STATE_DIR: &str = concat!(PROXMOX_BACKUP_RUN_DIR_M!(), "/changer-state");
+
 /// We limit chunk archive size, so that we can faster restore a
 /// specific chunk (The catalog only store file numbers, so we
 /// need to read the whole archive to restore a single chunk)
@@ -58,14 +64,44 @@ pub const COMMIT_BLOCK_SIZE: usize = 128*1024*1024*1024; // 128 GiB
 /// Create tape status dir with correct permission
 pub fn create_tape_status_dir() -> Result<(), Error> {
     let backup_user = crate::backup::backup_user()?;
-    let mode = nix::sys::stat::Mode::from_bits_truncate(0o0640);
-    let opts = CreateOptions::new()
+    let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
+    let options = CreateOptions::new()
         .perm(mode)
         .owner(backup_user.uid)
         .group(backup_user.gid);
 
-    create_path(TAPE_STATUS_DIR, None, Some(opts))
+    create_path(TAPE_STATUS_DIR, None, Some(options))
         .map_err(|err: Error| format_err!("unable to create tape status dir - {}", err))?;
 
     Ok(())
 }
+
+/// Create drive state dir with correct permission
+pub fn create_drive_state_dir() -> Result<(), Error> {
+    let backup_user = crate::backup::backup_user()?;
+    let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
+    let options = CreateOptions::new()
+        .perm(mode)
+        .owner(backup_user.uid)
+        .group(backup_user.gid);
+
+    create_path(DRIVE_STATE_DIR, None, Some(options))
+        .map_err(|err: Error| format_err!("unable to create drive state dir - {}", err))?;
+
+    Ok(())
+}
+
+/// Create changer state cache dir with correct permission
+pub fn create_changer_state_dir() -> Result<(), Error> {
+    let backup_user = crate::backup::backup_user()?;
+    let mode = nix::sys::stat::Mode::from_bits_truncate(0o0750);
+    let options = CreateOptions::new()
+        .perm(mode)
+        .owner(backup_user.uid)
+        .group(backup_user.gid);
+
+    create_path(CHANGER_STATE_DIR, None, Some(options))
+        .map_err(|err: Error| format_err!("unable to create changer state dir - {}", err))?;
+
+    Ok(())
+}