Updates format of input file to CSV with <host ip>,<host name> as the format.

This commit is contained in:
Trevor Merritt 2025-04-23 16:16:46 -04:00
parent df01cf614d
commit 347ad5c744
9 changed files with 82 additions and 33 deletions

View File

@ -1,3 +1,4 @@
address,name
10.3.100.1,Belleville Router 10.3.100.1,Belleville Router
10.11.31.3,Belleville VPN 11-31 10.11.31.3,Belleville VPN 11-31
10.12.32.1,Belleville VPN 12-32 10.12.32.1,Belleville VPN 12-32

View File

View File

@ -1,3 +1,4 @@
address,name
10.3.100.1,Belleville Router 10.3.100.1,Belleville Router
10.11.31.3,Belleville VPN 11-31 10.11.31.3,Belleville VPN 11-31
10.12.32.1,Belleville VPN 12-32 10.12.32.1,Belleville VPN 12-32

View File

@ -1,3 +1,4 @@
address,name
10.3.100.1,Belleville Gateway 10.3.100.1,Belleville Gateway
10.11.31.3,Belleville VPN 11-31 10.11.31.3,Belleville VPN 11-31
10.12.32.1,Belleville VPN 12-32 10.12.32.1,Belleville VPN 12-32

10
src/app_settings.rs Normal file
View File

@ -0,0 +1,10 @@
use std::path::PathBuf;
use clap::Parser;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct AppSettings {
/// File of list of hosts
#[arg(short, long)]
pub ping_host_file: Option<PathBuf>,
}

View File

@ -17,6 +17,7 @@ use std::{env, error::Error, ffi::OsString, process};
use color_eyre::owo_colors::OwoColorize; use color_eyre::owo_colors::OwoColorize;
use crossterm::style::Stylize; use crossterm::style::Stylize;
use log::debug; use log::debug;
use pp::app_settings::AppSettings;
const SECONDS_IN_MINUTE: u32 = 60; const SECONDS_IN_MINUTE: u32 = 60;
const SECONDS_IN_HOUR: u32 = SECONDS_IN_MINUTE * 60; const SECONDS_IN_HOUR: u32 = SECONDS_IN_MINUTE * 60;
@ -119,7 +120,7 @@ impl PPState {
} }
pub fn build_targets_from_file(filename: Option<PathBuf>) -> BTreeMap<String, TargetState> { pub fn build_targets_from_file(filename: Option<PathBuf>) -> BTreeMap<String, TargetState> {
PPState::get_default_targets(); // PPState::get_default_targets();
if let Some(file) = filename { if let Some(file) = filename {
let mut working = BTreeMap::new(); let mut working = BTreeMap::new();
if !&file.exists() { if !&file.exists() {
@ -157,20 +158,22 @@ impl PPState {
} }
/// Simple program to greet a person /// Simple program to greet a person
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct AppSettings {
/// File of list of hosts
#[arg(short, long)]
ping_host_file: Option<PathBuf>,
}
fn main() { fn main() {
// Get App Settings // Get App Settings
let settings = AppSettings::parse(); let settings = AppSettings::parse();
print!("Prep to load targets..."); print!("Prep to load targets...");
let mut targets = PPState::build_targets_from_file(settings.ping_host_file); let file_to_check = match settings.ping_host_file {
None => {
PathBuf::from("./hosts.txt")
}
Some(actual) => {
actual
}
};
let mut targets = PPState::build_targets_from_file(Some(file_to_check));
// channel to send requests to ping // channel to send requests to ping
let (ping_response_sender, ping_response_listener) = mpsc::channel::<PingResult>(); let (ping_response_sender, ping_response_listener) = mpsc::channel::<PingResult>();

View File

@ -1,9 +1,14 @@
use clap::Parser;
use pp::app_settings::AppSettings;
use pp::tui::ratatui_app::RatatuiApp; use pp::tui::ratatui_app::RatatuiApp;
fn main() -> color_eyre::Result<()> { fn main() -> color_eyre::Result<()> {
// find out what file we are using to get our hosts
let settings = AppSettings::parse();
color_eyre::install()?; color_eyre::install()?;
let terminal = ratatui::init(); let terminal = ratatui::init();
let result = RatatuiApp::new().run(terminal); let result = RatatuiApp::new(settings.ping_host_file).run(terminal);
ratatui::restore(); ratatui::restore();
result result
} }

View File

@ -3,6 +3,7 @@ pub mod ping_request;
pub mod ping_result; pub mod ping_result;
pub mod target_state; pub mod target_state;
pub mod tui; pub mod tui;
pub mod app_settings;
pub const SECONDS_BETWEEN_DISPLAY: u32 = 1; pub const SECONDS_BETWEEN_DISPLAY: u32 = 1;
pub const SECONDS_BETWEEN_PING: u32 = 2; pub const SECONDS_BETWEEN_PING: u32 = 2;

View File

@ -1,6 +1,9 @@
use color_eyre::Result; use color_eyre::Result;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fs::File;
use std::net::Ipv4Addr; use std::net::Ipv4Addr;
use std::path::PathBuf;
use std::str::FromStr;
use std::sync::mpsc; use std::sync::mpsc;
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
use std::time::{Duration, SystemTime}; use std::time::{Duration, SystemTime};
@ -61,22 +64,6 @@ pub struct RatatuiApp {
} }
impl RatatuiApp { impl RatatuiApp {
pub fn setup_default_hosts(&mut self) {
self.state.insert(
"Test Host 1".to_string(),
TargetState {
target: Ipv4Addr::new(127, 0, 0, 1),
name: "Localhost".to_string(),
..TargetState::default()
},
);
self.state.insert(
"Test Host 2".to_string(),
TargetState { target: Ipv4Addr::new(8, 8, 8, 8), name: "Google".to_string(), ..TargetState::default() },
);
}
pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> { pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
self.running = true; self.running = true;
// start the 'manager' thread that spawns its ping threads as needed // start the 'manager' thread that spawns its ping threads as needed
@ -140,7 +127,7 @@ impl RatatuiApp {
}; };
working = format!("{}\n{} ({}) - {} / {} / {}", working = format!("{}\n{} ({}) - {} / {} / {}",
working, working,
current.name, color_name,
current.target, current.target,
current.alive, current.alive,
current.last_rtt, current.last_rtt,
@ -175,7 +162,6 @@ impl RatatuiApp {
fn quit(&mut self) { self.running = false; } fn quit(&mut self) { self.running = false; }
/// Handles the key events and updates the state of [`App`]. /// Handles the key events and updates the state of [`App`].
fn on_key_event(&mut self, key: KeyEvent) { fn on_key_event(&mut self, key: KeyEvent) {
match (key.modifiers, key.code) { match (key.modifiers, key.code) {
@ -187,10 +173,51 @@ impl RatatuiApp {
} }
} }
pub fn new(option: Option<PathBuf>) -> Self {
pub fn new() -> Self { let targets = if let Some(file) = option {
let mut working = BTreeMap::new();
if !&file.exists() {
RatatuiApp::get_default_targets()
} else {
let real_file = File::open(file);
let mut rdr = csv::Reader::from_reader(real_file.unwrap());
for result in rdr.records() {
let record = result.unwrap();
working.insert(record[1].to_string(),
TargetState {
name: record[1].to_string(),
target: Ipv4Addr::from_str(&record[0]).unwrap(),
alive: false,
last_alive_change: SystemTime::now(),
last_rtt: 0
});
}
working
}
} else { RatatuiApp::get_default_targets() };
let mut working = Self::default(); let mut working = Self::default();
working.setup_default_hosts(); working.state = targets;
working working
} }
}
fn get_default_targets() -> BTreeMap<String, TargetState> {
let mut working = BTreeMap::new();
working.insert("1111 DNS".to_string(), TargetState {
name: "1111 DNS".to_string(),
target: Ipv4Addr::new(1,1,1,1),
..TargetState::default()
});
working.insert("Google DNS".to_string(), TargetState {
name: "Google DNS".to_string(),
target: Ipv4Addr::new(8,8,8,8),
..TargetState::default()
});
working.insert("Test Site 1".to_string(), TargetState {
name: "Test Site 1".to_string(),
target: Ipv4Addr::new(216,234,202,122),
..TargetState::default()
});
working
}
}