diff options
-rw-r--r-- | src/routes/start.rs | 6 | ||||
-rw-r--r-- | src/wol.rs | 23 |
2 files changed, 26 insertions, 3 deletions
diff --git a/src/routes/start.rs b/src/routes/start.rs index ae2b384..bbc6ab8 100644 --- a/src/routes/start.rs +++ b/src/routes/start.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | use crate::storage::Device; | 1 | use crate::storage::Device; |
2 | use crate::error::Error; | 2 | use crate::error::Error; |
3 | use crate::services::ping::Value as PingValue; | 3 | use crate::services::ping::Value as PingValue; |
4 | use crate::wol::send_packet; | 4 | use crate::wol::{create_buffer, send_packet}; |
5 | use axum::extract::{Path, State}; | 5 | use axum::extract::{Path, State}; |
6 | use axum::Json; | 6 | use axum::Json; |
7 | use serde::{Deserialize, Serialize}; | 7 | use serde::{Deserialize, Serialize}; |
@@ -61,10 +61,10 @@ fn send_wol( | |||
61 | 61 | ||
62 | let bind_addr = "0.0.0.0:0"; | 62 | let bind_addr = "0.0.0.0:0"; |
63 | 63 | ||
64 | let _ = send_packet( | 64 | send_packet( |
65 | bind_addr, | 65 | bind_addr, |
66 | &device.broadcast_addr.to_string(), | 66 | &device.broadcast_addr.to_string(), |
67 | &device.mac.bytes() | 67 | &create_buffer(&device.mac.to_string())? |
68 | )?; | 68 | )?; |
69 | let dev_id = device.id.clone(); | 69 | let dev_id = device.id.clone(); |
70 | let uuid = if let Some(pl) = payload { | 70 | let uuid = if let Some(pl) = payload { |
@@ -1,7 +1,29 @@ | |||
1 | use std::net::{ToSocketAddrs, UdpSocket}; | 1 | use std::net::{ToSocketAddrs, UdpSocket}; |
2 | 2 | ||
3 | use tracing::trace; | ||
4 | |||
3 | use crate::error::Error; | 5 | use crate::error::Error; |
4 | 6 | ||
7 | /// Creates the magic packet from a mac address | ||
8 | /// | ||
9 | /// # Panics | ||
10 | /// | ||
11 | /// Panics if `mac_addr` is an invalid mac | ||
12 | pub fn create_buffer(mac_addr: &str) -> Result<Vec<u8>, Error> { | ||
13 | let mut mac = Vec::new(); | ||
14 | let sp = mac_addr.split(':'); | ||
15 | for f in sp { | ||
16 | mac.push(u8::from_str_radix(f, 16)?); | ||
17 | } | ||
18 | let mut buf = vec![255; 6]; | ||
19 | for _ in 0..16 { | ||
20 | for i in &mac { | ||
21 | buf.push(*i); | ||
22 | } | ||
23 | } | ||
24 | Ok(buf) | ||
25 | } | ||
26 | |||
5 | /// Sends a buffer on UDP broadcast | 27 | /// Sends a buffer on UDP broadcast |
6 | pub fn send_packet<A: ToSocketAddrs>( | 28 | pub fn send_packet<A: ToSocketAddrs>( |
7 | bind_addr: A, | 29 | bind_addr: A, |
@@ -10,5 +32,6 @@ pub fn send_packet<A: ToSocketAddrs>( | |||
10 | ) -> Result<usize, Error> { | 32 | ) -> Result<usize, Error> { |
11 | let socket = UdpSocket::bind(bind_addr)?; | 33 | let socket = UdpSocket::bind(bind_addr)?; |
12 | socket.set_broadcast(true)?; | 34 | socket.set_broadcast(true)?; |
35 | trace!(?buffer ,"start with"); | ||
13 | Ok(socket.send_to(buffer, broadcast_addr)?) | 36 | Ok(socket.send_to(buffer, broadcast_addr)?) |
14 | } | 37 | } |