Implement LOGOUT

Fixes #21
This commit is contained in:
Aram 🍐 2021-08-01 00:13:44 -04:00
parent c56be76906
commit 11f70642dd
6 changed files with 34 additions and 8 deletions

View file

@ -43,5 +43,6 @@ async fn main() -> nut_client::Result<()> {
} }
} }
Ok(()) // Gracefully shut down the connection using the `LOGOUT` command
conn.close().await
} }

View file

@ -1,8 +1,8 @@
use std::convert::TryInto;
use std::env; use std::env;
use nut_client::blocking::Connection; use nut_client::blocking::Connection;
use nut_client::{Auth, ConfigBuilder}; use nut_client::{Auth, ConfigBuilder};
use std::convert::TryInto;
fn main() -> nut_client::Result<()> { fn main() -> nut_client::Result<()> {
let host = env::var("NUT_HOST").unwrap_or_else(|_| "localhost".into()); let host = env::var("NUT_HOST").unwrap_or_else(|_| "localhost".into());
@ -42,5 +42,6 @@ fn main() -> nut_client::Result<()> {
} }
} }
Ok(()) // Gracefully shut down the connection using the `LOGOUT` command
conn.close()
} }

View file

@ -26,6 +26,12 @@ impl Connection {
Ok(conn) Ok(conn)
} }
/// Gracefully closes the connection.
pub fn close(mut self) -> crate::Result<()> {
self.logout()?;
Ok(())
}
/// Sends username and password, as applicable. /// Sends username and password, as applicable.
fn login(&mut self, config: &Config) -> crate::Result<()> { fn login(&mut self, config: &Config) -> crate::Result<()> {
if let Some(auth) = config.auth.clone() { if let Some(auth) = config.auth.clone() {

View file

@ -15,8 +15,10 @@ pub enum Command<'a> {
StartTLS, StartTLS,
/// Queries the network version. /// Queries the network version.
NetworkVersion, NetworkVersion,
/// Queries the server version /// Queries the server version.
Version, Version,
/// Gracefully shuts down the connection.
Logout,
} }
impl<'a> Command<'a> { impl<'a> Command<'a> {
@ -30,6 +32,7 @@ impl<'a> Command<'a> {
Self::StartTLS => "STARTTLS", Self::StartTLS => "STARTTLS",
Self::NetworkVersion => "NETVER", Self::NetworkVersion => "NETVER",
Self::Version => "VER", Self::Version => "VER",
Self::Logout => "LOGOUT",
} }
} }
@ -503,4 +506,9 @@ implement_action_commands! {
pub(crate) fn set_password(password: &str) { pub(crate) fn set_password(password: &str) {
Command::SetPassword(password) Command::SetPassword(password)
} }
/// Gracefully shuts down the connection.
pub(crate) fn logout() {
Command::Logout
}
} }

View file

@ -27,6 +27,12 @@ impl Connection {
Ok(conn) Ok(conn)
} }
/// Gracefully closes the connection.
pub async fn close(mut self) -> crate::Result<()> {
self.logout().await?;
Ok(())
}
/// Sends username and password, as applicable. /// Sends username and password, as applicable.
async fn login(&mut self, config: &Config) -> crate::Result<()> { async fn login(&mut self, config: &Config) -> crate::Result<()> {
if let Some(auth) = config.auth.clone() { if let Some(auth) = config.auth.clone() {

View file

@ -15,7 +15,7 @@ pub fn list_devices(config: Config, with_description: bool) -> anyhow::Result<()
} }
} }
Ok(()) logout(conn)
} }
pub fn print_variable(config: Config, ups_name: &str, variable: &str) -> anyhow::Result<()> { pub fn print_variable(config: Config, ups_name: &str, variable: &str) -> anyhow::Result<()> {
@ -24,7 +24,7 @@ pub fn print_variable(config: Config, ups_name: &str, variable: &str) -> anyhow:
let variable = conn.get_var(ups_name, variable)?; let variable = conn.get_var(ups_name, variable)?;
println!("{}", variable.value()); println!("{}", variable.value());
Ok(()) logout(conn)
} }
pub fn list_variables(config: Config, ups_name: &str) -> anyhow::Result<()> { pub fn list_variables(config: Config, ups_name: &str) -> anyhow::Result<()> {
@ -34,7 +34,7 @@ pub fn list_variables(config: Config, ups_name: &str) -> anyhow::Result<()> {
println!("{}", var); println!("{}", var);
} }
Ok(()) logout(conn)
} }
pub fn list_clients(config: Config, ups_name: &str) -> anyhow::Result<()> { pub fn list_clients(config: Config, ups_name: &str) -> anyhow::Result<()> {
@ -44,9 +44,13 @@ pub fn list_clients(config: Config, ups_name: &str) -> anyhow::Result<()> {
println!("{}", client_ip); println!("{}", client_ip);
} }
Ok(()) logout(conn)
} }
fn connect(config: Config) -> anyhow::Result<Connection> { fn connect(config: Config) -> anyhow::Result<Connection> {
Connection::new(&config).with_context(|| format!("Failed to connect to upsd: {:?}", &config)) Connection::new(&config).with_context(|| format!("Failed to connect to upsd: {:?}", &config))
} }
fn logout(conn: Connection) -> anyhow::Result<()> {
conn.close().with_context(|| "Failed to close gracefully")
}