From 839ce6f119777dfeae8ab207de6689ec9a258bbd Mon Sep 17 00:00:00 2001 From: Raj Vengalil Date: Sat, 6 Aug 2022 13:54:41 +0530 Subject: [PATCH] Add support for running commands --- rups/Cargo.toml | 1 + rups/src/cmd.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/rups/Cargo.toml b/rups/Cargo.toml index 8d729ee..d61cd6c 100644 --- a/rups/Cargo.toml +++ b/rups/Cargo.toml @@ -26,6 +26,7 @@ default = [] ssl = ["rustls", "rustls/dangerous_configuration", "webpki", "webpki-roots"] async = ["tokio"] async-ssl = ["async", "tokio-rustls", "ssl"] +write = [] # a feature gate for examples async-rt = ["async", "tokio/rt-multi-thread", "tokio/macros"] diff --git a/rups/src/cmd.rs b/rups/src/cmd.rs index c31a024..0460d03 100644 --- a/rups/src/cmd.rs +++ b/rups/src/cmd.rs @@ -18,6 +18,9 @@ pub enum Command<'a> { NetworkVersion, /// Queries the server version. Version, + #[cfg(feature = "write")] + /// Run a command. Allow for on additional optional param. + Run(&'a str, Option<&'a str>), /// Gracefully shuts down the connection. Logout, } @@ -33,6 +36,8 @@ impl<'a> Command<'a> { Self::StartTLS => "STARTTLS", Self::NetworkVersion => "NETVER", Self::Version => "VER", + #[cfg(feature = "write")] + Self::Run(_, _) => "INSTCMD", Self::Logout => "LOGOUT", } } @@ -44,6 +49,8 @@ impl<'a> Command<'a> { Self::SetUsername(username) => vec![username], Self::SetPassword(password) => vec![password], Self::List(query) => query.to_vec(), + #[cfg(feature = "write")] + Self::Run(cmd, param) => vec![cmd, param.unwrap_or("")], _ => Vec::new(), } } @@ -855,3 +862,31 @@ implement_action_commands! { Command::Logout } } + +#[cfg(feature = "write")] +impl crate::blocking::Connection { + /// Runs a command on the UPS. + pub fn run_command(&mut self, cmd: &str, param: Option<&str>) -> crate::Result<()> { + match self { + Self::Tcp(conn) => { + conn.write_cmd(Command::Run(cmd, param))?; + conn.read_response()?.expect_ok()?; + Ok(()) + } + } + } +} + +#[cfg(all(feature = "write", feature = "async"))] +impl crate::tokio::Connection { + /// Runs a command on the UPS. + pub async fn run_command(&mut self, cmd: &str, param: Option<&str>) -> crate::Result<()> { + match self { + Self::Tcp(conn) => { + conn.write_cmd(Command::Run(cmd, param)).await?; + conn.read_response().await?.expect_ok()?; + Ok(()) + } + } + } +}