lan_discovery_WOL: Win10 test done
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
parent
7c323c86ac
commit
8fd4830710
25
Cargo.lock
generated
25
Cargo.lock
generated
@ -570,13 +570,28 @@ checksum = "ab8b79fe3946ceb4a0b1c080b4018992b8d27e9ff363644c1c9b6387c854614d"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
|
"clap_derive",
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
|
"once_cell",
|
||||||
"strsim 0.10.0",
|
"strsim 0.10.0",
|
||||||
"termcolor",
|
"termcolor",
|
||||||
"textwrap 0.15.0",
|
"textwrap 0.15.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_derive"
|
||||||
|
version = "3.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ed6db9e867166a43a53f7199b5e4d1f522a1e5bd626654be263c999ce59df39a"
|
||||||
|
dependencies = [
|
||||||
|
"heck 0.4.0",
|
||||||
|
"proc-macro-error",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_lex"
|
name = "clap_lex"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
@ -4146,6 +4161,7 @@ dependencies = [
|
|||||||
"winit",
|
"winit",
|
||||||
"winreg 0.10.1",
|
"winreg 0.10.1",
|
||||||
"winres",
|
"winres",
|
||||||
|
"wol-rs",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -5713,6 +5729,15 @@ dependencies = [
|
|||||||
"toml",
|
"toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wol-rs"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d7f97e69b28b256ccfb02472c25057132e234aa8368fea3bb0268def564ce1f2"
|
||||||
|
dependencies = [
|
||||||
|
"clap 3.2.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ws2_32-sys"
|
name = "ws2_32-sys"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -56,6 +56,7 @@ base64 = "0.13"
|
|||||||
sysinfo = "0.23"
|
sysinfo = "0.23"
|
||||||
num_cpus = "1.13"
|
num_cpus = "1.13"
|
||||||
default-net = "0.11.0"
|
default-net = "0.11.0"
|
||||||
|
wol-rs = "0.9.1"
|
||||||
|
|
||||||
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
||||||
reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features=false }
|
reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features=false }
|
||||||
|
@ -860,7 +860,7 @@ impl LocalConfig {
|
|||||||
pub struct DiscoveryPeer {
|
pub struct DiscoveryPeer {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
#[serde(with = "serde_with::rust::map_as_tuple_list")]
|
#[serde(with = "serde_with::rust::map_as_tuple_list")]
|
||||||
pub mac_ips: HashMap<String, String>,
|
pub ip_mac: HashMap<String, String>,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub hostname: String,
|
pub hostname: String,
|
||||||
pub platform: String,
|
pub platform: String,
|
||||||
|
@ -700,10 +700,9 @@ fn wait_response(
|
|||||||
if mac != p.mac {
|
if mac != p.mac {
|
||||||
allow_err!(tx.send(config::DiscoveryPeer {
|
allow_err!(tx.send(config::DiscoveryPeer {
|
||||||
id: p.id.clone(),
|
id: p.id.clone(),
|
||||||
mac_ips: HashMap::from([(
|
ip_mac: HashMap::from([
|
||||||
p.mac.clone(),
|
(addr.ip().to_string(), p.mac.clone(),)
|
||||||
addr.ip().to_string()
|
]),
|
||||||
)]),
|
|
||||||
username: p.username.clone(),
|
username: p.username.clone(),
|
||||||
hostname: p.hostname.clone(),
|
hostname: p.hostname.clone(),
|
||||||
platform: p.platform.clone(),
|
platform: p.platform.clone(),
|
||||||
@ -744,7 +743,6 @@ async fn handle_received_peers(mut rx: UnboundedReceiver<config::DiscoveryPeer>)
|
|||||||
peer.online = false;
|
peer.online = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
// handle received peers
|
|
||||||
let mut response_set = HashSet::new();
|
let mut response_set = HashSet::new();
|
||||||
let mut last_write_time = Instant::now() - std::time::Duration::from_secs(4);
|
let mut last_write_time = Instant::now() - std::time::Duration::from_secs(4);
|
||||||
loop {
|
loop {
|
||||||
@ -753,20 +751,24 @@ async fn handle_received_peers(mut rx: UnboundedReceiver<config::DiscoveryPeer>)
|
|||||||
Some(peer) => {
|
Some(peer) => {
|
||||||
let in_response_set = !response_set.insert(peer.id.clone());
|
let in_response_set = !response_set.insert(peer.id.clone());
|
||||||
let mut pre_found = false;
|
let mut pre_found = false;
|
||||||
|
// Try find and update peer
|
||||||
for peer1 in &mut peers {
|
for peer1 in &mut peers {
|
||||||
if peer1.is_same_peer(&peer) {
|
if peer1.is_same_peer(&peer) {
|
||||||
if in_response_set {
|
if in_response_set {
|
||||||
peer1.mac_ips.extend(peer.mac_ips.clone());
|
// Merge ip_mac and update other infos
|
||||||
|
peer1.ip_mac.extend(peer.ip_mac.clone());
|
||||||
peer1.hostname = peer.hostname.clone();
|
peer1.hostname = peer.hostname.clone();
|
||||||
peer1.platform = peer.platform.clone();
|
peer1.platform = peer.platform.clone();
|
||||||
peer1.online = true;
|
peer1.online = true;
|
||||||
} else {
|
} else {
|
||||||
|
// Update all peer infos
|
||||||
*peer1 = peer.clone();
|
*peer1 = peer.clone();
|
||||||
}
|
}
|
||||||
pre_found = true;
|
pre_found = true;
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Push if not found
|
||||||
if !pre_found {
|
if !pre_found {
|
||||||
peers.push(peer);
|
peers.push(peer);
|
||||||
}
|
}
|
||||||
@ -796,3 +798,31 @@ pub async fn discover() -> ResultType<()> {
|
|||||||
log::info!("discover ping done");
|
log::info!("discover ping done");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn send_wol(id: String) {
|
||||||
|
let interfaces = default_net::get_interfaces();
|
||||||
|
for peer in &config::LanPeers::load().peers {
|
||||||
|
if peer.id == id {
|
||||||
|
for (ip, mac) in peer.ip_mac.iter() {
|
||||||
|
if let Ok(mac_addr) = mac.parse() {
|
||||||
|
if let Ok(IpAddr::V4(ip)) = ip.parse() {
|
||||||
|
for interface in &interfaces {
|
||||||
|
for ipv4 in &interface.ipv4 {
|
||||||
|
if (u32::from(ipv4.addr) & u32::from(ipv4.netmask))
|
||||||
|
== (u32::from(ip) & u32::from(ipv4.netmask))
|
||||||
|
{
|
||||||
|
allow_err!(wol::send_wol(
|
||||||
|
mac_addr,
|
||||||
|
None,
|
||||||
|
Some(IpAddr::V4(ipv4.addr))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -547,6 +547,10 @@ impl UI {
|
|||||||
config::LanPeers::store(&peers);
|
config::LanPeers::store(&peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn send_wol(&mut self, id: String) {
|
||||||
|
crate::rendezvous_mediator::send_wol(id)
|
||||||
|
}
|
||||||
|
|
||||||
fn new_remote(&mut self, id: String, remote_type: String) {
|
fn new_remote(&mut self, id: String, remote_type: String) {
|
||||||
let mut lock = self.0.lock().unwrap();
|
let mut lock = self.0.lock().unwrap();
|
||||||
let args = vec![format!("--{}", remote_type), id.clone()];
|
let args = vec![format!("--{}", remote_type), id.clone()];
|
||||||
@ -786,6 +790,7 @@ impl sciter::EventHandler for UI {
|
|||||||
fn closing(i32, i32, i32, i32);
|
fn closing(i32, i32, i32, i32);
|
||||||
fn get_size();
|
fn get_size();
|
||||||
fn new_remote(String, bool);
|
fn new_remote(String, bool);
|
||||||
|
fn send_wol(String);
|
||||||
fn remove_peer(String);
|
fn remove_peer(String);
|
||||||
fn remove_discovered(String);
|
fn remove_discovered(String);
|
||||||
fn get_connect_status();
|
fn get_connect_status();
|
||||||
|
@ -318,10 +318,11 @@ class SessionList: Reactor.Component {
|
|||||||
<li #tunnel>{translate('TCP Tunneling')}</li>
|
<li #tunnel>{translate('TCP Tunneling')}</li>
|
||||||
{false && !handler.using_public_server() && <li #force-always-relay><span>{svg_checkmark}</span>{translate('Always connect via relay')}</li>}
|
{false && !handler.using_public_server() && <li #force-always-relay><span>{svg_checkmark}</span>{translate('Always connect via relay')}</li>}
|
||||||
<li #rdp>RDP<EditRdpPort /></li>
|
<li #rdp>RDP<EditRdpPort /></li>
|
||||||
|
<li #wol>{translate('WOL')}</li>
|
||||||
<div .separator />
|
<div .separator />
|
||||||
{this.type != "lan" && <li #rename>{translate('Rename')}</li>}
|
{this.type != "lan" && <li #rename>{translate('Rename')}</li>}
|
||||||
{this.type != "fav" && <li #remove>{translate('Remove')}</li>}
|
{this.type != "fav" && <li #remove>{translate('Remove')}</li>}
|
||||||
{is_win && this.type != "lan" && <li #shortcut>{translate('Create Desktop Shortcut')}</li>}
|
{is_win && <li #shortcut>{translate('Create Desktop Shortcut')}</li>}
|
||||||
<li #forget-password>{translate('Unremember Password')}</li>
|
<li #forget-password>{translate('Unremember Password')}</li>
|
||||||
{(!this.type || this.type == "fav") && <li #add-fav>{translate('Add to Favorites')}</li>}
|
{(!this.type || this.type == "fav") && <li #add-fav>{translate('Add to Favorites')}</li>}
|
||||||
{(!this.type || this.type == "fav") && <li #remove-fav>{translate('Remove from Favorites')}</li>}
|
{(!this.type || this.type == "fav") && <li #remove-fav>{translate('Remove from Favorites')}</li>}
|
||||||
@ -419,6 +420,8 @@ class SessionList: Reactor.Component {
|
|||||||
createNewConnect(id, "connect");
|
createNewConnect(id, "connect");
|
||||||
} else if (action == "transfer") {
|
} else if (action == "transfer") {
|
||||||
createNewConnect(id, "file-transfer");
|
createNewConnect(id, "file-transfer");
|
||||||
|
} else if (action == "wol") {
|
||||||
|
handler.send_wol(id);
|
||||||
} else if (action == "remove") {
|
} else if (action == "remove") {
|
||||||
if (this.type == "ab") {
|
if (this.type == "ab") {
|
||||||
for (var i = 0; i < ab.peers.length; ++i) {
|
for (var i = 0; i < ab.peers.length; ++i) {
|
||||||
|
Loading…
Reference in New Issue
Block a user