2026-01-20 14:28:31 -05:00
|
|
|
use log::{debug, error, info};
|
2026-01-19 12:45:52 -05:00
|
|
|
use serde::Deserialize;
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
use std::fs;
|
2026-01-20 14:28:31 -05:00
|
|
|
use std::sync::LazyLock;
|
2026-01-19 12:45:52 -05:00
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
struct MacRecord {
|
|
|
|
|
pub mac_prefix: String,
|
|
|
|
|
pub vendor_name: String,
|
|
|
|
|
// private: bool,
|
|
|
|
|
// block_type: String,
|
|
|
|
|
// last_update: String,
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-20 14:28:31 -05:00
|
|
|
// Initialize mac vendors database as a static lazy loaded unit
|
|
|
|
|
static MAC_VENDORS_DATABASE: LazyLock<HashMap<String, String>> = LazyLock::new(|| {
|
|
|
|
|
info!("Loading MAC vendor database into memory");
|
2026-01-19 12:45:52 -05:00
|
|
|
|
2026-01-20 14:28:31 -05:00
|
|
|
let mut database = HashMap::new();
|
|
|
|
|
let data = match fs::read_to_string("data/mac-vendors-export.json") {
|
|
|
|
|
Ok(value) => value,
|
|
|
|
|
Err(error) => {
|
|
|
|
|
error!("Error reading mac vendors database (data/mac-vendors-export.json): {error}");
|
|
|
|
|
panic!("Error reading mac vendors database (data/mac-vendors-export.json): {error}");
|
2026-01-19 12:45:52 -05:00
|
|
|
}
|
2026-01-20 14:28:31 -05:00
|
|
|
};
|
2026-01-19 12:45:52 -05:00
|
|
|
|
2026-01-20 14:28:31 -05:00
|
|
|
let json: Vec<MacRecord> = match serde_json::from_str(&data) {
|
|
|
|
|
Ok(value) => value,
|
|
|
|
|
Err(error) => {
|
|
|
|
|
error!("Error parsing mac vendors database (data/mac-vendors-export.json): {error}");
|
|
|
|
|
panic!("Error parsing mac vendors database (data/mac-vendors-export.json): {error}");
|
2026-01-19 12:45:52 -05:00
|
|
|
}
|
2026-01-20 14:28:31 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
debug!("Found {} records in the database", json.len());
|
|
|
|
|
|
|
|
|
|
for el in json {
|
|
|
|
|
database.insert(el.mac_prefix.to_uppercase(), el.vendor_name);
|
2026-01-19 12:45:52 -05:00
|
|
|
}
|
|
|
|
|
|
2026-01-20 14:28:31 -05:00
|
|
|
info!("MAC vendor database loaded");
|
|
|
|
|
database
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Find a vendor based on the MAC prefix
|
|
|
|
|
pub fn find(mac_prefix: String) -> String {
|
|
|
|
|
MAC_VENDORS_DATABASE
|
|
|
|
|
.get(&mac_prefix.to_uppercase())
|
|
|
|
|
.unwrap_or(&"".to_string())
|
|
|
|
|
.to_string()
|
2026-01-19 12:45:52 -05:00
|
|
|
}
|