Feat(WifiStatus)): Check Fi Status
This commit is contained in:
@@ -4,4 +4,3 @@ version = "0.1.0"
|
|||||||
authors = ["Tochukwu Nkemdilim <[email protected]>"]
|
authors = ["Tochukwu Nkemdilim <[email protected]>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tempfile = "3.0.2"
|
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
# WiFi-rs
|
||||||
|
|
||||||
|
A rust crate to interface and manage Wi-Fi networks.
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
|
||||||
|
- The command creates a new connection and then activates it on a device.
|
||||||
|
- This is a command-line counterpart of clicking an SSID in a GUI client.
|
||||||
|
- The command always creates a new connection and thus it is mainly useful for connecting to new Wi-Fi networks.
|
||||||
|
- If a connection for the network already exists, it is better to bring up (activate) the existing connection as follows: `WiFi::connection_up("SSID")`.
|
||||||
|
|
||||||
|
## Currently supported network types
|
||||||
|
|
||||||
|
Note that only **open**, **WEP** and **WPA-PSK** networks are supported at the moment.
|
||||||
|
|
||||||
|
> It is also supposed that IP configuration is obtained via DHCP.
|
||||||
|
|
||||||
|
## Supported Operating Systems
|
||||||
|
|
||||||
|
- Windows
|
||||||
|
- Linux
|
||||||
|
- OSx
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```RUST
|
||||||
|
extern crate wifi_rs;
|
||||||
|
use wifi_rs::{WiFi, Config, NetworkError};
|
||||||
|
|
||||||
|
fn main() -> Result<(), NetworkError> {
|
||||||
|
let config = Some(Config {
|
||||||
|
interface: Some("wlo1"), // interface : None would default to `wlan0`.
|
||||||
|
});
|
||||||
|
|
||||||
|
let wifi = WiFi::new("AndroidAPSD", config)?;
|
||||||
|
|
||||||
|
match wifi.connect("belm4235") {
|
||||||
|
Ok(result) => println!(
|
||||||
|
"{}",
|
||||||
|
if result == true {
|
||||||
|
"Connection Successfull."
|
||||||
|
} else {
|
||||||
|
"Invalid password."
|
||||||
|
}
|
||||||
|
),
|
||||||
|
Err(err) => println!("The following error occurred: {:?}", err),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## To do
|
||||||
|
|
||||||
|
- [x] Bundle windows profile sample as literals
|
||||||
|
- [x] Add support for Windows
|
||||||
|
- [x] Add support for linux
|
||||||
|
- [x] Add disconnect feature
|
||||||
|
- [ ] Use `tempfile` crate on windows to generate windows profile temporary file.
|
||||||
|
- [ ] Add support for OSX
|
||||||
|
- [ ] Fix the implementation for `check_if_wifi_is_enabled` for windows.
|
||||||
|
- [ ] Add get network type feature
|
||||||
|
- [ ] Add create hotspot functionality
|
||||||
|
- [ ] Write documentation
|
||||||
|
- [ ] Write tests
|
||||||
|
- [ ] Add multi-threaded support
|
||||||
|
|
||||||
|
# Contribution
|
||||||
|
|
||||||
|
Any feature you feel is missing, why not send in a Pull Request, and let's help make this project better. Or are there any bugs, kindly create an issue, so we could work towards fixing it.
|
||||||
|
|
||||||
|
# Support
|
||||||
|
|
||||||
|
Love this project, and you'll love to buy me a coffee, kindly visit:
|
||||||
@@ -46,7 +46,7 @@ fn main() -> Result<(), io::Error> {
|
|||||||
let ssid = matches.value_of("ssid").unwrap();
|
let ssid = matches.value_of("ssid").unwrap();
|
||||||
|
|
||||||
// Get Wireless Interface
|
// Get Wireless Interface
|
||||||
let ssid = matches.value_of("ssid").unwrap();
|
let interface = matches.value_of("interface").unwrap();
|
||||||
|
|
||||||
let wifi = WiFi::new(ssid)?;
|
let wifi = WiFi::new(ssid)?;
|
||||||
println!("Connection Status: {}", wifi.connect(password));
|
println!("Connection Status: {}", wifi.connect(password));
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ pub trait Network: fmt::Debug {
|
|||||||
/// Makes an attempt to connect to a selected wireless network with password specified.
|
/// Makes an attempt to connect to a selected wireless network with password specified.
|
||||||
fn connect(&self, password: &str) -> Result<bool, NetworkError>;
|
fn connect(&self, password: &str) -> Result<bool, NetworkError>;
|
||||||
fn disconnect(&self) -> Result<bool, NetworkError>;
|
fn disconnect(&self) -> Result<bool, NetworkError>;
|
||||||
|
fn is_wifi_enabled(&self) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[derive(Debug)]
|
// #[derive(Debug)]
|
||||||
@@ -33,6 +34,7 @@ pub enum NetworkError {
|
|||||||
IoError(io::Error),
|
IoError(io::Error),
|
||||||
FailedToConnect(String),
|
FailedToConnect(String),
|
||||||
FailedToDisconnect(String),
|
FailedToDisconnect(String),
|
||||||
|
WiFiInterfaceDisabled,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<io::Error> for NetworkError {
|
impl From<io::Error> for NetworkError {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ impl ProfileNetwork {
|
|||||||
|
|
||||||
let handler = Machine::new(
|
let handler = Machine::new(
|
||||||
name,
|
name,
|
||||||
config.map_or(None, |cfg| cfg.interface.map_or(None, |x| Some(&x))),
|
config.map_or(None, |cfg| cfg.interface.map_or(None, |x| Some(x))),
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(ProfileNetwork {
|
Ok(ProfileNetwork {
|
||||||
@@ -23,6 +23,10 @@ impl ProfileNetwork {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn connect(&self, password: &str) -> Result<bool, NetworkError> {
|
pub fn connect(&self, password: &str) -> Result<bool, NetworkError> {
|
||||||
|
if !self.handler.is_wifi_enabled() {
|
||||||
|
return Err(NetworkError::WiFiInterfaceDisabled);
|
||||||
|
}
|
||||||
|
|
||||||
self.handler.connect(password)
|
self.handler.connect(password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,4 +47,17 @@ impl Network for Linux {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.contains("disconnect"))
|
.contains("disconnect"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_wifi_enabled(&self) -> bool {
|
||||||
|
let output = Command::new("nmcli").args(&["radio", "wifi"]).output();
|
||||||
|
|
||||||
|
if let Err(_) = output {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String::from_utf8_lossy(&output.unwrap().stdout)
|
||||||
|
.replace(" ", "")
|
||||||
|
.replace("\n", "")
|
||||||
|
.contains("enabled")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,4 +69,18 @@ impl Network for Windows {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.contains("disconnect"))
|
.contains("disconnect"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_wifi_enabled(&self) -> bool {
|
||||||
|
// let output = Command::new("nmcli").args(&["radio", "wifi"]).output();
|
||||||
|
|
||||||
|
// if let Err(_) = output {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// match String::from_utf8_lossy(&output.unwrap().stdout).as_ref() {
|
||||||
|
// "enabled" => true,
|
||||||
|
// _ => false,
|
||||||
|
// }
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ fn main() -> Result<(), NetworkError> {
|
|||||||
interface: Some("wlo1"),
|
interface: Some("wlo1"),
|
||||||
});
|
});
|
||||||
|
|
||||||
let wifi = WiFi::new("AndroidAPSD", config)?;
|
let wifi = WiFi::new("AndroidAPSD22", config)?;
|
||||||
|
|
||||||
match wifi.connect("belm4235") {
|
match wifi.connect("belm4235") {
|
||||||
Ok(result) => println!(
|
Ok(result) => println!(
|
||||||
|
|||||||
Reference in New Issue
Block a user