14 MEDIA_POOL_NAME_SCHEMA
, CHANGER_NAME_SCHEMA
, MediaStatus
, MediaListEntry
,
15 MediaContentListFilter
,
17 use pbs_config
::drive
::complete_changer_name
;
18 use pbs_config
::media_pool
::complete_pool_name
;
23 complete_media_label_text
,
25 complete_media_set_uuid
,
29 pub fn media_commands() -> CommandLineInterface
{
31 let cmd_def
= CliCommandMap
::new()
34 CliCommand
::new(&API_METHOD_LIST_MEDIA
)
35 .completion_cb("pool", complete_pool_name
)
36 .completion_cb("update-status-changer", complete_changer_name
)
40 CliCommand
::new(&api2
::tape
::media
::API_METHOD_DESTROY_MEDIA
)
41 .arg_param(&["label-text"])
42 .completion_cb("label-text", complete_media_label_text
)
46 CliCommand
::new(&API_METHOD_LIST_CONTENT
)
47 .completion_cb("pool", complete_pool_name
)
48 .completion_cb("label-text", complete_media_label_text
)
49 .completion_cb("media", complete_media_uuid
)
50 .completion_cb("media-set", complete_media_set_uuid
)
61 schema
: MEDIA_POOL_NAME_SCHEMA
,
65 description
: "Try to update tape library status (check what tapes are online).",
70 "update-status-changer": {
71 // only update status for a single changer
72 schema
: CHANGER_NAME_SCHEMA
,
76 schema
: OUTPUT_FORMAT
,
85 rpcenv
: &mut dyn RpcEnvironment
,
86 ) -> Result
<(), Error
> {
88 let output_format
= get_output_format(¶m
);
89 let info
= &api2
::tape
::media
::API_METHOD_LIST_MEDIA
;
90 let mut data
= match info
.handler
{
91 ApiHandler
::Async(handler
) => (handler
)(param
, info
, rpcenv
).await?
,
95 fn render_status(_value
: &Value
, record
: &Value
) -> Result
<String
, Error
> {
96 let record
: MediaListEntry
= serde_json
::from_value(record
.clone())?
;
97 Ok(match record
.status
{
98 MediaStatus
::Damaged
| MediaStatus
::Retired
=> {
99 serde_json
::to_value(&record
.status
)?
105 String
::from("expired")
107 serde_json
::to_value(&record
.status
)?
115 fn catalog_status(value
: &Value
, _record
: &Value
) -> Result
<String
, Error
> {
116 let catalog_ok
= value
.as_bool().unwrap();
118 Ok(String
::from("ok"))
120 Ok(String
::from("missing"))
123 let options
= default_table_format_options()
124 .sortby("pool", false)
125 .sortby("media-set-uuid", false)
126 .sortby("seq-nr", false)
127 .sortby("label-text", false)
128 .column(ColumnConfig
::new("label-text"))
129 .column(ColumnConfig
::new("pool"))
130 .column(ColumnConfig
::new("media-set-name"))
131 .column(ColumnConfig
::new("seq-nr"))
132 .column(ColumnConfig
::new("status").renderer(render_status
))
133 .column(ColumnConfig
::new("location"))
134 .column(ColumnConfig
::new("catalog").renderer(catalog_status
))
135 .column(ColumnConfig
::new("uuid"))
136 .column(ColumnConfig
::new("media-set-uuid"))
139 format_and_print_result_full(&mut data
, &info
.returns
, &output_format
, &options
);
148 type: MediaContentListFilter
,
152 schema
: OUTPUT_FORMAT
,
158 /// List media content
161 rpcenv
: &mut dyn RpcEnvironment
,
162 ) -> Result
<(), Error
> {
164 let output_format
= get_output_format(¶m
);
165 let info
= &api2
::tape
::media
::API_METHOD_LIST_CONTENT
;
166 let mut data
= match info
.handler
{
167 ApiHandler
::Sync(handler
) => (handler
)(param
, info
, rpcenv
)?
,
171 let options
= default_table_format_options()
172 .sortby("media-set-uuid", false)
173 .sortby("seq-nr", false)
174 .sortby("store", false)
175 .sortby("snapshot", false)
176 .sortby("backup-time", false)
177 .column(ColumnConfig
::new("label-text"))
178 .column(ColumnConfig
::new("pool"))
179 .column(ColumnConfig
::new("media-set-name"))
180 .column(ColumnConfig
::new("seq-nr"))
181 .column(ColumnConfig
::new("store"))
182 .column(ColumnConfig
::new("snapshot"))
183 .column(ColumnConfig
::new("media-set-uuid"))
186 format_and_print_result_full(&mut data
, &info
.returns
, &output_format
, &options
);