]> git.proxmox.com Git - proxmox-backup.git/blob - src/backup/manifest.rs
cleanup
[proxmox-backup.git] / src / backup / manifest.rs
1 use failure::*;
2 use std::convert::TryFrom;
3
4 use serde_json::{json, Value};
5
6 use crate::backup::BackupDir;
7
8 pub const MANIFEST_BLOB_NAME: &str = "index.json.blob";
9
10 struct FileInfo {
11 filename: String,
12 size: u64,
13 csum: [u8; 32],
14 }
15
16 pub struct BackupManifest {
17 snapshot: BackupDir,
18 files: Vec<FileInfo>,
19 }
20
21 impl BackupManifest {
22
23 pub fn new(snapshot: BackupDir) -> Self {
24 Self { files: Vec::new(), snapshot }
25 }
26
27 pub fn add_file(&mut self, filename: String, size: u64, csum: [u8; 32]) {
28 self.files.push(FileInfo { filename, size, csum });
29 }
30
31 pub fn into_json(self) -> Value {
32 json!({
33 "backup-type": self.snapshot.group().backup_type(),
34 "backup-id": self.snapshot.group().backup_id(),
35 "backup-time": self.snapshot.backup_time().timestamp(),
36 "files": self.files.iter()
37 .fold(Vec::new(), |mut acc, info| {
38 acc.push(json!({
39 "filename": info.filename,
40 "size": info.size,
41 "csum": proxmox::tools::digest_to_hex(&info.csum),
42 }));
43 acc
44 })
45 })
46 }
47
48 }
49
50 impl TryFrom<Value> for BackupManifest {
51 type Error = Error;
52
53 fn try_from(data: Value) -> Result<Self, Error> {
54
55 use crate::tools::{required_string_property, required_integer_property, required_array_property};
56
57 let backup_type = required_string_property(&data, "backup_type")?;
58 let backup_id = required_string_property(&data, "backup_id")?;
59 let backup_time = required_integer_property(&data, "backup_time")?;
60
61 let snapshot = BackupDir::new(backup_type, backup_id, backup_time);
62
63 let mut files = Vec::new();
64 for item in required_array_property(&data, "files")?.iter() {
65 let filename = required_string_property(item, "filename")?.to_owned();
66 let csum = required_string_property(item, "csum")?;
67 let csum = proxmox::tools::hex_to_digest(csum)?;
68 let size = required_integer_property(item, "size")? as u64;
69 files.push(FileInfo { filename, size, csum });
70 }
71
72 Ok(Self { files, snapshot })
73 }
74 }