2021-09-11 15:28:45 +00:00
|
|
|
//! Post-scan analysis
|
|
|
|
|
|
|
|
use crate::cli_options::AnalyzeOpt;
|
|
|
|
use crate::file_results::{FileResults, Step};
|
|
|
|
use std::fs::File;
|
|
|
|
|
|
|
|
/// Generate and print statistics related to a scan's results
|
|
|
|
pub fn analyze(results: impl Iterator<Item = FileResults>) {
|
|
|
|
let mut total = 0;
|
|
|
|
let mut start = 0;
|
|
|
|
let mut read = 0;
|
|
|
|
let mut decompress = 0;
|
|
|
|
let mut parse = 0;
|
|
|
|
let mut execute = 0;
|
|
|
|
let mut complete = 0;
|
|
|
|
|
|
|
|
for result in results {
|
|
|
|
total += 1;
|
|
|
|
|
|
|
|
match result.progress {
|
|
|
|
Step::Start => start += 1,
|
|
|
|
Step::Read => read += 1,
|
|
|
|
Step::Decompress => decompress += 1,
|
|
|
|
Step::Parse => parse += 1,
|
|
|
|
Step::Execute => execute += 1,
|
|
|
|
Step::Complete => complete += 1,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-26 23:46:09 +00:00
|
|
|
println!("Scanned {total} swf files.");
|
2021-09-11 15:28:45 +00:00
|
|
|
|
2023-01-20 17:29:33 +00:00
|
|
|
let digits = [start, read, decompress, parse, execute, complete]
|
|
|
|
.iter()
|
|
|
|
.map(|x| (*x as f64).log10().ceil() as usize)
|
|
|
|
.max()
|
|
|
|
.unwrap()
|
|
|
|
+ 4;
|
2021-09-11 15:28:45 +00:00
|
|
|
|
|
|
|
println!();
|
|
|
|
|
|
|
|
if start > 0 {
|
2022-12-14 21:29:46 +00:00
|
|
|
println!("{start:>digits$} movies panicked or crashed the scanner");
|
2021-09-11 15:28:45 +00:00
|
|
|
}
|
|
|
|
|
2022-12-14 21:29:46 +00:00
|
|
|
println!("{read:>digits$} movies failed when reading");
|
|
|
|
println!("{decompress:>digits$} movies failed to decompress");
|
2022-10-26 23:46:09 +00:00
|
|
|
println!("{parse:>digits$} movies failed to parse");
|
2022-12-14 21:29:46 +00:00
|
|
|
println!("{execute:>digits$} movies failed to execute");
|
|
|
|
println!("{complete:>digits$} movies completed without errors");
|
2021-09-11 16:01:40 +00:00
|
|
|
println!();
|
2021-09-11 15:28:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn analyze_main(opt: AnalyzeOpt) -> Result<(), std::io::Error> {
|
|
|
|
let file = File::open(opt.input_path)?;
|
|
|
|
let reader = csv::Reader::from_reader(file);
|
|
|
|
|
|
|
|
analyze(reader.into_deserialize::<FileResults>().map(|r| {
|
|
|
|
match r {
|
|
|
|
Ok(fr) => fr,
|
|
|
|
Err(e) => {
|
|
|
|
// Treat unparseable CSV rows as a scanner panic
|
|
|
|
FileResults {
|
2022-10-26 23:46:09 +00:00
|
|
|
error: Some(format!("{e}")),
|
2021-09-11 15:28:45 +00:00
|
|
|
..FileResults::default()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|