mtx_unload,
linux_tape_device_list,
open_drive,
+ media_changer,
},
};
Ok(())
}
+#[api(
+ input: {
+ properties: {
+ drive: {
+ schema: DRIVE_ID_SCHEMA,
+ },
+ },
+ },
+)]
+/// Eject/Unload drive media
+pub fn eject_media(drive: String) -> Result<(), Error> {
+
+ let (config, _digest) = config::drive::config()?;
+
+ let (mut changer, _) = media_changer(&config, &drive, false)?;
+
+ if !changer.eject_on_unload() {
+ let mut drive = open_drive(&config, &drive)?;
+ drive.eject_media()?;
+ }
+
+ changer.unload_media()?;
+
+ Ok(())
+}
+
pub const SUBDIRS: SubdirMap = &[
(
"rewind",
&Router::new()
.put(&API_METHOD_ERASE_MEDIA)
),
+ (
+ "eject-media",
+ &Router::new()
+ .put(&API_METHOD_EJECT_MEDIA)
+ ),
(
"load-slot",
&Router::new()
mut param: Value,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<(), Error> {
+
let (config, _digest) = config::drive::config()?;
param["drive"] = lookup_drive_name(¶m, &config)?.into();
Ok(())
}
+#[api(
+ input: {
+ properties: {
+ drive: {
+ schema: DRIVE_ID_SCHEMA,
+ optional: true,
+ },
+ },
+ },
+)]
+/// Eject/Unload drive media
+fn eject_media(
+ mut param: Value,
+ rpcenv: &mut dyn RpcEnvironment,
+) -> Result<(), Error> {
+
+ let (config, _digest) = config::drive::config()?;
+
+ param["drive"] = lookup_drive_name(¶m, &config)?.into();
+
+ let info = &api2::tape::drive::API_METHOD_EJECT_MEDIA;
+
+ match info.handler {
+ ApiHandler::Sync(handler) => (handler)(param, info, rpcenv)?,
+ _ => unreachable!(),
+ };
+
+ Ok(())
+}
+
fn main() {
let cmd_def = CliCommandMap::new()
CliCommand::new(&API_METHOD_ERASE_MEDIA)
.completion_cb("drive", complete_drive_name)
)
+ .insert(
+ "eject",
+ CliCommand::new(&API_METHOD_EJECT_MEDIA)
+ .completion_cb("drive", complete_drive_name)
+ )
.insert("changer", changer_commands())
.insert("drive", drive_commands())
;