diff --git a/peach-network/src/error.rs b/peach-network/src/error.rs index c332b0f..ebb4423 100644 --- a/peach-network/src/error.rs +++ b/peach-network/src/error.rs @@ -1,147 +1,95 @@ -use std::{error, io, str}; +use std::io; +use std::num::ParseIntError; +use io::Error as IoError; use jsonrpc_core::{types::error::Error as JsonRpcError, ErrorCode}; use probes::ProbeError; -use serde_json::error::Error as SerdeError; +use regex::Error as RegexError; +use serde_json::Error as SerdeError; +use wpactrl::WpaError; #[derive(Debug)] pub enum NetworkError { - Add { - ssid: String, - }, + Add { ssid: String }, - NoState { - iface: String, - source: io::Error, - }, + NoState { iface: String, source: IoError }, - Disable { - id: String, - iface: String, - }, + Disable { id: String, iface: String }, - Disconnect { - iface: String, - }, + Disconnect { iface: String }, - GenWpaPassphrase { - ssid: String, - source: io::Error, - }, + GenWpaPassphrase { ssid: String, source: IoError }, - GenWpaPassphraseWarning { - ssid: String, - err_msg: String, - }, + GenWpaPassphraseWarning { ssid: String, err_msg: String }, - Id { - ssid: String, - iface: String, - }, + Id { ssid: String, iface: String }, - NoIp { - iface: String, - source: io::Error, - }, + NoIp { iface: String, source: IoError }, - Rssi { - iface: String, - }, + Rssi { iface: String }, - RssiPercent { - iface: String, - }, + RssiPercent { iface: String }, - Ssid { - iface: String, - }, + Ssid { iface: String }, - State { - iface: String, - }, + State { iface: String }, - Status { - iface: String, - }, + Status { iface: String }, - Traffic { - iface: String, - }, + Traffic { iface: String }, SavedNetworks, - AvailableNetworks { - iface: String, - }, + AvailableNetworks { iface: String }, MissingParams(JsonRpcError), - Modify { - id: String, - iface: String, - }, + Modify { id: String, iface: String }, - Ip { - iface: String, - }, + Ip { iface: String }, - ParseString(std::num::ParseIntError), + ParseInt(ParseIntError), - NoTraffic { - iface: String, - source: ProbeError, - }, + NoTraffic { iface: String, source: ProbeError }, - Reassociate { - iface: String, - }, + Reassociate { iface: String }, Reconfigure, - Reconnect { - iface: String, - }, + Reconnect { iface: String }, - Regex(regex::Error), + Regex(RegexError), - Delete { - id: String, - iface: String, - }, + Delete { id: String, iface: String }, - WlanState(io::Error), + WlanState(IoError), - WlanOperstate(io::Error), + WlanOperstate(IoError), Save, - Connect { - id: String, - iface: String, - }, + Connect { id: String, iface: String }, - StartAp0(io::Error), + StartAp0(IoError), - StartWlan0(io::Error), + StartWlan0(IoError), SerdeSerialize(SerdeError), - WpaCtrlOpen(failure::Error), - - WpaCtrlRequest(failure::Error), + WpaCtrl(WpaError), } impl std::error::Error for NetworkError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { match *self { NetworkError::Add { .. } => None, - NetworkError::NoState { .., ref source } => Some(source), + NetworkError::NoState { ref source, .. } => Some(source), NetworkError::Disable { .. } => None, NetworkError::Disconnect { .. } => None, - NetworkError::GenWpaPassphrase { .., ref source } => Some(source), + NetworkError::GenWpaPassphrase { ref source, .. } => Some(source), NetworkError::GenWpaPassphraseWarning { .. } => None, NetworkError::Id { .. } => None, - NetworkError::NoIp { .., ref source } => Some(source), + NetworkError::NoIp { ref source, .. } => Some(source), NetworkError::Rssi { .. } => None, NetworkError::RssiPercent { .. } => None, NetworkError::Ssid { .. } => None, @@ -153,22 +101,21 @@ impl std::error::Error for NetworkError { NetworkError::MissingParams(ref source) => Some(source), NetworkError::Modify { .. } => None, NetworkError::Ip { .. } => None, - NetworkError::ParseString(ref source) => Some(source), - NetworkError::NoTraffic { .., ref source } => Some(source), + NetworkError::ParseInt(ref source) => Some(source), + NetworkError::NoTraffic { ref source, .. } => Some(source), NetworkError::Reassociate { .. } => None, NetworkError::Reconfigure { .. } => None, NetworkError::Reconnect { .. } => None, NetworkError::Regex(ref source) => Some(source), NetworkError::Delete { .. } => None, - NetworkError::WpaState(ref source) => Some(source), - NetworkError::WpaOperstate(ref source) => Some(source), + NetworkError::WlanState(ref source) => Some(source), + NetworkError::WlanOperstate(ref source) => Some(source), NetworkError::Save => None, NetworkError::Connect { .. } => None, NetworkError::StartWlan0(ref source) => Some(source), NetworkError::StartAp0(ref source) => Some(source), NetworkError::SerdeSerialize(ref source) => Some(source), - NetworkError::WpaCtrlOpen(ref source) => Some(source), - NetworkError::WpaCtrlRequest(ref source) => Some(source), + NetworkError::WpaCtrl(ref source) => Some(source), } } } @@ -178,122 +125,178 @@ impl std::fmt::Display for NetworkError { match *self { NetworkError::Add { ref ssid } => { write!(f, "Failed to add network for {}", ssid) - }, + } NetworkError::NoState { ref iface, .. } => { write!(f, "Failed to retrieve state for interface: {}", iface) - }, + } NetworkError::Disable { ref id, ref iface } => { - write!(f, "Failed to disable network {} for interface: {}", id, iface) - }, + write!( + f, + "Failed to disable network {} for interface: {}", + id, iface + ) + } NetworkError::Disconnect { ref iface } => { write!(f, "Failed to disconnect {}", iface) - }, + } NetworkError::GenWpaPassphrase { ref ssid, .. } => { write!(f, "Failed to generate wpa passphrase for {}", ssid) - }, - NetworkError::GenWpaPassphraseWarning { ref ssid, ref err_msg } => { - write!(f, "Failed to generate wpa passphrase for {}: {}", ssid, err_msg) - }, - NetworkError::Id { ref ssid, ref iface } => { - write!(f, "No ID found for {} on interface: {}: {}", ssid, iface) - }, + } + NetworkError::GenWpaPassphraseWarning { + ref ssid, + ref err_msg, + } => { + write!( + f, + "Failed to generate wpa passphrase for {}: {}", + ssid, err_msg + ) + } + NetworkError::Id { + ref ssid, + ref iface, + } => { + write!(f, "No ID found for {} on interface: {}", ssid, iface) + } NetworkError::NoIp { ref iface, .. } => { write!(f, "Could not access IP address for interface: {}", iface) - }, + } NetworkError::Rssi { ref iface } => { write!(f, "Could not find RSSI for interface: {}", iface) - }, + } NetworkError::RssiPercent { ref iface } => { - write!(f, "Could not find signal quality (%) for interface: {}", iface) - }, - NetworkError::Ssid { ref iface } => { + write!( + f, + "Could not find signal quality (%) for interface: {}", + iface + ) + } + NetworkError::Ssid { ref iface } => { write!(f, "Could not find SSID for interface: {}", iface) - }, + } NetworkError::State { ref iface } => { write!(f, "No state found for interface: {}", iface) - }, + } NetworkError::Status { ref iface } => { write!(f, "No status found for interface: {}", iface) - }, - NetworkError::Traffic { ref iface } => { - write!(f, "Could not find network traffice for interface: {}", iface) - }, - NetworkError::SavedNetworks => { - write!("No saved networks found for default interface") - }, - NetworkError::AvailableNetworks { ref iface } => { + } + NetworkError::Traffic { ref iface } => { + write!( + f, + "Could not find network traffice for interface: {}", + iface + ) + } + NetworkError::SavedNetworks => { + write!(f, "No saved networks found for default interface") + } + NetworkError::AvailableNetworks { ref iface } => { write!(f, "No networks found in range of interface: {}", iface) - }, - NetworkError::MissingParams(ref source) => { + } + NetworkError::MissingParams(ref source) => { write!(f, "Missing expected parameters: {}", source) - }, - NetworkError::Modify { ref id, ref iface } => { - write!(f, "Failed to set new password for network {} on {}", id, iface) - }, - NetworkError::Ip { ref iface } => { + } + NetworkError::Modify { ref id, ref iface } => { + write!( + f, + "Failed to set new password for network {} on {}", + id, iface + ) + } + NetworkError::Ip { ref iface } => { write!(f, "No IP found for interface: {}", iface) - }, - NetworkError::ParseString(_) => { - write!("Failed to parse integer from string for RSSI value") - }, - NetworkError::NoTraffic { ref id, .. } => { - write!("Failed to retrieve network traffic measurement for {}", id) - }, - NetworkError::Reassociate { ref iface } => { - write!(f, "Failed to reassociate with WiFi network for interface: {}", iface) - }, - NetworkError::Reconfigure => { - write!("Failed to force reread of wpa_supplicant configuration file") - }, - NetworkError::Reconnect { ref iface } => { - write!(f, "Failed to reconnect with WiFi network for interface: {}", iface) - }, - NetworkError::Regex(_) => { - write!("Regex command failed") - }, - NetworkError::Delete { ref id, ref iface } => { - write!(f, "Failed to delete network {} for interface: {}", id, iface) - }, - NetworkError::WpaState(_) => { - write!("Failed to retrieve state of wlan0 service") - }, - NetworkError::WpaOperstate(_) => { - write!("Failed to retrieve connection state of wlan0 interface") - }, - NetworkError::Save => { - write!("Failed to save configuration changes to file") - }, - NetworkError::Connect { ref id, ref iface } => { - write!(f, "Failed to connect to network {} for interface: {}", id, iface) - }, - NetworkError::StartWlan0(_) => { - write!("Failed to start ap0 service") - }, - NetworkError::StartAp0(_) => { - write!("Failed to start wlan0 service") - }, - NetworkError::SerdeSerialize(_) => { - write!("JSON serialization failed") - }, - NetworkError::WpaCtrlOpen(_) => { - write!("Failed to open control interface for wpasupplicant") - }, - NetworkError::WpaCtrlRequest(_) => { - write!("Request to wpasupplicant via wpactrl failed") - }, + } + NetworkError::ParseInt(_) => { + write!(f, "Failed to parse integer from string for RSSI value") + } + NetworkError::NoTraffic { ref iface, .. } => { + write!( + f, + "Failed to retrieve network traffic measurement for {}", + iface + ) + } + NetworkError::Reassociate { ref iface } => { + write!( + f, + "Failed to reassociate with WiFi network for interface: {}", + iface + ) + } + NetworkError::Reconfigure => { + write!( + f, + "Failed to force reread of wpa_supplicant configuration file" + ) + } + NetworkError::Reconnect { ref iface } => { + write!( + f, + "Failed to reconnect with WiFi network for interface: {}", + iface + ) + } + NetworkError::Regex(_) => write!(f, "Regex command failed"), + NetworkError::Delete { ref id, ref iface } => { + write!( + f, + "Failed to delete network {} for interface: {}", + id, iface + ) + } + NetworkError::WlanState(_) => write!(f, "Failed to retrieve state of wlan0 service"), + NetworkError::WlanOperstate(_) => { + write!(f, "Failed to retrieve connection state of wlan0 interface") + } + NetworkError::Save => write!(f, "Failed to save configuration changes to file"), + NetworkError::Connect { ref id, ref iface } => { + write!( + f, + "Failed to connect to network {} for interface: {}", + id, iface + ) + } + NetworkError::StartWlan0(_) => write!(f, "Failed to start ap0 service"), + NetworkError::StartAp0(_) => write!(f, "Failed to start wlan0 service"), + NetworkError::SerdeSerialize(_) => write!(f, "JSON serialization failed"), + NetworkError::WpaCtrl(_) => write!(f, "WpaCtrl command failed"), } } } -impl From for Error { +impl From for NetworkError { + fn from(err: SerdeError) -> Self { + NetworkError::SerdeSerialize(err) + } +} + +impl From for NetworkError { + fn from(err: WpaError) -> Self { + NetworkError::WpaCtrl(err) + } +} + +impl From for NetworkError { + fn from(err: ParseIntError) -> Self { + NetworkError::ParseInt(err) + } +} + +impl From for NetworkError { + fn from(err: RegexError) -> Self { + NetworkError::Regex(err) + } +} + +impl From for JsonRpcError { fn from(err: NetworkError) -> Self { match &err { - NetworkError::Add { ssid } => Error { + NetworkError::Add { ssid } => JsonRpcError { code: ErrorCode::ServerError(-32000), message: format!("Failed to add network for {}", ssid), data: None, }, - NetworkError::NoState { iface, source } => Error { + NetworkError::NoState { iface, source } => JsonRpcError { code: ErrorCode::ServerError(-32022), message: format!( "Failed to retrieve interface state for {}: {}", @@ -301,22 +304,22 @@ impl From for Error { ), data: None, }, - NetworkError::Disable { id, iface } => Error { + NetworkError::Disable { id, iface } => JsonRpcError { code: ErrorCode::ServerError(-32029), message: format!("Failed to disable network {} for {}", id, iface), data: None, }, - NetworkError::Disconnect { iface } => Error { + NetworkError::Disconnect { iface } => JsonRpcError { code: ErrorCode::ServerError(-32032), message: format!("Failed to disconnect {}", iface), data: None, }, - NetworkError::GenWpaPassphrase { ssid, source } => Error { + NetworkError::GenWpaPassphrase { ssid, source } => JsonRpcError { code: ErrorCode::ServerError(-32025), message: format!("Failed to generate wpa passphrase for {}: {}", ssid, source), data: None, }, - NetworkError::GenWpaPassphraseWarning { ssid, err_msg } => Error { + NetworkError::GenWpaPassphraseWarning { ssid, err_msg } => JsonRpcError { code: ErrorCode::ServerError(-32036), message: format!( "Failed to generate wpa passphrase for {}: {}", @@ -324,17 +327,17 @@ impl From for Error { ), data: None, }, - NetworkError::Id { iface, ssid } => Error { + NetworkError::Id { iface, ssid } => JsonRpcError { code: ErrorCode::ServerError(-32026), message: format!("No ID found for {} on interface {}", ssid, iface), data: None, }, - NetworkError::NoIp { iface, source } => Error { + NetworkError::NoIp { iface, source } => JsonRpcError { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve IP address for {}: {}", iface, source), data: None, }, - NetworkError::Rssi { iface } => Error { + NetworkError::Rssi { iface } => JsonRpcError { code: ErrorCode::ServerError(-32002), message: format!( "Failed to retrieve RSSI for {}. Interface may not be connected", @@ -342,7 +345,7 @@ impl From for Error { ), data: None, }, - NetworkError::RssiPercent { iface } => Error { + NetworkError::RssiPercent { iface } => JsonRpcError { code: ErrorCode::ServerError(-32034), message: format!( "Failed to retrieve signal quality (%) for {}. Interface may not be connected", @@ -350,7 +353,7 @@ impl From for Error { ), data: None, }, - NetworkError::Ssid { iface } => Error { + NetworkError::Ssid { iface } => JsonRpcError { code: ErrorCode::ServerError(-32003), message: format!( "Failed to retrieve SSID for {}. Interface may not be connected", @@ -358,17 +361,17 @@ impl From for Error { ), data: None, }, - NetworkError::State { iface } => Error { + NetworkError::State { iface } => JsonRpcError { code: ErrorCode::ServerError(-32023), message: format!("No state found for {}. Interface may not exist", iface), data: None, }, - NetworkError::Status { iface } => Error { + NetworkError::Status { iface } => JsonRpcError { code: ErrorCode::ServerError(-32024), message: format!("No status found for {}. Interface may not exist", iface), data: None, }, - NetworkError::Traffic { iface } => Error { + NetworkError::Traffic { iface } => JsonRpcError { code: ErrorCode::ServerError(-32004), message: format!( "No network traffic statistics found for {}. Interface may not exist", @@ -376,28 +379,28 @@ impl From for Error { ), data: None, }, - NetworkError::SavedNetworks => Error { + NetworkError::SavedNetworks => JsonRpcError { code: ErrorCode::ServerError(-32005), message: "No saved networks found".to_string(), data: None, }, - NetworkError::AvailableNetworks { iface } => Error { + NetworkError::AvailableNetworks { iface } => JsonRpcError { code: ErrorCode::ServerError(-32006), message: format!("No networks found in range of {}", iface), data: None, }, NetworkError::MissingParams(e) => e.clone(), - NetworkError::Modify { id, iface } => Error { + NetworkError::Modify { id, iface } => JsonRpcError { code: ErrorCode::ServerError(-32033), message: format!("Failed to set new password for network {} on {}", id, iface), data: None, }, - NetworkError::Ip { iface } => Error { + NetworkError::Ip { iface } => JsonRpcError { code: ErrorCode::ServerError(-32007), message: format!("No IP address found for {}", iface), data: None, }, - NetworkError::ParseString { source } => Error { + NetworkError::ParseInt(source) => JsonRpcError { code: ErrorCode::ServerError(-32035), message: format!( "Failed to parse integer from string for RSSI value: {}", @@ -405,7 +408,7 @@ impl From for Error { ), data: None, }, - NetworkError::NoTraffic { iface, source } => Error { + NetworkError::NoTraffic { iface, source } => JsonRpcError { code: ErrorCode::ServerError(-32015), message: format!( "Failed to retrieve network traffic statistics for {}: {}", @@ -413,37 +416,37 @@ impl From for Error { ), data: None, }, - NetworkError::Reassociate { iface } => Error { + NetworkError::Reassociate { iface } => JsonRpcError { code: ErrorCode::ServerError(-32008), message: format!("Failed to reassociate with WiFi network for {}", iface), data: None, }, - NetworkError::Reconfigure => Error { + NetworkError::Reconfigure => JsonRpcError { code: ErrorCode::ServerError(-32030), message: "Failed to force reread of wpa_supplicant configuration file".to_string(), data: None, }, - NetworkError::Reconnect { iface } => Error { + NetworkError::Reconnect { iface } => JsonRpcError { code: ErrorCode::ServerError(-32009), message: format!("Failed to reconnect with WiFi network for {}", iface), data: None, }, - NetworkError::Regex { source } => Error { + NetworkError::Regex(source) => JsonRpcError { code: ErrorCode::ServerError(-32010), message: format!("Regex command error: {}", source), data: None, }, - NetworkError::Delete { id, iface } => Error { + NetworkError::Delete { id, iface } => JsonRpcError { code: ErrorCode::ServerError(-32028), message: format!("Failed to delete network {} for {}", id, iface), data: None, }, - NetworkError::WlanState { source } => Error { + NetworkError::WlanState(source) => JsonRpcError { code: ErrorCode::ServerError(-32011), message: format!("Failed to retrieve state of wlan0 service: {}", source), data: None, }, - NetworkError::WlanOperstate { source } => Error { + NetworkError::WlanOperstate(source) => JsonRpcError { code: ErrorCode::ServerError(-32021), message: format!( "Failed to retrieve connection state of wlan0 interface: {}", @@ -451,42 +454,34 @@ impl From for Error { ), data: None, }, - NetworkError::Save => Error { + NetworkError::Save => JsonRpcError { code: ErrorCode::ServerError(-32031), message: "Failed to save configuration changes to file".to_string(), data: None, }, - NetworkError::Connect { id, iface } => Error { + NetworkError::Connect { id, iface } => JsonRpcError { code: ErrorCode::ServerError(-32027), message: format!("Failed to connect to network {} for {}", id, iface), data: None, }, - NetworkError::StartAp0 { source } => Error { + NetworkError::StartAp0(source) => JsonRpcError { code: ErrorCode::ServerError(-32016), message: format!("Failed to start ap0 service: {}", source), data: None, }, - NetworkError::StartWlan0 { source } => Error { + NetworkError::StartWlan0(source) => JsonRpcError { code: ErrorCode::ServerError(-32018), message: format!("Failed to start wlan0 service: {}", source), data: None, }, - NetworkError::SerdeSerialize { source } => Error { + NetworkError::SerdeSerialize(source) => JsonRpcError { code: ErrorCode::ServerError(-32012), message: format!("JSON serialization failed: {}", source), data: None, }, - NetworkError::WpaCtrlOpen { source } => Error { + NetworkError::WpaCtrl(source) => JsonRpcError { code: ErrorCode::ServerError(-32013), - message: format!( - "Failed to open control interface for wpasupplicant: {}", - source - ), - data: None, - }, - NetworkError::WpaCtrlRequest { source } => Error { - code: ErrorCode::ServerError(-32014), - message: format!("WPA supplicant request failed: {}", source), + message: format!("WPA control interface failure: {}", source), data: None, }, } diff --git a/peach-network/src/lib.rs b/peach-network/src/lib.rs index 88155f0..c4d0d3b 100644 --- a/peach-network/src/lib.rs +++ b/peach-network/src/lib.rs @@ -25,11 +25,11 @@ use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation, ServerBui use log::info; use serde_json::json; -use crate::error::{BoxError, NetworkError}; +use crate::error::NetworkError; use crate::network::{Iface, IfaceId, IfaceIdPass, IfaceSsid, WiFi}; /// Create JSON-RPC I/O handler, add RPC methods and launch HTTP server. -pub fn run() -> Result<(), BoxError> { +pub fn run() -> Result<(), NetworkError> { info!("Starting up."); info!("Creating JSON-RPC I/O handler."); @@ -47,7 +47,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::AvailableNetworks { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -62,7 +62,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Id { iface, ssid })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -76,7 +76,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Ip { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -92,7 +92,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Rssi { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -106,7 +106,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::RssiPercent { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -128,7 +128,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Ssid { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -142,7 +142,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::State { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -159,7 +159,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Status { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -173,7 +173,7 @@ pub fn run() -> Result<(), BoxError> { None => Err(Error::from(NetworkError::Traffic { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -198,7 +198,7 @@ pub fn run() -> Result<(), BoxError> { Ok(_) => Ok(Value::String("success".to_string())), Err(e) => Err(Error::from(e)), }, - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -219,7 +219,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Delete { id, iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -234,7 +234,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Disable { id, iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -248,7 +248,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Disconnect { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -264,7 +264,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Modify { iface, id })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -278,7 +278,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Reassociate { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -297,7 +297,7 @@ pub fn run() -> Result<(), BoxError> { Err(_) => Err(Error::from(NetworkError::Reconnect { iface })), } } - Err(e) => Err(Error::from(NetworkError::MissingParams { e })), + Err(e) => Err(Error::from(NetworkError::MissingParams(e))), } }); @@ -374,7 +374,7 @@ mod tests { message: String::from("Parse error"), data: None, }; - Err(Error::from(NetworkError::MissingParams { e })) + Err(Error::from(NetworkError::MissingParams(e))) }); test_rpc::Rpc::from(io) }; @@ -689,7 +689,7 @@ mod tests { ), data: None, }; - Err(Error::from(NetworkError::MissingParams { e })) + Err(Error::from(NetworkError::MissingParams(e))) }); test_rpc::Rpc::from(io) }; diff --git a/peach-network/src/network.rs b/peach-network/src/network.rs index 6373a3b..e579729 100644 --- a/peach-network/src/network.rs +++ b/peach-network/src/network.rs @@ -121,10 +121,7 @@ pub struct WiFi { // TODO: wrap this into a helper function: // // let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); -// let mut wpa = wpactrl::WpaCtrl::new() -// .ctrl_path(wpa_path) -// .open() -// .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; +// let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; /* GET - Methods for retrieving data */ @@ -146,13 +143,9 @@ pub struct WiFi { /// pub fn available_networks(iface: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; - wpa.request("SCAN") - .map_err(|source| NetworkError::WpaCtrlRequest(source.compat()))?; - let networks = wpa.request("SCAN_RESULTS").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + wpa.request("SCAN")?; + let networks = wpa.request("SCAN_RESULTS")?; let mut scan = Vec::new(); for network in networks.lines() { let v: Vec<&str> = network.split('\t').collect(); @@ -183,7 +176,7 @@ pub fn available_networks(iface: &str) -> Result, NetworkError> { if scan.is_empty() { Ok(None) } else { - let results = serde_json::to_string(&scan).context(SerdeSerialize)?; + let results = serde_json::to_string(&scan)?; Ok(Some(results)) } } @@ -206,13 +199,8 @@ pub fn available_networks(iface: &str) -> Result, NetworkError> { /// pub fn id(iface: &str, ssid: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; - let networks = wpa - .request("LIST_NETWORKS") - .map_err(|source| NetworkError::WpaCtrlRequest(source.compat()))?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + let networks = wpa.request("LIST_NETWORKS")?; let mut id = Vec::new(); for network in networks.lines() { let v: Vec<&str> = network.split('\t').collect(); @@ -246,7 +234,10 @@ pub fn id(iface: &str, ssid: &str) -> Result, NetworkError> { /// pub fn ip(iface: &str) -> Result, NetworkError> { let net_if: String = iface.to_string(); - let ifaces = get_if_addrs::get_if_addrs().map_err(|_| NetworkError::NoIp { iface: net_if })?; + let ifaces = get_if_addrs::get_if_addrs().map_err(|source| NetworkError::NoIp { + iface: net_if, + source, + })?; let ip = ifaces .iter() .find(|&i| i.name == iface) @@ -272,11 +263,8 @@ pub fn ip(iface: &str) -> Result, NetworkError> { /// pub fn rssi(iface: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; - let status = wpa.request("SIGNAL_POLL").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + let status = wpa.request("SIGNAL_POLL")?; let rssi = utils::regex_finder(r"RSSI=(.*)\n", &status)?; if rssi.is_none() { @@ -304,17 +292,14 @@ pub fn rssi(iface: &str) -> Result, NetworkError> { /// pub fn rssi_percent(iface: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; - let status = wpa.request("SIGNAL_POLL").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + let status = wpa.request("SIGNAL_POLL")?; let rssi = utils::regex_finder(r"RSSI=(.*)\n", &status)?; match rssi { Some(rssi) => { // parse the string to a signed integer (for math) - let rssi_parsed = rssi.parse::().context(ParseString)?; + let rssi_parsed = rssi.parse::()?; // perform rssi (dBm) to quality (%) conversion let quality_percent = 2 * (rssi_parsed + 100); // convert signal quality integer to string @@ -342,10 +327,8 @@ pub fn rssi_percent(iface: &str) -> Result, NetworkError> { /// sent to the caller. /// pub fn saved_networks() -> Result, NetworkError> { - let mut wpa = wpactrl::WpaCtrl::new() - .open() - .map_err(|source| NetworkError::WpaCtrlOpen(source.compat()))?; - let networks = wpa.request("LIST_NETWORKS").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().open()?; + let networks = wpa.request("LIST_NETWORKS")?; let mut ssids = Vec::new(); for network in networks.lines() { let v: Vec<&str> = network.split('\t').collect(); @@ -360,7 +343,7 @@ pub fn saved_networks() -> Result, NetworkError> { if ssids.is_empty() { Ok(None) } else { - let results = serde_json::to_string(&ssids).context(SerdeSerialize)?; + let results = serde_json::to_string(&ssids)?; Ok(Some(results)) } } @@ -381,11 +364,8 @@ pub fn saved_networks() -> Result, NetworkError> { /// pub fn ssid(iface: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; - let status = wpa.request("STATUS").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + let status = wpa.request("STATUS")?; // pass the regex pattern and status output to the regex finder let ssid = utils::regex_finder(r"\nssid=(.*)\n", &status)?; @@ -413,7 +393,10 @@ pub fn state(iface: &str) -> Result, NetworkError> { let output = Command::new("cat") .arg(iface_path) .output() - .context(NoState { iface })?; + .map_err(|source| NetworkError::NoState { + iface: iface.to_string(), + source, + })?; if !output.stdout.is_empty() { // unwrap the command result and convert to String let mut state = String::from_utf8(output.stdout).unwrap(); @@ -442,11 +425,8 @@ pub fn state(iface: &str) -> Result, NetworkError> { /// pub fn status(iface: &str) -> Result, NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; - let wpa_status = wpa.request("STATUS").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + let wpa_status = wpa.request("STATUS")?; // pass the regex pattern and status output to the regex finder let state = utils::regex_finder(r"wpa_state=(.*)\n", &wpa_status)?; @@ -504,7 +484,10 @@ pub fn status(iface: &str) -> Result, NetworkError> { /// response is sent to the caller. /// pub fn traffic(iface: &str) -> Result, NetworkError> { - let network = network::read().context(NoTraffic { iface })?; + let network = network::read().map_err(|source| NetworkError::NoTraffic { + iface: iface.to_string(), + source, + })?; // iterate through interfaces returned in network data for (interface, traffic) in network.interfaces { if interface == iface { @@ -515,7 +498,7 @@ pub fn traffic(iface: &str) -> Result, NetworkError> { transmitted, }; // TODO: add test for SerdeSerialize error - let t = serde_json::to_string(&traffic).context(SerdeSerialize)?; + let t = serde_json::to_string(&traffic)?; return Ok(Some(t)); } } @@ -540,7 +523,7 @@ pub fn activate_ap() -> Result<(), NetworkError> { .arg("start") .arg("wpa_supplicant@ap0.service") .output() - .context(StartAp0)?; + .map_err(NetworkError::StartAp0)?; Ok(()) } @@ -560,7 +543,7 @@ pub fn activate_client() -> Result<(), NetworkError> { .arg("start") .arg("wpa_supplicant@wlan0.service") .output() - .context(StartWlan0)?; + .map_err(NetworkError::StartWlan0)?; Ok(()) } @@ -585,7 +568,10 @@ pub fn add(wifi: &WiFi) -> Result<(), NetworkError> { .arg(&wifi.pass) .stdout(Stdio::piped()) .output() - .context(GenWpaPassphrase { ssid: &wifi.ssid })?; + .map_err(|source| NetworkError::GenWpaPassphrase { + ssid: wifi.ssid.to_string(), + source, + })?; // prepend newline to wpa_details to safeguard against malformed supplicant let mut wpa_details = "\n".as_bytes().to_vec(); @@ -630,7 +616,7 @@ pub fn check_iface() -> Result<(), NetworkError> { .arg("is-active") .arg("wpa_supplicant@wlan0.service") .status() - .context(WlanState)?; + .map_err(NetworkError::WlanState)?; // returns the current state of the wlan0 interface let iface_state = state("wlan0")?; @@ -666,12 +652,9 @@ pub fn check_iface() -> Result<(), NetworkError> { /// pub fn connect(id: &str, iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; let select = format!("SELECT {}", id); - wpa.request(&select).context(WpaCtrlRequest)?; + wpa.request(&select)?; Ok(()) } @@ -691,12 +674,9 @@ pub fn connect(id: &str, iface: &str) -> Result<(), NetworkError> { /// pub fn delete(id: &str, iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; let remove = format!("REMOVE_NETWORK {}", id); - wpa.request(&remove).context(WpaCtrlRequest)?; + wpa.request(&remove)?; Ok(()) } @@ -715,12 +695,9 @@ pub fn delete(id: &str, iface: &str) -> Result<(), NetworkError> { /// pub fn disable(id: &str, iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; let disable = format!("DISABLE_NETWORK {}", id); - wpa.request(&disable).context(WpaCtrlRequest)?; + wpa.request(&disable)?; Ok(()) } @@ -738,12 +715,9 @@ pub fn disable(id: &str, iface: &str) -> Result<(), NetworkError> { /// pub fn disconnect(iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; let disconnect = "DISCONNECT".to_string(); - wpa.request(&disconnect).context(WpaCtrlRequest)?; + wpa.request(&disconnect)?; Ok(()) } @@ -763,12 +737,9 @@ pub fn disconnect(iface: &str) -> Result<(), NetworkError> { /// pub fn modify(id: &str, iface: &str, pass: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; let new_pass = format!("NEW_PASSWORD {} {}", id, pass); - wpa.request(&new_pass).context(WpaCtrlRequest)?; + wpa.request(&new_pass)?; Ok(()) } @@ -786,11 +757,8 @@ pub fn modify(id: &str, iface: &str, pass: &str) -> Result<(), NetworkError> { /// pub fn reassociate(iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; - wpa.request("REASSOCIATE").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + wpa.request("REASSOCIATE")?; Ok(()) } @@ -804,8 +772,8 @@ pub fn reassociate(iface: &str) -> Result<(), NetworkError> { /// caller. /// pub fn reconfigure() -> Result<(), NetworkError> { - let mut wpa = wpactrl::WpaCtrl::new().open().context(WpaCtrlOpen)?; - wpa.request("RECONFIGURE").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().open()?; + wpa.request("RECONFIGURE")?; Ok(()) } @@ -823,12 +791,9 @@ pub fn reconfigure() -> Result<(), NetworkError> { /// pub fn reconnect(iface: &str) -> Result<(), NetworkError> { let wpa_path: String = format!("/var/run/wpa_supplicant/{}", iface); - let mut wpa = wpactrl::WpaCtrl::new() - .ctrl_path(wpa_path) - .open() - .context(WpaCtrlOpen)?; - wpa.request("DISCONNECT").context(WpaCtrlRequest)?; - wpa.request("RECONNECT").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().ctrl_path(wpa_path).open()?; + wpa.request("DISCONNECT")?; + wpa.request("RECONNECT")?; Ok(()) } @@ -841,7 +806,7 @@ pub fn reconnect(iface: &str) -> Result<(), NetworkError> { /// appropriate JSON RPC response is sent to the caller. /// pub fn save() -> Result<(), NetworkError> { - let mut wpa = wpactrl::WpaCtrl::new().open().context(WpaCtrlOpen)?; - wpa.request("SAVE_CONFIG").context(WpaCtrlRequest)?; + let mut wpa = wpactrl::WpaCtrl::builder().open()?; + wpa.request("SAVE_CONFIG")?; Ok(()) } diff --git a/peach-network/src/utils.rs b/peach-network/src/utils.rs index e82b7aa..6c381eb 100644 --- a/peach-network/src/utils.rs +++ b/peach-network/src/utils.rs @@ -1,7 +1,6 @@ use regex::Regex; -use snafu::ResultExt; -use crate::error::*; +use crate::error::NetworkError; /// Return matches for a given Regex pattern and text /// @@ -11,7 +10,7 @@ use crate::error::*; /// * `text` - A string slice containing the text to be matched on /// pub fn regex_finder(pattern: &str, text: &str) -> Result, NetworkError> { - let re = Regex::new(pattern).context(Regex)?; + let re = Regex::new(pattern)?; let caps = re.captures(text); let result = caps.map(|caps| caps[1].to_string());