peach-workspace/peach-network/src/error.rs

490 lines
18 KiB
Rust
Raw Normal View History

2021-12-01 12:26:30 +00:00
use std::io;
use std::num::ParseIntError;
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
use io::Error as IoError;
2021-11-30 11:48:16 +00:00
use jsonrpc_core::{types::error::Error as JsonRpcError, ErrorCode};
2021-08-06 17:58:40 +00:00
use probes::ProbeError;
2021-12-01 12:26:30 +00:00
use regex::Error as RegexError;
use serde_json::Error as SerdeError;
use wpactrl::WpaError;
2021-08-06 17:58:40 +00:00
2021-11-30 11:48:16 +00:00
#[derive(Debug)]
2021-08-06 17:58:40 +00:00
pub enum NetworkError {
2021-12-01 12:26:30 +00:00
Add { ssid: String },
NoState { iface: String, source: IoError },
Disable { id: String, iface: String },
Disconnect { iface: String },
GenWpaPassphrase { ssid: String, source: IoError },
GenWpaPassphraseWarning { ssid: String, err_msg: String },
Id { ssid: String, iface: String },
NoIp { iface: String, source: IoError },
Rssi { iface: String },
RssiPercent { iface: String },
Ssid { iface: String },
State { iface: String },
Status { iface: String },
Traffic { iface: String },
2021-08-06 17:58:40 +00:00
SavedNetworks,
2021-12-01 12:26:30 +00:00
AvailableNetworks { iface: String },
2021-08-06 17:58:40 +00:00
2021-11-30 11:48:16 +00:00
MissingParams(JsonRpcError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
Modify { id: String, iface: String },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
Ip { iface: String },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
ParseInt(ParseIntError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
NoTraffic { iface: String, source: ProbeError },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
Reassociate { iface: String },
2021-08-06 17:58:40 +00:00
Reconfigure,
2021-12-01 12:26:30 +00:00
Reconnect { iface: String },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
Regex(RegexError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
Delete { id: String, iface: String },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
WlanState(IoError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
WlanOperstate(IoError),
2021-08-06 17:58:40 +00:00
Save,
2021-12-01 12:26:30 +00:00
Connect { id: String, iface: String },
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
StartAp0(IoError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
StartWlan0(IoError),
2021-08-06 17:58:40 +00:00
2021-11-30 11:48:16 +00:00
SerdeSerialize(SerdeError),
2021-08-06 17:58:40 +00:00
2021-12-01 12:26:30 +00:00
WpaCtrl(WpaError),
2021-11-30 11:48:16 +00:00
}
impl std::error::Error for NetworkError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match *self {
NetworkError::Add { .. } => None,
2021-12-01 12:26:30 +00:00
NetworkError::NoState { ref source, .. } => Some(source),
2021-11-30 11:48:16 +00:00
NetworkError::Disable { .. } => None,
NetworkError::Disconnect { .. } => None,
2021-12-01 12:26:30 +00:00
NetworkError::GenWpaPassphrase { ref source, .. } => Some(source),
2021-11-30 11:48:16 +00:00
NetworkError::GenWpaPassphraseWarning { .. } => None,
NetworkError::Id { .. } => None,
2021-12-01 12:26:30 +00:00
NetworkError::NoIp { ref source, .. } => Some(source),
2021-11-30 11:48:16 +00:00
NetworkError::Rssi { .. } => None,
NetworkError::RssiPercent { .. } => None,
NetworkError::Ssid { .. } => None,
NetworkError::State { .. } => None,
NetworkError::Status { .. } => None,
NetworkError::Traffic { .. } => None,
NetworkError::SavedNetworks => None,
NetworkError::AvailableNetworks { .. } => None,
NetworkError::MissingParams(ref source) => Some(source),
NetworkError::Modify { .. } => None,
NetworkError::Ip { .. } => None,
2021-12-01 12:26:30 +00:00
NetworkError::ParseInt(ref source) => Some(source),
NetworkError::NoTraffic { ref source, .. } => Some(source),
2021-11-30 11:48:16 +00:00
NetworkError::Reassociate { .. } => None,
NetworkError::Reconfigure { .. } => None,
NetworkError::Reconnect { .. } => None,
NetworkError::Regex(ref source) => Some(source),
NetworkError::Delete { .. } => None,
2021-12-01 12:26:30 +00:00
NetworkError::WlanState(ref source) => Some(source),
NetworkError::WlanOperstate(ref source) => Some(source),
2021-11-30 11:48:16 +00:00
NetworkError::Save => None,
NetworkError::Connect { .. } => None,
NetworkError::StartWlan0(ref source) => Some(source),
NetworkError::StartAp0(ref source) => Some(source),
NetworkError::SerdeSerialize(ref source) => Some(source),
2021-12-01 12:26:30 +00:00
NetworkError::WpaCtrl(ref source) => Some(source),
2021-11-30 11:48:16 +00:00
}
}
}
impl std::fmt::Display for NetworkError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
NetworkError::Add { ref ssid } => {
write!(f, "Failed to add network for {}", ssid)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::NoState { ref iface, .. } => {
write!(f, "Failed to retrieve state for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::Disable { ref id, ref iface } => {
2021-12-01 12:26:30 +00:00
write!(
f,
"Failed to disable network {} for interface: {}",
id, iface
)
}
2021-11-30 11:48:16 +00:00
NetworkError::Disconnect { ref iface } => {
write!(f, "Failed to disconnect {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::GenWpaPassphrase { ref ssid, .. } => {
write!(f, "Failed to generate wpa passphrase for {}", ssid)
2021-12-01 12:26:30 +00:00
}
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)
}
2021-11-30 11:48:16 +00:00
NetworkError::NoIp { ref iface, .. } => {
write!(f, "Could not access IP address for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::Rssi { ref iface } => {
write!(f, "Could not find RSSI for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::RssiPercent { ref iface } => {
2021-12-01 12:26:30 +00:00
write!(
f,
"Could not find signal quality (%) for interface: {}",
iface
)
}
NetworkError::Ssid { ref iface } => {
2021-11-30 11:48:16 +00:00
write!(f, "Could not find SSID for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::State { ref iface } => {
write!(f, "No state found for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
2021-11-30 11:48:16 +00:00
NetworkError::Status { ref iface } => {
write!(f, "No status found for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
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 } => {
2021-11-30 11:48:16 +00:00
write!(f, "No networks found in range of interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
NetworkError::MissingParams(ref source) => {
2021-11-30 11:48:16 +00:00
write!(f, "Missing expected parameters: {}", source)
2021-12-01 12:26:30 +00:00
}
NetworkError::Modify { ref id, ref iface } => {
write!(
f,
"Failed to set new password for network {} on {}",
id, iface
)
}
NetworkError::Ip { ref iface } => {
2021-11-30 11:48:16 +00:00
write!(f, "No IP found for interface: {}", iface)
2021-12-01 12:26:30 +00:00
}
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"),
2021-11-30 11:48:16 +00:00
}
}
2021-08-06 17:58:40 +00:00
}
2021-12-01 12:26:30 +00:00
impl From<SerdeError> for NetworkError {
fn from(err: SerdeError) -> Self {
NetworkError::SerdeSerialize(err)
}
}
impl From<WpaError> for NetworkError {
fn from(err: WpaError) -> Self {
NetworkError::WpaCtrl(err)
}
}
impl From<ParseIntError> for NetworkError {
fn from(err: ParseIntError) -> Self {
NetworkError::ParseInt(err)
}
}
impl From<RegexError> for NetworkError {
fn from(err: RegexError) -> Self {
NetworkError::Regex(err)
}
}
impl From<NetworkError> for JsonRpcError {
2021-08-06 17:58:40 +00:00
fn from(err: NetworkError) -> Self {
match &err {
2021-12-01 12:26:30 +00:00
NetworkError::Add { ssid } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32000),
message: format!("Failed to add network for {}", ssid),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::NoState { iface, source } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32022),
message: format!(
"Failed to retrieve interface state for {}: {}",
iface, source
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Disable { id, iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32029),
message: format!("Failed to disable network {} for {}", id, iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Disconnect { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32032),
message: format!("Failed to disconnect {}", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::GenWpaPassphrase { ssid, source } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32025),
message: format!("Failed to generate wpa passphrase for {}: {}", ssid, source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::GenWpaPassphraseWarning { ssid, err_msg } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32036),
message: format!(
"Failed to generate wpa passphrase for {}: {}",
ssid, err_msg
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Id { iface, ssid } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32026),
message: format!("No ID found for {} on interface {}", ssid, iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::NoIp { iface, source } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32001),
message: format!("Failed to retrieve IP address for {}: {}", iface, source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Rssi { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32002),
message: format!(
"Failed to retrieve RSSI for {}. Interface may not be connected",
iface
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::RssiPercent { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32034),
message: format!(
"Failed to retrieve signal quality (%) for {}. Interface may not be connected",
iface
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Ssid { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32003),
message: format!(
"Failed to retrieve SSID for {}. Interface may not be connected",
iface
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::State { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32023),
message: format!("No state found for {}. Interface may not exist", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Status { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32024),
message: format!("No status found for {}. Interface may not exist", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Traffic { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32004),
message: format!(
"No network traffic statistics found for {}. Interface may not exist",
iface
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::SavedNetworks => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32005),
message: "No saved networks found".to_string(),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::AvailableNetworks { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32006),
message: format!("No networks found in range of {}", iface),
data: None,
},
2021-11-30 11:48:16 +00:00
NetworkError::MissingParams(e) => e.clone(),
2021-12-01 12:26:30 +00:00
NetworkError::Modify { id, iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32033),
message: format!("Failed to set new password for network {} on {}", id, iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Ip { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32007),
message: format!("No IP address found for {}", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::ParseInt(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32035),
message: format!(
"Failed to parse integer from string for RSSI value: {}",
source
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::NoTraffic { iface, source } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32015),
message: format!(
"Failed to retrieve network traffic statistics for {}: {}",
iface, source
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Reassociate { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32008),
message: format!("Failed to reassociate with WiFi network for {}", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Reconfigure => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32030),
message: "Failed to force reread of wpa_supplicant configuration file".to_string(),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Reconnect { iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32009),
message: format!("Failed to reconnect with WiFi network for {}", iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Regex(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32010),
message: format!("Regex command error: {}", source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Delete { id, iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32028),
message: format!("Failed to delete network {} for {}", id, iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::WlanState(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32011),
message: format!("Failed to retrieve state of wlan0 service: {}", source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::WlanOperstate(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32021),
message: format!(
"Failed to retrieve connection state of wlan0 interface: {}",
source
),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Save => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32031),
message: "Failed to save configuration changes to file".to_string(),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::Connect { id, iface } => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32027),
message: format!("Failed to connect to network {} for {}", id, iface),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::StartAp0(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32016),
message: format!("Failed to start ap0 service: {}", source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::StartWlan0(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32018),
message: format!("Failed to start wlan0 service: {}", source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::SerdeSerialize(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32012),
message: format!("JSON serialization failed: {}", source),
data: None,
},
2021-12-01 12:26:30 +00:00
NetworkError::WpaCtrl(source) => JsonRpcError {
2021-08-06 17:58:40 +00:00
code: ErrorCode::ServerError(-32013),
2021-12-01 12:26:30 +00:00
message: format!("WPA control interface failure: {}", source),
2021-08-06 17:58:40 +00:00
data: None,
},
}
}
}