]>
Commit | Line | Data |
---|---|---|
4ebf0eab | 1 | use failure::*; |
fc189b19 | 2 | use ::serde::{Deserialize, Serialize}; |
4ebf0eab | 3 | |
fc189b19 | 4 | use proxmox::api::{api, const_regex, schema::*}; |
255f378a DM |
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 ? | |
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 |
36 | pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat = |
37 | ApiStringFormat::Pattern(&SYSTEMD_DATETIME_REGEX); | |
4ebf0eab | 38 | |
255f378a DM |
39 | pub const IP_FORMAT: ApiStringFormat = |
40 | ApiStringFormat::Pattern(&IP_FORMAT_REGEX); | |
bbf9e7e9 | 41 | |
255f378a DM |
42 | pub const PVE_CONFIG_DIGEST_FORMAT: ApiStringFormat = |
43 | ApiStringFormat::Pattern(&SHA256_HEX_REGEX); | |
44 | ||
d0adf270 DM |
45 | pub const PROXMOX_SAFE_ID_FORMAT: ApiStringFormat = |
46 | ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); | |
47 | ||
454c13ed DM |
48 | pub const SINGLE_LINE_COMMENT_FORMAT: ApiStringFormat = |
49 | ApiStringFormat::Pattern(&SINGLE_LINE_COMMENT_REGEX); | |
50 | ||
51 | ||
255f378a DM |
52 | pub const PVE_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new(r#"\ |
53 | Prevent changes if current configuration file has different SHA256 digest. | |
54 | This can be used to prevent concurrent modifications. | |
55 | "# | |
56 | ) | |
57 | .format(&PVE_CONFIG_DIGEST_FORMAT) | |
58 | .schema(); | |
59 | ||
60 | ||
61 | pub const CHUNK_DIGEST_FORMAT: ApiStringFormat = | |
62 | ApiStringFormat::Pattern(&SHA256_HEX_REGEX); | |
63 | ||
64 | pub const CHUNK_DIGEST_SCHEMA: Schema = StringSchema::new("Chunk digest (SHA256).") | |
65 | .format(&CHUNK_DIGEST_FORMAT) | |
66 | .schema(); | |
67 | ||
68 | pub 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 | ||
78 | pub const SEARCH_DOMAIN_SCHEMA: Schema = | |
79 | StringSchema::new("Search domain for host-name lookup.").schema(); | |
80 | ||
81 | pub const FIRST_DNS_SERVER_SCHEMA: Schema = | |
82 | StringSchema::new("First name server IP address.") | |
83 | .format(&IP_FORMAT) | |
84 | .schema(); | |
85 | ||
86 | pub const SECOND_DNS_SERVER_SCHEMA: Schema = | |
87 | StringSchema::new("Second name server IP address.") | |
88 | .format(&IP_FORMAT) | |
89 | .schema(); | |
90 | ||
91 | pub const THIRD_DNS_SERVER_SCHEMA: Schema = | |
92 | StringSchema::new("Third name server IP address.") | |
93 | .format(&IP_FORMAT) | |
94 | .schema(); | |
95 | ||
96 | pub const BACKUP_ARCHIVE_NAME_SCHEMA: Schema = | |
97 | StringSchema::new("Backup archive name.") | |
1ae5677d | 98 | .format(&PROXMOX_SAFE_ID_FORMAT) |
255f378a DM |
99 | .schema(); |
100 | ||
101 | pub const BACKUP_TYPE_SCHEMA: Schema = | |
102 | StringSchema::new("Backup type.") | |
103 | .format(&ApiStringFormat::Enum(&["vm", "ct", "host"])) | |
104 | .schema(); | |
105 | ||
106 | pub const BACKUP_ID_SCHEMA: Schema = | |
107 | StringSchema::new("Backup ID.") | |
1ae5677d | 108 | .format(&PROXMOX_SAFE_ID_FORMAT) |
255f378a DM |
109 | .schema(); |
110 | ||
111 | pub const BACKUP_TIME_SCHEMA: Schema = | |
112 | IntegerSchema::new("Backup time (Unix epoch.)") | |
113 | .minimum(1_547_797_308) | |
114 | .schema(); | |
5830c205 DM |
115 | |
116 | pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.") | |
117 | .max_length(256) | |
118 | .schema(); | |
66c49c21 DM |
119 | |
120 | pub 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 |
126 | pub 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 |
132 | pub 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 |
160 | pub 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 | } |