From 60f9a6ea8f9802b86528b09d1995c8fa3f383419 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Wed, 24 Jun 2020 06:58:14 +0200 Subject: [PATCH] src/backup/datastore.rs: add new helpers to load blobs and verify chunks --- src/api2/admin/datastore.rs | 13 ++----------- src/backup/datastore.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 0120d34f..1c648147 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -1,5 +1,4 @@ use std::collections::{HashSet, HashMap}; -use std::convert::TryFrom; use anyhow::{bail, format_err, Error}; use futures::*; @@ -12,7 +11,7 @@ use proxmox::api::{ RpcEnvironment, RpcEnvironmentType, Permission, UserInformation}; use proxmox::api::router::SubdirMap; use proxmox::api::schema::*; -use proxmox::tools::fs::{file_get_contents, replace_file, CreateOptions}; +use proxmox::tools::fs::{replace_file, CreateOptions}; use proxmox::try_block; use proxmox::{http_err, identity, list_subdirs_api_method, sortable}; @@ -42,15 +41,7 @@ fn check_backup_owner(store: &DataStore, group: &BackupGroup, userid: &str) -> R fn read_backup_index(store: &DataStore, backup_dir: &BackupDir) -> Result, Error> { - let mut path = store.base_path(); - path.push(backup_dir.relative_path()); - path.push(MANIFEST_BLOB_NAME); - - let raw_data = file_get_contents(&path)?; - let index_size = raw_data.len() as u64; - let blob = DataBlob::from_raw(raw_data)?; - - let manifest = BackupManifest::try_from(blob)?; + let (manifest, index_size) = store.load_manifest(backup_dir)?; let mut result = Vec::new(); for item in manifest.files() { diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index fe915285..ff9601e5 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -2,6 +2,7 @@ use std::collections::{HashSet, HashMap}; use std::io::{self, Write}; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; +use std::convert::TryFrom; use anyhow::{bail, format_err, Error}; use lazy_static::lazy_static; @@ -134,6 +135,10 @@ impl DataStore { Ok(out) } + pub fn name(&self) -> &str { + self.chunk_store.name() + } + pub fn base_path(&self) -> PathBuf { self.chunk_store.base_path() } @@ -470,4 +475,28 @@ impl DataStore { ) -> Result<(bool, u64), Error> { self.chunk_store.insert_chunk(chunk, digest) } + + pub fn verify_stored_chunk(&self, digest: &[u8; 32], expected_chunk_size: u64) -> Result<(), Error> { + let blob = self.chunk_store.read_chunk(digest)?; + blob.verify_crc()?; + blob.verify_unencrypted(expected_chunk_size as usize, digest)?; + Ok(()) + } + + pub fn load_blob(&self, backup_dir: &BackupDir, filename: &str) -> Result<(DataBlob, u64), Error> { + let mut path = self.base_path(); + path.push(backup_dir.relative_path()); + path.push(filename); + + let raw_data = proxmox::tools::fs::file_get_contents(&path)?; + let raw_size = raw_data.len() as u64; + let blob = DataBlob::from_raw(raw_data)?; + Ok((blob, raw_size)) + } + + pub fn load_manifest(&self, backup_dir: &BackupDir) -> Result<(BackupManifest, u64), Error> { + let (blob, raw_size) = self.load_blob(backup_dir, MANIFEST_BLOB_NAME)?; + let manifest = BackupManifest::try_from(blob)?; + Ok((manifest, raw_size)) + } }