diff --git a/src/backup.rs b/src/backup.rs index 06b5edde..5cca5885 100644 --- a/src/backup.rs +++ b/src/backup.rs @@ -135,6 +135,9 @@ pub use chunk_stat::*; pub use proxmox_protocol::Chunker; +mod read_chunk; +pub use read_chunk::*; + mod chunk_store; pub use chunk_store::*; diff --git a/src/backup/dynamic_index.rs b/src/backup/dynamic_index.rs index b616d23a..4374d37b 100644 --- a/src/backup/dynamic_index.rs +++ b/src/backup/dynamic_index.rs @@ -6,6 +6,7 @@ use crate::tools; use super::IndexFile; use super::chunk_stat::*; use super::chunk_store::*; +use super::read_chunk::*; use proxmox_protocol::Chunker; use std::sync::Arc; @@ -243,12 +244,6 @@ impl IndexFile for DynamicIndexReader { } } -/// The ReadChunk trait allows reading backup data chunks (local or remote) -pub trait ReadChunk { - /// Returns the decoded chunk data - fn read_chunk(&self, digest:&[u8; 32]) -> Result, Error>; -} - pub struct BufferedDynamicReader { store: S, index: DynamicIndexReader, diff --git a/src/backup/read_chunk.rs b/src/backup/read_chunk.rs new file mode 100644 index 00000000..6d873b39 --- /dev/null +++ b/src/backup/read_chunk.rs @@ -0,0 +1,45 @@ +use failure::*; +use std::sync::Arc; + +use super::datastore::*; +use super::crypt_config::*; +use super::data_chunk::*; + +/// The ReadChunk trait allows reading backup data chunks (local or remote) +pub trait ReadChunk { + /// Returns the decoded chunk data + fn read_chunk(&self, digest:&[u8; 32]) -> Result, Error>; +} + +pub struct LocalChunkReader { + store: DataStore, + crypt_config: Option>, +} + +impl LocalChunkReader { + + pub fn new(store: DataStore, crypt_config: Option>) -> Self { + Self { store, crypt_config } + } +} + +impl ReadChunk for LocalChunkReader { + + fn read_chunk(&self, digest:&[u8; 32]) -> Result, Error> { + + let digest_str = proxmox::tools::digest_to_hex(digest); + println!("READ CHUNK {}", digest_str); + + let (path, _) = self.store.chunk_path(digest); + let raw_data = crate::tools::file_get_contents(&path)?; + let chunk = DataChunk::from_raw(raw_data, *digest)?; + chunk.verify_crc()?; + + let raw_data = match self.crypt_config { + Some(ref crypt_config) => chunk.decode(Some(crypt_config))?, + None => chunk.decode(None)?, + }; + + Ok(raw_data) + } +}