diff --git a/TODO.md b/TODO.md index b3e53be..7dbe54b 100644 --- a/TODO.md +++ b/TODO.md @@ -8,7 +8,7 @@ - [x] Record an activity log in the database - [x] One event for each device appearance - [x] Add date filter to device event list method (from) -- [ ] Add a data set (json) to store maps from vendors -> device type; modify the device creation so that it uses it automatically +- [x] Add a data set (json) to store maps from vendors -> device type; modify the device creation so that it uses it automatically ## Frontend diff --git a/backend/src/device_finders/arp/packet_send_receive.rs b/backend/src/device_finders/arp/packet_send_receive.rs index 772c36c..1b726d9 100644 --- a/backend/src/device_finders/arp/packet_send_receive.rs +++ b/backend/src/device_finders/arp/packet_send_receive.rs @@ -1,4 +1,5 @@ use crate::mac_vendor_finder; +use crate::vendor_device_type_finder; use crate::model::devices::Device; use chrono::Local; use duration_string::DurationString; @@ -106,12 +107,14 @@ pub async fn listen_for_packets( "Found online device - IP addr={} - MAC addr={} - vendor={}", packet_ip_address, packet_mac_address, packet_vendor ); - devices.push(Device::new( + let mut device = Device::new( packet_mac_address, packet_ip_address, packet_vendor, Local::now().to_utc(), - )); + ); + device.device_type = vendor_device_type_finder::find(&device.vendor); + devices.push(device); } } } diff --git a/backend/src/main.rs b/backend/src/main.rs index 4558b60..6e6b73e 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -6,6 +6,7 @@ mod db; mod device_finders; mod events; mod mac_vendor_finder; +mod vendor_device_type_finder; mod model; mod retention; mod scanner; diff --git a/backend/src/vendor_device_type_finder.rs b/backend/src/vendor_device_type_finder.rs new file mode 100644 index 0000000..4d91dfe --- /dev/null +++ b/backend/src/vendor_device_type_finder.rs @@ -0,0 +1,53 @@ +use lazy_static::lazy_static; +use log::{debug, error, info}; +use std::collections::HashMap; + +// Initialize vendor device type database as a static lazy loaded unit +lazy_static! { + static ref VENDOR_DEVICE_TYPE_DATABASE: HashMap = { + info!("Loading vendor device type database into memory"); + + let data = include_str!("../data/vendor-device-type.json"); + + let database: HashMap = match serde_json::from_str(data) { + Ok(value) => value, + Err(error) => { + error!( + "Error parsing vendor device type database (data/vendor-device-type.json): {error}" + ); + panic!( + "Error parsing vendor device type database (data/vendor-device-type.json): {error}" + ); + } + }; + + debug!("Found {} records in the database", database.len()); + info!("Vendor device type database loaded"); + database + }; +} + +// Find a device type based on the vendor name +pub fn find(vendor: &str) -> String { + VENDOR_DEVICE_TYPE_DATABASE + .get(vendor) + .unwrap_or(&"".to_string()) + .to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn known_vendor_returns_device_type() { + let result = find("Apple, Inc."); + assert!(!result.is_empty(), "Expected a device type for Apple, Inc."); + } + + #[test] + fn unknown_vendor_returns_empty_string() { + let result = find("This Vendor Does Not Exist XYZ"); + assert_eq!(result, ""); + } +}