]> git.proxmox.com Git - proxmox-backup.git/blobdiff - src/bin/proxmox-backup-client.rs
src/bin/proxmox-backup-client.rs: implement upload_config
[proxmox-backup.git] / src / bin / proxmox-backup-client.rs
index ff1196a08301b7a70a9f1b54ca5ef5185952563c..7e59097297e0ad11e24916def8f4a92fe02ef2fa 100644 (file)
@@ -28,7 +28,7 @@ use futures::*;
 use tokio::sync::mpsc;
 
 lazy_static! {
-    static ref BACKUPSPEC_REGEX: Regex = Regex::new(r"^([a-zA-Z0-9_-]+\.(?:pxar|img)):(.+)$").unwrap();
+    static ref BACKUPSPEC_REGEX: Regex = Regex::new(r"^([a-zA-Z0-9_-]+\.(?:pxar|img|conf)):(.+)$").unwrap();
 }
 
 
@@ -401,7 +401,7 @@ fn create_backup(
 
     let mut upload_list = vec![];
 
-    enum BackupType { PXAR, IMAGE };
+    enum BackupType { PXAR, IMAGE, CONFIG };
 
     for backupspec in backupspec_list {
         let (target, filename) = parse_backupspec(backupspec.as_str().unwrap())?;
@@ -414,20 +414,36 @@ fn create_backup(
         };
         let file_type = metadata.file_type();
 
-        if file_type.is_dir() {
+        let extension = Path::new(target).extension().map(|s| s.to_str().unwrap()).unwrap();
 
-            upload_list.push((BackupType::PXAR, filename.to_owned(), target.to_owned(), 0));
-
-        } else if file_type.is_file() || file_type.is_block_device() {
+        match extension {
+            "pxar" => {
+                if !file_type.is_dir() {
+                    bail!("got unexpected file type (expected directory)");
+                }
+                upload_list.push((BackupType::PXAR, filename.to_owned(), target.to_owned(), 0));
+            }
+            "img" => {
 
-            let size = tools::image_size(&PathBuf::from(filename))?;
+                if !(file_type.is_file() || file_type.is_block_device()) {
+                    bail!("got unexpected file type (expected file or block device)");
+                }
 
-            if size == 0 { bail!("got zero-sized file '{}'", filename); }
+                let size = tools::image_size(&PathBuf::from(filename))?;
 
-            upload_list.push((BackupType::IMAGE, filename.to_owned(), target.to_owned(), size));
+                if size == 0 { bail!("got zero-sized file '{}'", filename); }
 
-        } else {
-            bail!("unsupported file type (expected a directory, file or block device)");
+                upload_list.push((BackupType::IMAGE, filename.to_owned(), target.to_owned(), size));
+            }
+            "conf" => {
+                if !file_type.is_file() {
+                    bail!("got unexpected file type (expected regular file)");
+                }
+                upload_list.push((BackupType::CONFIG, filename.to_owned(), target.to_owned(), metadata.len()));
+            }
+            _ => {
+                bail!("got unknown archive extension '{}'", extension);
+            }
         }
     }
 
@@ -444,6 +460,10 @@ fn create_backup(
 
     for (backup_type, filename, target, size) in upload_list {
         match backup_type {
+            BackupType::CONFIG => {
+                println!("Upload config file '{}' to '{:?}' as {}", filename, repo, target);
+                client.upload_config(&filename, &target).wait()?;
+            }
             BackupType::PXAR => {
                 println!("Upload directory '{}' to '{:?}' as {}", filename, repo, target);
                 backup_directory(&client, &filename, &target, chunk_size_opt, all_file_systems, verbose)?;