2 use serde_json
::{json, Value}
;
4 use proxmox
::api
::{api, cli::*}
;
16 api_datastore_list_snapshots
,
17 complete_backup_snapshot
,
18 complete_backup_group
,
21 extract_repository_from_value
,
29 schema
: REPO_URL_SCHEMA
,
34 description
: "Backup group.",
38 schema
: OUTPUT_FORMAT
,
44 /// List backup snapshots.
45 async
fn list_snapshots(param
: Value
) -> Result
<Value
, Error
> {
47 let repo
= extract_repository_from_value(¶m
)?
;
49 let output_format
= get_output_format(¶m
);
51 let client
= connect(&repo
)?
;
53 let group
: Option
<BackupGroup
> = if let Some(path
) = param
["group"].as_str() {
59 let mut data
= api_datastore_list_snapshots(&client
, repo
.store(), group
).await?
;
61 record_repository(&repo
);
63 let render_snapshot_path
= |_v
: &Value
, record
: &Value
| -> Result
<String
, Error
> {
64 let item
: SnapshotListItem
= serde_json
::from_value(record
.to_owned())?
;
65 let snapshot
= BackupDir
::new(item
.backup_type
, item
.backup_id
, item
.backup_time
)?
;
66 Ok(snapshot
.relative_path().to_str().unwrap().to_owned())
69 let render_files
= |_v
: &Value
, record
: &Value
| -> Result
<String
, Error
> {
70 let item
: SnapshotListItem
= serde_json
::from_value(record
.to_owned())?
;
71 let mut filenames
= Vec
::new();
72 for file
in &item
.files
{
73 filenames
.push(file
.filename
.to_string());
75 Ok(tools
::format
::render_backup_file_list(&filenames
[..]))
78 let options
= default_table_format_options()
79 .sortby("backup-type", false)
80 .sortby("backup-id", false)
81 .sortby("backup-time", false)
82 .column(ColumnConfig
::new("backup-id").renderer(render_snapshot_path
).header("snapshot"))
83 .column(ColumnConfig
::new("size").renderer(tools
::format
::render_bytes_human_readable
))
84 .column(ColumnConfig
::new("files").renderer(render_files
))
87 let info
= &proxmox_backup
::api2
::admin
::datastore
::API_RETURN_SCHEMA_LIST_SNAPSHOTS
;
89 format_and_print_result_full(&mut data
, info
, &output_format
, &options
);
98 schema
: REPO_URL_SCHEMA
,
103 description
: "Snapshot path.",
106 schema
: OUTPUT_FORMAT
,
112 /// List snapshot files.
113 async
fn list_snapshot_files(param
: Value
) -> Result
<Value
, Error
> {
115 let repo
= extract_repository_from_value(¶m
)?
;
117 let path
= tools
::required_string_param(¶m
, "snapshot")?
;
118 let snapshot
: BackupDir
= path
.parse()?
;
120 let output_format
= get_output_format(¶m
);
122 let client
= connect(&repo
)?
;
124 let path
= format
!("api2/json/admin/datastore/{}/files", repo
.store());
126 let mut result
= client
.get(&path
, Some(json
!({
127 "backup-type": snapshot
.group().backup_type(),
128 "backup-id": snapshot
.group().backup_id(),
129 "backup-time": snapshot
.backup_time(),
132 record_repository(&repo
);
134 let info
= &proxmox_backup
::api2
::admin
::datastore
::API_RETURN_SCHEMA_LIST_SNAPSHOT_FILES
;
136 let mut data
: Value
= result
["data"].take();
138 let options
= default_table_format_options();
140 format_and_print_result_full(&mut data
, info
, &output_format
, &options
);
149 schema
: REPO_URL_SCHEMA
,
154 description
: "Snapshot path.",
159 /// Forget (remove) backup snapshots.
160 async
fn forget_snapshots(param
: Value
) -> Result
<Value
, Error
> {
162 let repo
= extract_repository_from_value(¶m
)?
;
164 let path
= tools
::required_string_param(¶m
, "snapshot")?
;
165 let snapshot
: BackupDir
= path
.parse()?
;
167 let mut client
= connect(&repo
)?
;
169 let path
= format
!("api2/json/admin/datastore/{}/snapshots", repo
.store());
171 let result
= client
.delete(&path
, Some(json
!({
172 "backup-type": snapshot
.group().backup_type(),
173 "backup-id": snapshot
.group().backup_id(),
174 "backup-time": snapshot
.backup_time(),
177 record_repository(&repo
);
186 schema
: REPO_URL_SCHEMA
,
191 description
: "Snapshot path.",
194 schema
: OUTPUT_FORMAT
,
201 async
fn show_notes(param
: Value
) -> Result
<Value
, Error
> {
202 let repo
= extract_repository_from_value(¶m
)?
;
203 let path
= tools
::required_string_param(¶m
, "snapshot")?
;
205 let snapshot
: BackupDir
= path
.parse()?
;
206 let client
= connect(&repo
)?
;
208 let path
= format
!("api2/json/admin/datastore/{}/notes", repo
.store());
211 "backup-type": snapshot
.group().backup_type(),
212 "backup-id": snapshot
.group().backup_id(),
213 "backup-time": snapshot
.backup_time(),
216 let output_format
= get_output_format(¶m
);
218 let mut result
= client
.get(&path
, Some(args
)).await?
;
220 let notes
= result
["data"].take();
222 if output_format
== "text" {
223 if let Some(notes
) = notes
.as_str() {
224 println
!("{}", notes
);
227 format_and_print_result(
242 schema
: REPO_URL_SCHEMA
,
247 description
: "Snapshot path.",
251 description
: "The Notes.",
257 async
fn update_notes(param
: Value
) -> Result
<Value
, Error
> {
258 let repo
= extract_repository_from_value(¶m
)?
;
259 let path
= tools
::required_string_param(¶m
, "snapshot")?
;
260 let notes
= tools
::required_string_param(¶m
, "notes")?
;
262 let snapshot
: BackupDir
= path
.parse()?
;
263 let mut client
= connect(&repo
)?
;
265 let path
= format
!("api2/json/admin/datastore/{}/notes", repo
.store());
268 "backup-type": snapshot
.group().backup_type(),
269 "backup-id": snapshot
.group().backup_id(),
270 "backup-time": snapshot
.backup_time(),
274 client
.put(&path
, Some(args
)).await?
;
279 fn notes_cli() -> CliCommandMap
{
283 CliCommand
::new(&API_METHOD_SHOW_NOTES
)
284 .arg_param(&["snapshot"])
285 .completion_cb("snapshot", complete_backup_snapshot
),
289 CliCommand
::new(&API_METHOD_UPDATE_NOTES
)
290 .arg_param(&["snapshot", "notes"])
291 .completion_cb("snapshot", complete_backup_snapshot
),
295 pub fn snapshot_mgtm_cli() -> CliCommandMap
{
297 .insert("notes", notes_cli())
300 CliCommand
::new(&API_METHOD_LIST_SNAPSHOTS
)
301 .arg_param(&["group"])
302 .completion_cb("group", complete_backup_group
)
303 .completion_cb("repository", complete_repository
)
307 CliCommand
::new(&API_METHOD_LIST_SNAPSHOT_FILES
)
308 .arg_param(&["snapshot"])
309 .completion_cb("repository", complete_repository
)
310 .completion_cb("snapshot", complete_backup_snapshot
)
314 CliCommand
::new(&API_METHOD_FORGET_SNAPSHOTS
)
315 .arg_param(&["snapshot"])
316 .completion_cb("repository", complete_repository
)
317 .completion_cb("snapshot", complete_backup_snapshot
)