]> git.proxmox.com Git - proxmox-backup.git/blob - src/api2/types.rs
src/api2/types.rs: define and use new api type SnapshotListItem
[proxmox-backup.git] / src / api2 / types.rs
1 use failure::*;
2 use ::serde::{Deserialize, Serialize};
3
4 use proxmox::api::{api, const_regex, schema::*};
5 use proxmox::tools::*; // required to use IPRE!() macro ???
6
7 // File names: may not contain slashes, may not start with "."
8 pub const FILENAME_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|name| {
9 if name.starts_with('.') {
10 bail!("file names may not start with '.'");
11 }
12 if name.contains('/') {
13 bail!("file names may not contain slashes");
14 }
15 Ok(())
16 });
17
18
19 const_regex!{
20 pub IP_FORMAT_REGEX = IPRE!();
21 pub SHA256_HEX_REGEX = r"^[a-f0-9]{64}$"; // fixme: define in common_regex ?
22 pub SYSTEMD_DATETIME_REGEX = r"^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}(:\d{2})?)?$"; // fixme: define in common_regex ?
23
24 /// Regex for safe identifiers.
25 ///
26 /// This
27 /// [article](https://dwheeler.com/essays/fixing-unix-linux-filenames.html)
28 /// contains further information why it is reasonable to restict
29 /// names this way. This is not only useful for filenames, but for
30 /// any identifier command line tools work with.
31 pub PROXMOX_SAFE_ID_REGEX = r"^[A-Za-z0-9_][A-Za-z0-9._\-]*";
32 }
33
34 pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat =
35 ApiStringFormat::Pattern(&SYSTEMD_DATETIME_REGEX);
36
37 pub const IP_FORMAT: ApiStringFormat =
38 ApiStringFormat::Pattern(&IP_FORMAT_REGEX);
39
40 pub const PVE_CONFIG_DIGEST_FORMAT: ApiStringFormat =
41 ApiStringFormat::Pattern(&SHA256_HEX_REGEX);
42
43 pub const PROXMOX_SAFE_ID_FORMAT: ApiStringFormat =
44 ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX);
45
46 pub const PVE_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new(r#"\
47 Prevent changes if current configuration file has different SHA256 digest.
48 This can be used to prevent concurrent modifications.
49 "#
50 )
51 .format(&PVE_CONFIG_DIGEST_FORMAT)
52 .schema();
53
54
55 pub const CHUNK_DIGEST_FORMAT: ApiStringFormat =
56 ApiStringFormat::Pattern(&SHA256_HEX_REGEX);
57
58 pub const CHUNK_DIGEST_SCHEMA: Schema = StringSchema::new("Chunk digest (SHA256).")
59 .format(&CHUNK_DIGEST_FORMAT)
60 .schema();
61
62 pub const NODE_SCHEMA: Schema = StringSchema::new("Node name (or 'localhost')")
63 .format(&ApiStringFormat::VerifyFn(|node| {
64 if node == "localhost" || node == proxmox::tools::nodename() {
65 Ok(())
66 } else {
67 bail!("no such node '{}'", node);
68 }
69 }))
70 .schema();
71
72 pub const SEARCH_DOMAIN_SCHEMA: Schema =
73 StringSchema::new("Search domain for host-name lookup.").schema();
74
75 pub const FIRST_DNS_SERVER_SCHEMA: Schema =
76 StringSchema::new("First name server IP address.")
77 .format(&IP_FORMAT)
78 .schema();
79
80 pub const SECOND_DNS_SERVER_SCHEMA: Schema =
81 StringSchema::new("Second name server IP address.")
82 .format(&IP_FORMAT)
83 .schema();
84
85 pub const THIRD_DNS_SERVER_SCHEMA: Schema =
86 StringSchema::new("Third name server IP address.")
87 .format(&IP_FORMAT)
88 .schema();
89
90 pub const BACKUP_ARCHIVE_NAME_SCHEMA: Schema =
91 StringSchema::new("Backup archive name.")
92 .format(&PROXMOX_SAFE_ID_FORMAT)
93 .schema();
94
95 pub const BACKUP_TYPE_SCHEMA: Schema =
96 StringSchema::new("Backup type.")
97 .format(&ApiStringFormat::Enum(&["vm", "ct", "host"]))
98 .schema();
99
100 pub const BACKUP_ID_SCHEMA: Schema =
101 StringSchema::new("Backup ID.")
102 .format(&PROXMOX_SAFE_ID_FORMAT)
103 .schema();
104
105 pub const BACKUP_TIME_SCHEMA: Schema =
106 IntegerSchema::new("Backup time (Unix epoch.)")
107 .minimum(1_547_797_308)
108 .schema();
109
110 pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.")
111 .max_length(256)
112 .schema();
113
114 pub const DATASTORE_SCHEMA: Schema = StringSchema::new("Datastore name.")
115 .format(&PROXMOX_SAFE_ID_FORMAT)
116 .max_length(32)
117 .schema();
118
119
120
121 // Complex type definitions
122
123 #[api(
124 description: "Basic information about backup snapshot.",
125 properties: {
126 "backup-type": {
127 schema: BACKUP_TYPE_SCHEMA,
128 },
129 "backup-id": {
130 schema: BACKUP_ID_SCHEMA,
131 },
132 "backup-time": {
133 schema: BACKUP_TIME_SCHEMA,
134 },
135 },
136 )]
137 #[derive(Serialize, Deserialize)]
138 #[serde(rename_all="kebab-case")]
139 pub struct SnapshotListItem {
140 pub backup_type: String, // enum
141 pub backup_id: String,
142 pub backup_time: i64,
143 pub files: Vec<String>,
144 #[serde(skip_serializing_if="Option::is_none")]
145 pub size: Option<u64>,
146 }