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