]>
Commit | Line | Data |
---|---|---|
59e9ba01 DM |
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 | ||
e17d5d86 DM |
55 | let backup_type = crate::tools::required_string_property(&data, "backup_type")?; |
56 | let backup_id = crate::tools::required_string_property(&data, "backup_id")?; | |
57 | let backup_time = crate::tools::required_integer_property(&data, "backup_time")?; | |
59e9ba01 DM |
58 | |
59 | let snapshot = BackupDir::new(backup_type, backup_id, backup_time); | |
60 | ||
e17d5d86 DM |
61 | let mut files = Vec::new(); |
62 | for item in crate::tools::required_array_property(&data, "files")?.iter() { | |
63 | let filename = crate::tools::required_string_property(item, "filename")?.to_owned(); | |
64 | let csum = crate::tools::required_string_property(item, "csum")?; | |
65 | let csum = proxmox::tools::hex_to_digest(csum)?; | |
66 | let size = crate::tools::required_integer_property(item, "size")? as u64; | |
67 | files.push(FileInfo { filename, size, csum }); | |
68 | } | |
59e9ba01 DM |
69 | |
70 | Ok(Self { files, snapshot }) | |
71 | } | |
72 | } |