From 2b95b7be690a268a181aebbd7415e3147dddddf0 Mon Sep 17 00:00:00 2001 From: epi Date: Mon, 17 Apr 2023 06:26:59 -0500 Subject: [PATCH] updated indicatif to 0.17.3 --- Cargo.lock | 24 ++-------- Cargo.toml | 2 +- Makefile.toml | 2 +- src/event_handlers/scans.rs | 2 +- src/event_handlers/statistics.rs | 2 +- src/main.rs | 3 +- src/progress.rs | 76 +++++++++++++++++++++++------- src/scan_manager/scan.rs | 2 +- src/scan_manager/scan_container.rs | 2 +- src/scanner/ferox_scanner.rs | 8 ++-- src/scanner/requester.rs | 10 ++-- 11 files changed, 78 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6532e8f..a8ea5e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -808,7 +808,7 @@ dependencies = [ "futures", "gaoya", "httpmock", - "indicatif 0.15.0", + "indicatif", "lazy_static", "leaky-bucket", "log", @@ -1289,18 +1289,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "indicatif" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" -dependencies = [ - "console", - "lazy_static", - "number_prefix 0.3.0", - "regex", -] - [[package]] name = "indicatif" version = "0.17.3" @@ -1308,7 +1296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" dependencies = [ "console", - "number_prefix 0.4.0", + "number_prefix", "portable-atomic", "unicode-width", ] @@ -1655,12 +1643,6 @@ dependencies = [ "libc", ] -[[package]] -name = "number_prefix" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" - [[package]] name = "number_prefix" version = "0.4.0" @@ -2400,7 +2382,7 @@ dependencies = [ "either", "flate2", "hyper", - "indicatif 0.17.3", + "indicatif", "log", "quick-xml", "regex", diff --git a/Cargo.toml b/Cargo.toml index 1b3e1e6..496bc86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ toml = "0.7.2" serde = { version = "1.0.137", features = ["derive", "rc"] } serde_json = "1.0.94" uuid = { version = "1.3.0", features = ["v4"] } -indicatif = "0.15" +indicatif = "0.17.3" console = "0.15.2" openssl = { version = "0.10", features = ["vendored"] } dirs = "5.0.0" diff --git a/Makefile.toml b/Makefile.toml index d89245e..fba963a 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -11,7 +11,7 @@ rm ferox-*.state # dependency management [tasks.upgrade-deps] command = "cargo" -args = ["upgrade", "--exclude", "indicatif"] +args = ["upgrade"] [tasks.update] command = "cargo" diff --git a/src/event_handlers/scans.rs b/src/event_handlers/scans.rs index 97a8564..b038807 100644 --- a/src/event_handlers/scans.rs +++ b/src/event_handlers/scans.rs @@ -266,7 +266,7 @@ impl ScanHandler { let bar = scan.progress_bar(); // (4000 - 3000) / 2 => 500 words left to send - let length = bar.length(); + let length = bar.length().unwrap_or(1); let num_words_left = (length - bar.position()) / divisor; // accumulate each bar's increment value for incrementing the total bar diff --git a/src/event_handlers/statistics.rs b/src/event_handlers/statistics.rs index f3a0f60..580c913 100644 --- a/src/event_handlers/statistics.rs +++ b/src/event_handlers/statistics.rs @@ -147,7 +147,7 @@ impl StatsHandler { self.stats.errors(), ); - self.bar.set_message(&msg); + self.bar.set_message(msg); if self.bar.position() < self.stats.total_expected() as u64 { // don't run off the end when we're a few requests over the expected total diff --git a/src/main.rs b/src/main.rs index 58350dd..8e85592 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,7 +31,7 @@ use feroxbuster::{ TermOutHandler, SCAN_COMPLETE, }, filters, heuristics, logger, - progress::{PROGRESS_BAR, PROGRESS_PRINTER}, + progress::PROGRESS_PRINTER, scan_manager::{self, ScanType}, scanner, utils::{fmt_err, slugify_filename}, @@ -220,7 +220,6 @@ async fn wrapped_main(config: Arc) -> Result<()> { // PROGRESS_PRINTER and PROGRESS_BAR have been used at least once. This call satisfies // that constraint PROGRESS_PRINTER.println(""); - PROGRESS_BAR.join().unwrap(); }); // check if update_app is true diff --git a/src/progress.rs b/src/progress.rs index df808d8..d7c21dd 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -1,4 +1,6 @@ -use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle}; +use std::time::Duration; + +use indicatif::{HumanDuration, MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle}; use lazy_static::lazy_static; lazy_static! { @@ -31,28 +33,68 @@ pub enum BarType { /// Add an [indicatif::ProgressBar](https://docs.rs/indicatif/latest/indicatif/struct.ProgressBar.html) /// to the global [PROGRESS_BAR](../config/struct.PROGRESS_BAR.html) pub fn add_bar(prefix: &str, length: u64, bar_type: BarType) -> ProgressBar { - let mut style = ProgressStyle::default_bar().progress_chars("#>-"); + let mut style = ProgressStyle::default_bar() + .progress_chars("#>-") + .with_key( + "smoothed_per_sec", + |state: &indicatif::ProgressState, w: &mut dyn std::fmt::Write| match ( + state.pos(), + state.elapsed().as_millis(), + ) { + // https://github.com/console-rs/indicatif/issues/394#issuecomment-1309971049 + // + // indicatif released a change to how they reported eta/per_sec + // and the results looked really weird based on how we use the progress + // bars. this fixes that + (pos, elapsed_ms) if elapsed_ms > 0 => { + write!(w, "{:.0}/s", pos as f64 * 1000_f64 / elapsed_ms as f64).unwrap() + } + _ => write!(w, "-").unwrap(), + }, + ) + .with_key( + "smoothed_eta", + |state: &indicatif::ProgressState, w: &mut dyn std::fmt::Write| match ( + state.pos(), + state.len(), + ) { + (pos, Some(len)) => write!( + w, + "{:#}", + HumanDuration(Duration::from_millis( + (state.elapsed().as_millis() + * (len as u128 - pos as u128) + .checked_div(pos as u128) + .unwrap_or(1)) as u64 + )) + ) + .unwrap(), + _ => write!(w, "-").unwrap(), + }, + ); style = match bar_type { - BarType::Hidden => style.template(""), - BarType::Default => style.template( - "[{bar:.cyan/blue}] - {elapsed:<4} {pos:>7}/{len:7} {per_sec:7} {prefix} {msg}", - ), - BarType::Message => style.template(&format!( + BarType::Hidden => style.template("").unwrap(), + BarType::Default => style + .template("[{bar:.cyan/blue}] - {elapsed:<4} {pos:>7}/{len:7} {smoothed_per_sec:7} {prefix} {msg}") + .unwrap(), + BarType::Message => style + .template(&format!( "[{{bar:.cyan/blue}}] - {{elapsed:<4}} {{pos:>7}}/{{len:7}} {:7} {{prefix}} {{msg}}", "-" - )), - BarType::Total => { - style.template("[{bar:.yellow/blue}] - {elapsed:<4} {pos:>7}/{len:7} {eta:7} {msg}") - } - BarType::Quiet => style.template("Scanning: {prefix}"), + )) + .unwrap(), + BarType::Total => style + .template("[{bar:.yellow/blue}] - {elapsed:<4} {pos:>7}/{len:7} {smoothed_eta:7} {msg}") + .unwrap(), + BarType::Quiet => style.template("Scanning: {prefix}").unwrap(), }; - let progress_bar = PROGRESS_BAR.add(ProgressBar::new(length)); - - progress_bar.set_style(style); - - progress_bar.set_prefix(prefix); + let progress_bar = PROGRESS_BAR.add( + ProgressBar::new(length) + .with_style(style) + .with_prefix(prefix.to_string()), + ); progress_bar } diff --git a/src/scan_manager/scan.rs b/src/scan_manager/scan.rs index 2d6717c..7571b9d 100644 --- a/src/scan_manager/scan.rs +++ b/src/scan_manager/scan.rs @@ -159,7 +159,7 @@ impl FeroxScan { if pb.position() > self.num_requests { pb.finish() } else { - pb.finish_at_current_pos() + pb.abandon() } } } diff --git a/src/scan_manager/scan_container.rs b/src/scan_manager/scan_container.rs index a22a044..166a17d 100644 --- a/src/scan_manager/scan_container.rs +++ b/src/scan_manager/scan_container.rs @@ -379,7 +379,7 @@ impl FeroxScans { .unwrap_or_else(|e| log::warn!("Could not cancel task: {}", e)); let pb = selected.progress_bar(); - num_cancelled += pb.length() as usize - pb.position() as usize; + num_cancelled += pb.length().unwrap_or(0) as usize - pb.position() as usize; } else { self.menu.println("Ok, doing nothing..."); } diff --git a/src/scanner/ferox_scanner.rs b/src/scanner/ferox_scanner.rs index c117a84..e533596 100644 --- a/src/scanner/ferox_scanner.rs +++ b/src/scanner/ferox_scanner.rs @@ -276,7 +276,7 @@ impl FeroxScanner { self.handles.stats.send(SubtractFromUsizeField( TotalExpected, - progress_bar.length() as usize, + progress_bar.length().unwrap_or(0) as usize, ))?; } @@ -292,7 +292,7 @@ impl FeroxScanner { if !self.handles.config.force_recursion { progress_bar.reset_eta(); - progress_bar.finish_with_message(&message); + progress_bar.finish_with_message(message); ferox_scan.finish()?; @@ -317,7 +317,7 @@ impl FeroxScanner { style("Wildcard").blue().bright(), style("stopped").red() ); - progress_bar.set_message(&message); + progress_bar.set_message(message); progress_bar.inc(num_reqs as u64); } Some(WildcardResult::FourOhFourLike(num_reqs)) => { @@ -344,7 +344,7 @@ impl FeroxScanner { let new_words = TF_IDF.read().unwrap().all_words(); let new_words_len = new_words.len(); - let cur_length = progress_bar.length(); + let cur_length = progress_bar.length().unwrap_or(0); let new_length = cur_length + new_words_len as u64; progress_bar.set_length(new_length); diff --git a/src/scanner/requester.rs b/src/scanner/requester.rs index 3822a11..28da79e 100644 --- a/src/scanner/requester.rs +++ b/src/scanner/requester.rs @@ -217,7 +217,7 @@ impl Requester { self.ferox_scan .progress_bar() - .set_message(&format!("=> 🚦 {styled_direction} scan speed",)); + .set_message(format!("=> 🚦 {styled_direction} scan speed",)); } self.policy_data.set_errors(scan_errors); } else { @@ -230,7 +230,7 @@ impl Requester { self.ferox_scan .progress_bar() - .set_message(&format!("=> 🚦 {styled_direction} scan speed",)); + .set_message(format!("=> 🚦 {styled_direction} scan speed",)); } } @@ -286,7 +286,7 @@ impl Requester { self.set_rate_limiter(Some(new_limit)).await?; self.ferox_scan .progress_bar() - .set_message(&format!("=> 🚦 set rate limit ({new_limit}/s)")); + .set_message(format!("=> 🚦 set rate limit ({new_limit}/s)")); } self.adjust_limit(trigger, true).await?; @@ -321,11 +321,11 @@ impl Requester { // figure out how many requests are skipped as a result let pb = self.ferox_scan.progress_bar(); - let num_skipped = pb.length().saturating_sub(pb.position()) as usize; + let num_skipped = pb.length().unwrap_or(0).saturating_sub(pb.position()) as usize; let styled_trigger = style(format!("{trigger:?}")).red(); - pb.set_message(&format!( + pb.set_message(format!( "=> 💀 too many {} ({}) 💀 bailing", styled_trigger, self.ferox_scan.num_errors(trigger),