Using duration-string for configuration of timings. Much nicer.

This commit is contained in:
rzuasti
2026-01-23 14:35:28 -05:00
parent ecfc56bc30
commit ca1674243e
8 changed files with 56 additions and 26 deletions
Generated
+10
View File
@@ -405,6 +405,15 @@ dependencies = [
"const-random", "const-random",
] ]
[[package]]
name = "duration-string"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edbd404ab304f4426de3e981a875a77129597ce04202c9b8b4502c6f1c246809"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.35" version = "0.8.35"
@@ -1283,6 +1292,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"config", "config",
"duration-string",
"env_logger", "env_logger",
"include_dir", "include_dir",
"lazy_static", "lazy_static",
+1
View File
@@ -17,3 +17,4 @@ chrono = "0.4.43"
pushover = "0.4.0" pushover = "0.4.0"
config = "0.15.19" config = "0.15.19"
lazy_static = "1.5.0" lazy_static = "1.5.0"
duration-string = { version="0.5.3", features = ["serde"] }
+3 -3
View File
@@ -5,9 +5,9 @@ interface = "eno1" # Network interface to use for scans
level = "info" # off, error, warn, info, debug, trace level = "info" # off, error, warn, info, debug, trace
[timings] [timings]
wait_between_scans="30" wait_between_scans="30s"
arp_sender_timeout="30" arp_sender_timeout="30s"
arp_scan_duration="60" arp_scan_duration="60s"
[notifications] [notifications]
method="pushover" # For now just pushover method="pushover" # For now just pushover
+3 -3
View File
@@ -5,9 +5,9 @@ interface = "eno1" # Network interface to use for scans
level = "info" # off, error, warn, info, debug, trace level = "info" # off, error, warn, info, debug, trace
[timings] [timings]
wait_between_scans="900" # Wait time between scans (in seconds). This does not include the scan time wait_between_scans="15m" # Wait time between scans. This does not include the scan time
arp_sender_timeout="60" # If the ARP sender process takes longer than this (in seconds) it will be stopped (for a class C network - 254 IPs - it should take less than a minute) arp_sender_timeout="1m" # If the ARP sender process takes longer than this it will be stopped (for a class C network - 254 IPs - it should take less than a minute)
arp_scan_duration="300" # How long to wait (in seconds) for response packets on each scan (300 to 600 seconds is a good timeframe for a class B or C network) arp_scan_duration="30s" # How long to wait for response packets on each scan (5m to 10m is a good timeframe for a class B or C network)
[notifications] [notifications]
method="pushover" # For now just pushover, you can set this to "none" to avoid sending notifications (it will just log) method="pushover" # For now just pushover, you can set this to "none" to avoid sending notifications (it will just log)
+23 -11
View File
@@ -1,6 +1,7 @@
mod packet_send_receive; mod packet_send_receive;
use crate::{device_finders::Device, settings::CONFIG}; use crate::{device_finders::Device, settings::CONFIG};
use duration_string::DurationString;
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use packet_send_receive::{listen_for_packets, send_packet}; use packet_send_receive::{listen_for_packets, send_packet};
use pnet::{ use pnet::{
@@ -81,34 +82,45 @@ pub async fn find(interface: String) -> Result<Vec<Device>, String> {
let send_interface = network_interface.clone(); let send_interface = network_interface.clone();
// Get timeouts // Get timeouts
let sender_timeout = CONFIG.timings.arp_sender_timeout; let sender_timeout: Duration = CONFIG.timings.arp_sender_timeout.into();
info!("Sender timeout set to {} seconds", sender_timeout); info!(
let scan_duration = CONFIG.timings.arp_scan_duration; "Sender timeout set to {}",
let receiver_timeout = scan_duration * 2; CONFIG.timings.arp_sender_timeout
info!("Scan duration set to {} seconds", scan_duration); );
info!("Receiver timeout set to {} seconds", receiver_timeout); let scan_duration: Duration = CONFIG.timings.arp_scan_duration.into();
let receiver_timeout: Duration = scan_duration * 2;
info!("Scan duration set to {}", CONFIG.timings.arp_scan_duration);
info!(
"Receiver timeout set to {}",
String::from(DurationString::from(receiver_timeout))
);
if sender_timeout >= scan_duration { if sender_timeout >= scan_duration {
warn!( warn!(
"OOTT_ARP_SENDER_TIMEOUT ({sender_timeout}) needs to be smaller than OOTT_ARP_SCAN_DURATION ({scan_duration})." "OOTT_ARP_SENDER_TIMEOUT ({}) needs to be smaller than OOTT_ARP_SCAN_DURATION ({}).",
CONFIG.timings.arp_sender_timeout, CONFIG.timings.arp_scan_duration
); );
return Err(format!("OOTT_ARP_SENDER_TIMEOUT ({sender_timeout}) needs to be smaller than OOTT_ARP_SCAN_DURATION ({scan_duration}).").to_string()); return Err(format!(
"OOTT_ARP_SENDER_TIMEOUT ({}) needs to be smaller than OOTT_ARP_SCAN_DURATION ({}).",
CONFIG.timings.arp_sender_timeout, CONFIG.timings.arp_scan_duration
)
.to_string());
} }
let result = tokio::join!( let result = tokio::join!(
timeout( timeout(
Duration::from_secs(sender_timeout), sender_timeout,
send_packet(sender, send_interface, ipv4_net, mac), send_packet(sender, send_interface, ipv4_net, mac),
), ),
timeout( timeout(
Duration::from_secs(receiver_timeout), receiver_timeout,
listen_for_packets(receiver, ipv4_net, scan_duration), listen_for_packets(receiver, ipv4_net, scan_duration),
) )
); );
match result { match result {
(Ok(_), Ok(_)) => info!("ARP sender and receiver done"), (Ok(_), Ok(_)) => info!("ARP sender and receiver done"),
(Err(_), _) => warn!("ARP sender timed out"), (Err(_), _) => warn!("ARP sender timed out. Consider increasing its duration."),
(_, Err(_)) => info!("ARP receiver timed out"), (_, Err(_)) => info!("ARP receiver timed out"),
}; };
+11 -5
View File
@@ -1,6 +1,7 @@
use crate::device_finders::Device; use crate::device_finders::Device;
use crate::mac_vendor_finder; use crate::mac_vendor_finder;
use chrono::Local; use chrono::Local;
use duration_string::DurationString;
use log::{debug, info}; use log::{debug, info};
use pnet::datalink::{DataLinkReceiver, DataLinkSender, NetworkInterface}; use pnet::datalink::{DataLinkReceiver, DataLinkSender, NetworkInterface};
use pnet::ipnetwork::Ipv4Network; use pnet::ipnetwork::Ipv4Network;
@@ -65,15 +66,18 @@ pub async fn send_packet(
pub async fn listen_for_packets( pub async fn listen_for_packets(
mut rx: Box<dyn DataLinkReceiver>, mut rx: Box<dyn DataLinkReceiver>,
ipv4_net: Ipv4Network, ipv4_net: Ipv4Network,
run_for_secs: u64, run_for: Duration,
) -> Vec<Device> { ) -> Vec<Device> {
info!("Starting ARP receiver for {} secs", run_for_secs); info!(
"Starting ARP receiver for {}",
String::from(DurationString::from(run_for))
);
let start_time = Instant::now(); let start_time = Instant::now();
let mut devices = Vec::new(); let mut devices = Vec::new();
// Run while still under the time window // Run while still under the time window
while (Instant::now() - start_time).as_secs() <= run_for_secs { while start_time.elapsed() <= run_for {
let arp_buffer = match rx.next() { let arp_buffer = match rx.next() {
Ok(buffer) => buffer, Ok(buffer) => buffer,
Err(_) => continue, Err(_) => continue,
@@ -109,8 +113,10 @@ pub async fn listen_for_packets(
sleep(Duration::from_millis(1)).await; sleep(Duration::from_millis(1)).await;
} }
info!( info!(
"ARP receiver ran for {} secs", "ARP receiver ran for {}",
(Instant::now() - start_time).as_secs() String::from(DurationString::from(Duration::from_secs(
start_time.elapsed().as_secs()
)))
); );
devices devices
+1 -1
View File
@@ -78,6 +78,6 @@ async fn main() -> Result<(), String> {
"Scan finished. Sleeping for {} seconds", "Scan finished. Sleeping for {} seconds",
CONFIG.timings.wait_between_scans CONFIG.timings.wait_between_scans
); );
sleep(Duration::from_secs(CONFIG.timings.wait_between_scans)).await; sleep(Duration::from(CONFIG.timings.wait_between_scans)).await;
} }
} }
+4 -3
View File
@@ -1,4 +1,5 @@
use config::{Config, ConfigError, File}; use config::{Config, ConfigError, File};
use duration_string::DurationString;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::error; use log::error;
use serde::Deserialize; use serde::Deserialize;
@@ -18,9 +19,9 @@ pub struct Log {
#[derive(Debug, Deserialize, Clone)] #[derive(Debug, Deserialize, Clone)]
pub struct Timings { pub struct Timings {
pub wait_between_scans: u64, pub wait_between_scans: DurationString,
pub arp_sender_timeout: u64, pub arp_sender_timeout: DurationString,
pub arp_scan_duration: u64, pub arp_scan_duration: DurationString,
} }
#[derive(Debug, Deserialize, Clone)] #[derive(Debug, Deserialize, Clone)]