1 //! File format definitions and implementations for data written to
4 use std
::collections
::HashMap
;
6 use endian_trait
::Endian
;
7 use serde
::{Deserialize, Serialize}
;
9 use proxmox
::tools
::Uuid
;
11 use pbs_api_types
::Fingerprint
;
14 pub use chunk_archive
::*;
17 pub use snapshot_archive
::*;
20 pub use catalog_archive
::*;
22 mod multi_volume_writer
;
23 pub use multi_volume_writer
::*;
25 mod multi_volume_reader
;
26 pub use multi_volume_reader
::*;
28 // openssl::sha::sha256(b"Proxmox Backup Tape Label v1.0")[0..8];
29 pub const PROXMOX_BACKUP_MEDIA_LABEL_MAGIC_1_0
: [u8; 8] = [42, 5, 191, 60, 176, 48, 170, 57];
30 // openssl::sha::sha256(b"Proxmox Backup MediaSet Label v1.0")
31 pub const PROXMOX_BACKUP_MEDIA_SET_LABEL_MAGIC_1_0
: [u8; 8] = [8, 96, 99, 249, 47, 151, 83, 216];
33 // openssl::sha::sha256(b"Proxmox Backup Chunk Archive v1.0")[0..8]
34 // only used in unreleased version - no longer supported
35 pub const PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_0
: [u8; 8] = [62, 173, 167, 95, 49, 76, 6, 110];
36 // openssl::sha::sha256(b"Proxmox Backup Chunk Archive v1.1")[0..8]
37 pub const PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_1
: [u8; 8] = [109, 49, 99, 109, 215, 2, 131, 191];
39 // openssl::sha::sha256(b"Proxmox Backup Chunk Archive Entry v1.0")[0..8]
40 pub const PROXMOX_BACKUP_CHUNK_ARCHIVE_ENTRY_MAGIC_1_0
: [u8; 8] = [72, 87, 109, 242, 222, 66, 143, 220];
42 // openssl::sha::sha256(b"Proxmox Backup Snapshot Archive v1.0")[0..8];
43 // only used in unreleased version - no longer supported
44 pub const PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0
: [u8; 8] = [9, 182, 2, 31, 125, 232, 114, 133];
45 // openssl::sha::sha256(b"Proxmox Backup Snapshot Archive v1.1")[0..8];
46 pub const PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1
: [u8; 8] = [218, 22, 21, 208, 17, 226, 154, 98];
48 // openssl::sha::sha256(b"Proxmox Backup Catalog Archive v1.0")[0..8];
49 pub const PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0
: [u8; 8] = [183, 207, 199, 37, 158, 153, 30, 115];
51 lazy_static
::lazy_static
!{
52 // Map content magic numbers to human readable names.
53 static ref PROXMOX_TAPE_CONTENT_NAME
: HashMap
<&'
static [u8;8], &'
static str> = {
54 let mut map
= HashMap
::new();
55 map
.insert(&PROXMOX_BACKUP_MEDIA_LABEL_MAGIC_1_0
, "Proxmox Backup Tape Label v1.0");
56 map
.insert(&PROXMOX_BACKUP_MEDIA_SET_LABEL_MAGIC_1_0
, "Proxmox Backup MediaSet Label v1.0");
57 map
.insert(&PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_0
, "Proxmox Backup Chunk Archive v1.0");
58 map
.insert(&PROXMOX_BACKUP_CHUNK_ARCHIVE_MAGIC_1_1
, "Proxmox Backup Chunk Archive v1.1");
59 map
.insert(&PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_0
, "Proxmox Backup Snapshot Archive v1.0");
60 map
.insert(&PROXMOX_BACKUP_SNAPSHOT_ARCHIVE_MAGIC_1_1
, "Proxmox Backup Snapshot Archive v1.1");
61 map
.insert(&PROXMOX_BACKUP_CATALOG_ARCHIVE_MAGIC_1_0
, "Proxmox Backup Catalog Archive v1.0");
66 /// Map content magic numbers to human readable names.
67 pub fn proxmox_tape_magic_to_text(magic
: &[u8; 8]) -> Option
<String
> {
68 PROXMOX_TAPE_CONTENT_NAME
.get(magic
).map(|s
| String
::from(*s
))
72 #[derive(Deserialize, Serialize)]
73 /// Header for chunk archives
74 pub struct ChunkArchiveHeader
{
81 /// Header for data blobs inside a chunk archive
82 pub struct ChunkArchiveEntryHeader
{
83 /// fixed value `PROXMOX_BACKUP_CHUNK_ARCHIVE_ENTRY_MAGIC_1_0`
91 #[derive(Deserialize, Serialize)]
92 /// Header for snapshot archives
93 pub struct SnapshotArchiveHeader
{
100 #[derive(Deserialize, Serialize)]
101 /// Header for Catalog archives
102 pub struct CatalogArchiveHeader
{
103 /// The uuid of the media the catalog is for
105 /// The media set uuid the catalog is for
106 pub media_set_uuid
: Uuid
,
107 /// Media sequence number
111 #[derive(Serialize,Deserialize,Clone,Debug)]
114 /// Media labels are used to uniquely identify a media. They are
115 /// stored as first file on the tape.
116 pub struct MediaLabel
{
119 /// Media label text (or Barcode)
120 pub label_text
: String
,
121 /// Creation time stamp
126 #[derive(Serialize,Deserialize,Clone,Debug)]
129 /// Used to uniquely identify a `MediaSet`. They are stored as second
130 /// file on the tape.
131 pub struct MediaSetLabel
{
132 /// The associated `MediaPool`
134 /// Uuid. We use the all-zero Uuid to reseve an empty media for a specific pool
136 /// Media sequence number
138 /// Creation time stamp
140 /// Encryption key finkerprint (if encryped)
141 #[serde(skip_serializing_if="Option::is_none")]
142 pub encryption_key_fingerprint
: Option
<Fingerprint
>,
152 encryption_key_fingerprint
: Option
<Fingerprint
>,
155 pool
: pool
.to_string(),
159 encryption_key_fingerprint
,