]> git.proxmox.com Git - proxmox-backup.git/blame - src/api2/types.rs
src/config/*: add #[serde(skip_serializing_if="Option::is_none")] to optinal comment
[proxmox-backup.git] / src / api2 / types.rs
CommitLineData
4ebf0eab 1use failure::*;
fc189b19 2use ::serde::{Deserialize, Serialize};
4ebf0eab 3
fc189b19 4use proxmox::api::{api, const_regex, schema::*};
255f378a
DM
5use proxmox::tools::*; // required to use IPRE!() macro ???
6
7// File names: may not contain slashes, may not start with "."
8pub 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
19const_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 ?
d0adf270
DM
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._\-]*";
454c13ed
DM
32
33 pub SINGLE_LINE_COMMENT_REGEX = r"^[[:^cntrl:]]*$";
255f378a 34}
4ebf0eab 35
255f378a
DM
36pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat =
37 ApiStringFormat::Pattern(&SYSTEMD_DATETIME_REGEX);
4ebf0eab 38
255f378a
DM
39pub const IP_FORMAT: ApiStringFormat =
40 ApiStringFormat::Pattern(&IP_FORMAT_REGEX);
bbf9e7e9 41
255f378a
DM
42pub const PVE_CONFIG_DIGEST_FORMAT: ApiStringFormat =
43 ApiStringFormat::Pattern(&SHA256_HEX_REGEX);
44
d0adf270
DM
45pub const PROXMOX_SAFE_ID_FORMAT: ApiStringFormat =
46 ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX);
47
454c13ed
DM
48pub const SINGLE_LINE_COMMENT_FORMAT: ApiStringFormat =
49 ApiStringFormat::Pattern(&SINGLE_LINE_COMMENT_REGEX);
50
51
255f378a
DM
52pub const PVE_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new(r#"\
53Prevent changes if current configuration file has different SHA256 digest.
54This can be used to prevent concurrent modifications.
55"#
56)
57 .format(&PVE_CONFIG_DIGEST_FORMAT)
58 .schema();
59
60
61pub const CHUNK_DIGEST_FORMAT: ApiStringFormat =
62 ApiStringFormat::Pattern(&SHA256_HEX_REGEX);
63
64pub const CHUNK_DIGEST_SCHEMA: Schema = StringSchema::new("Chunk digest (SHA256).")
65 .format(&CHUNK_DIGEST_FORMAT)
66 .schema();
67
68pub const NODE_SCHEMA: Schema = StringSchema::new("Node name (or 'localhost')")
69 .format(&ApiStringFormat::VerifyFn(|node| {
70 if node == "localhost" || node == proxmox::tools::nodename() {
71 Ok(())
72 } else {
73 bail!("no such node '{}'", node);
74 }
75 }))
76 .schema();
77
78pub const SEARCH_DOMAIN_SCHEMA: Schema =
79 StringSchema::new("Search domain for host-name lookup.").schema();
80
81pub const FIRST_DNS_SERVER_SCHEMA: Schema =
82 StringSchema::new("First name server IP address.")
83 .format(&IP_FORMAT)
84 .schema();
85
86pub const SECOND_DNS_SERVER_SCHEMA: Schema =
87 StringSchema::new("Second name server IP address.")
88 .format(&IP_FORMAT)
89 .schema();
90
91pub const THIRD_DNS_SERVER_SCHEMA: Schema =
92 StringSchema::new("Third name server IP address.")
93 .format(&IP_FORMAT)
94 .schema();
95
96pub const BACKUP_ARCHIVE_NAME_SCHEMA: Schema =
97 StringSchema::new("Backup archive name.")
1ae5677d 98 .format(&PROXMOX_SAFE_ID_FORMAT)
255f378a
DM
99 .schema();
100
101pub const BACKUP_TYPE_SCHEMA: Schema =
102 StringSchema::new("Backup type.")
103 .format(&ApiStringFormat::Enum(&["vm", "ct", "host"]))
104 .schema();
105
106pub const BACKUP_ID_SCHEMA: Schema =
107 StringSchema::new("Backup ID.")
1ae5677d 108 .format(&PROXMOX_SAFE_ID_FORMAT)
255f378a
DM
109 .schema();
110
111pub const BACKUP_TIME_SCHEMA: Schema =
112 IntegerSchema::new("Backup time (Unix epoch.)")
113 .minimum(1_547_797_308)
114 .schema();
5830c205
DM
115
116pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.")
117 .max_length(256)
118 .schema();
66c49c21
DM
119
120pub const DATASTORE_SCHEMA: Schema = StringSchema::new("Datastore name.")
d0adf270 121 .format(&PROXMOX_SAFE_ID_FORMAT)
688fbe07 122 .min_length(3)
66c49c21
DM
123 .max_length(32)
124 .schema();
fc189b19 125
167971ed
DM
126pub const REMOTE_ID_SCHEMA: Schema = StringSchema::new("Remote ID.")
127 .format(&PROXMOX_SAFE_ID_FORMAT)
128 .min_length(3)
129 .max_length(32)
130 .schema();
131
454c13ed
DM
132pub const SINGLE_LINE_COMMENT_SCHEMA: Schema = StringSchema::new("Comment (single line).")
133 .format(&SINGLE_LINE_COMMENT_FORMAT)
134 .schema();
fc189b19
DM
135
136
137// Complex type definitions
138
139#[api(
fc189b19
DM
140 properties: {
141 "backup-type": {
142 schema: BACKUP_TYPE_SCHEMA,
143 },
144 "backup-id": {
145 schema: BACKUP_ID_SCHEMA,
146 },
147 "backup-time": {
148 schema: BACKUP_TIME_SCHEMA,
149 },
71da3d6a
DM
150 files: {
151 items: {
152 schema: BACKUP_ARCHIVE_NAME_SCHEMA
153 },
154 },
fc189b19
DM
155 },
156)]
157#[derive(Serialize, Deserialize)]
158#[serde(rename_all="kebab-case")]
71da3d6a 159/// Basic information about backup snapshot.
fc189b19
DM
160pub struct SnapshotListItem {
161 pub backup_type: String, // enum
162 pub backup_id: String,
163 pub backup_time: i64,
71da3d6a 164 /// List of contained archive files.
fc189b19 165 pub files: Vec<String>,
71da3d6a 166 /// Overall snapshot size (sum of all archive sizes).
fc189b19
DM
167 #[serde(skip_serializing_if="Option::is_none")]
168 pub size: Option<u64>,
169}