4 use proxmox_router
::{cli::*, ApiHandler, RpcEnvironment}
;
5 use proxmox_schema
::api
;
8 MEDIA_POOL_NAME_SCHEMA
, CHANGER_NAME_SCHEMA
, MediaStatus
, MediaListEntry
,
9 MediaContentListFilter
,
11 use pbs_config
::drive
::complete_changer_name
;
12 use pbs_config
::media_pool
::complete_pool_name
;
17 complete_media_label_text
,
19 complete_media_set_uuid
,
23 pub fn media_commands() -> CommandLineInterface
{
25 let cmd_def
= CliCommandMap
::new()
28 CliCommand
::new(&API_METHOD_LIST_MEDIA
)
29 .completion_cb("pool", complete_pool_name
)
30 .completion_cb("update-status-changer", complete_changer_name
)
34 CliCommand
::new(&api2
::tape
::media
::API_METHOD_DESTROY_MEDIA
)
35 .arg_param(&["label-text"])
36 .completion_cb("label-text", complete_media_label_text
)
40 CliCommand
::new(&API_METHOD_LIST_CONTENT
)
41 .completion_cb("pool", complete_pool_name
)
42 .completion_cb("label-text", complete_media_label_text
)
43 .completion_cb("media", complete_media_uuid
)
44 .completion_cb("media-set", complete_media_set_uuid
)
55 schema
: MEDIA_POOL_NAME_SCHEMA
,
59 description
: "Try to update tape library status (check what tapes are online).",
64 "update-status-changer": {
65 // only update status for a single changer
66 schema
: CHANGER_NAME_SCHEMA
,
70 schema
: OUTPUT_FORMAT
,
79 rpcenv
: &mut dyn RpcEnvironment
,
80 ) -> Result
<(), Error
> {
82 let output_format
= get_output_format(¶m
);
83 let info
= &api2
::tape
::media
::API_METHOD_LIST_MEDIA
;
84 let mut data
= match info
.handler
{
85 ApiHandler
::Async(handler
) => (handler
)(param
, info
, rpcenv
).await?
,
89 fn render_status(_value
: &Value
, record
: &Value
) -> Result
<String
, Error
> {
90 let record
: MediaListEntry
= serde_json
::from_value(record
.clone())?
;
91 Ok(match record
.status
{
92 MediaStatus
::Damaged
| MediaStatus
::Retired
=> {
93 serde_json
::to_value(&record
.status
)?
99 String
::from("expired")
101 serde_json
::to_value(&record
.status
)?
109 fn catalog_status(value
: &Value
, _record
: &Value
) -> Result
<String
, Error
> {
110 let catalog_ok
= value
.as_bool().unwrap();
112 Ok(String
::from("ok"))
114 Ok(String
::from("missing"))
117 let options
= default_table_format_options()
118 .sortby("pool", false)
119 .sortby("media-set-uuid", false)
120 .sortby("seq-nr", false)
121 .sortby("label-text", false)
122 .column(ColumnConfig
::new("label-text"))
123 .column(ColumnConfig
::new("pool"))
124 .column(ColumnConfig
::new("media-set-name"))
125 .column(ColumnConfig
::new("seq-nr"))
126 .column(ColumnConfig
::new("status").renderer(render_status
))
127 .column(ColumnConfig
::new("location"))
128 .column(ColumnConfig
::new("catalog").renderer(catalog_status
))
129 .column(ColumnConfig
::new("uuid"))
130 .column(ColumnConfig
::new("media-set-uuid"))
133 format_and_print_result_full(&mut data
, &info
.returns
, &output_format
, &options
);
142 type: MediaContentListFilter
,
146 schema
: OUTPUT_FORMAT
,
152 /// List media content
155 rpcenv
: &mut dyn RpcEnvironment
,
156 ) -> Result
<(), Error
> {
158 let output_format
= get_output_format(¶m
);
159 let info
= &api2
::tape
::media
::API_METHOD_LIST_CONTENT
;
160 let mut data
= match info
.handler
{
161 ApiHandler
::Sync(handler
) => (handler
)(param
, info
, rpcenv
)?
,
165 let options
= default_table_format_options()
166 .sortby("media-set-uuid", false)
167 .sortby("seq-nr", false)
168 .sortby("store", false)
169 .sortby("snapshot", false)
170 .sortby("backup-time", false)
171 .column(ColumnConfig
::new("label-text"))
172 .column(ColumnConfig
::new("pool"))
173 .column(ColumnConfig
::new("media-set-name"))
174 .column(ColumnConfig
::new("seq-nr"))
175 .column(ColumnConfig
::new("store"))
176 .column(ColumnConfig
::new("snapshot"))
177 .column(ColumnConfig
::new("media-set-uuid"))
180 format_and_print_result_full(&mut data
, &info
.returns
, &output_format
, &options
);