]> git.proxmox.com Git - proxmox-backup.git/commitdiff
upid: use systemd escape to decode/encode the worker_id
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 22 Oct 2020 06:24:37 +0000 (08:24 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 22 Oct 2020 10:24:58 +0000 (12:24 +0200)
This way we can store values containing "/" and ":".

src/api2/admin/datastore.rs
src/api2/backup.rs
src/api2/backup/environment.rs
src/api2/node/tasks.rs
src/api2/reader.rs
src/bin/proxmox-backup-proxy.rs
src/server/upid.rs

index 91ca3570a3ad61e039a6ec491086deb1559d0406..feeff8afa8180d0a484e669e5ce91f34cf583b34 100644 (file)
@@ -496,13 +496,13 @@ pub fn verify(
 
     match (backup_type, backup_id, backup_time) {
         (Some(backup_type), Some(backup_id), Some(backup_time)) => {
-            worker_id = format!("{}_{}_{}_{:08X}", store, backup_type, backup_id, backup_time);
+            worker_id = format!("{}:{}/{}/{:08X}", store, backup_type, backup_id, backup_time);
             let dir = BackupDir::new(backup_type, backup_id, backup_time)?;
             backup_dir = Some(dir);
             worker_type = "verify_snapshot";
         }
         (Some(backup_type), Some(backup_id), None) => {
-            worker_id = format!("{}_{}_{}", store, backup_type, backup_id);
+            worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
             let group = BackupGroup::new(backup_type, backup_id);
             backup_group = Some(group);
             worker_type = "verify_group";
@@ -668,7 +668,7 @@ fn prune(
         keep_yearly: param["keep-yearly"].as_u64(),
     };
 
-    let worker_id = format!("{}_{}_{}", store, backup_type, backup_id);
+    let worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
 
     let mut prune_result = Vec::new();
 
index b56ddbdd6c9d6a5150a83b9f441cb9173100efb9..8e58efdd1da05456d57af901fe5be8b1f8c54e96 100644 (file)
@@ -86,7 +86,7 @@ async move {
         bail!("unexpected http version '{:?}' (expected version < 2)", parts.version);
     }
 
-    let worker_id = format!("{}_{}_{}", store, backup_type, backup_id);
+    let worker_id = format!("{}:{}/{}", store, backup_type, backup_id);
 
     let env_type = rpcenv.env_type();
 
index dea3ca574b58c818ec5a26dda981ecb6ac9e6b97..7f0476c31359a883f76d2f1c363ed2a0d25bb0bd 100644 (file)
@@ -506,7 +506,7 @@ impl BackupEnvironment {
             return Ok(());
         }
 
-        let worker_id = format!("{}_{}_{}_{:08X}",
+        let worker_id = format!("{}:{}/{}/{:08X}",
             self.datastore.name(),
             self.backup_dir.group().backup_type(),
             self.backup_dir.group().backup_id(),
index b86eaec7820e3fc04640900db8d96b571a387010..4d16b20a95ca7e7ac259e0a3a7e409a2806064cf 100644 (file)
@@ -342,7 +342,7 @@ pub fn list_tasks(
             if info.upid.worker_type == "backup" || info.upid.worker_type == "restore" ||
                 info.upid.worker_type == "prune"
             {
-                let prefix = format!("{}_", store);
+                let prefix = format!("{}:", store);
                 if !worker_id.starts_with(&prefix) { return None; }
             } else if info.upid.worker_type == "garbage_collection" {
                 if worker_id != store { return None; }
index 8f47047ec006670cd519c9664e84ab61947248e6..0fa9b08ec148a5ef0e5ddb8393cfb6ae0f95afe7 100644 (file)
@@ -108,7 +108,7 @@ fn upgrade_to_backup_reader_protocol(
 
         //let files = BackupInfo::list_files(&path, &backup_dir)?;
 
-        let worker_id = format!("{}_{}_{}_{:08X}", store, backup_type, backup_id, backup_dir.backup_time());
+        let worker_id = format!("{}:{}/{}/{:08X}", store, backup_type, backup_id, backup_dir.backup_time());
 
         WorkerTask::spawn("reader", Some(worker_id), userid.clone(), true, move |worker| {
             let mut env = ReaderEnvironment::new(
index 375ce078d18fdd16f973cc10c6e99a68dc4f8200..69ceb1cb7fbdc600f928be1863a3ffce22b4a102 100644 (file)
@@ -628,7 +628,7 @@ async fn schedule_task_log_rotate() {
         parse_calendar_event, compute_next_event};
 
     let worker_type = "logrotate";
-    let job_id = "task-archive";
+    let job_id = "task_archive";
 
     let last = match jobstate::last_run_time(worker_type, job_id) {
         Ok(time) => time,
index f829eef9910aa1ac1e212cb90c9decb98841271a..df027b07284defa2a96e606717a196d612ced9ff 100644 (file)
@@ -75,11 +75,6 @@ impl UPID {
         if worker_type.contains(bad) {
             bail!("illegal characters in worker type '{}'", worker_type);
         }
-        if let Some(ref worker_id) = worker_id {
-            if worker_id.contains(bad) {
-                bail!("illegal characters in worker id '{}'", worker_id);
-            }
-        }
 
         static WORKER_TASK_NEXT_ID: AtomicUsize = AtomicUsize::new(0);
 
@@ -112,13 +107,21 @@ impl std::str::FromStr for UPID {
 
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         if let Some(cap) = PROXMOX_UPID_REGEX.captures(s) {
+
+            let worker_id = if cap["wid"].is_empty() {
+                None
+            } else {
+                let wid = crate::tools::systemd::unescape_unit(&cap["wid"])?;
+                Some(wid)
+            };
+
             Ok(UPID {
                 pid: i32::from_str_radix(&cap["pid"], 16).unwrap(),
                 pstart: u64::from_str_radix(&cap["pstart"], 16).unwrap(),
                 starttime: i64::from_str_radix(&cap["starttime"], 16).unwrap(),
                 task_id: usize::from_str_radix(&cap["task_id"], 16).unwrap(),
                 worker_type: cap["wtype"].to_string(),
-                worker_id: if cap["wid"].is_empty() { None } else { Some(cap["wid"].to_string()) },
+                worker_id,
                 userid: cap["userid"].parse()?,
                 node: cap["node"].to_string(),
             })
@@ -133,7 +136,11 @@ impl std::fmt::Display for UPID {
 
     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
 
-        let wid = if let Some(ref id) = self.worker_id { id } else { "" };
+        let wid = if let Some(ref id) = self.worker_id {
+            crate::tools::systemd::escape_unit(id, false)
+        } else {
+            String::new()
+        };
 
         // Note: pstart can be > 32bit if uptime > 497 days, so this can result in
         // more that 8 characters for pstart