diff --git a/src/main.rs b/src/main.rs index b51e00a..82fc09f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,11 @@ async fn run() -> Result<()> { let args = utils::Args::parse(); let mut ml = MuxedLines::new()?; + // HTTP statuses + let ok_statuses = args.valid_http_statuses.clone(); + let ok_statuses_parsed = parse_statuses(&ok_statuses)?; + let ok_statuses_ref = ok_statuses_parsed.as_ref(); + // generic parser let generic_path = args.generic_logpath.as_ref(); let generic_ip_re = args.generic_ip.as_ref(); @@ -65,10 +70,6 @@ async fn run() -> Result<()> { bail!("no log files to parse, see --help"); } - // HTTP statuses - let ok_statuses = args.valid_http_statuses.clone(); - let ok_statuses_ref = ok_statuses.as_ref(); - // jail let jail = Jail::new(args.allowance, args.jailtime)?; diff --git a/src/utils.rs b/src/utils.rs index 7729e7b..784a0e5 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -44,6 +44,33 @@ pub fn parse_regex(a: &str) -> Result { Ok(r) } +pub fn parse_statuses(a: &str) -> Result> { + let mut statuses = vec![]; + for s in a.split(',') { + if s.contains("xx") { + let range = s.replace("xx", ""); + let range = range.parse::().context("invalid range")?; + let range = range * 100; + for i in 0..100 { + let status = range + i; + statuses.push(status); + } + } else if s.contains("x") { + let range = s.replace("x", ""); + let range = range.parse::().context("invalid range")?; + let range = range * 10; + for i in 0..10 { + let status = range + i; + statuses.push(status); + } + } else { + let status = s.parse::().context("invalid status")?; + statuses.push(status); + } + } + Ok(statuses) +} + pub(crate) use log; #[derive(Parser, Debug)] @@ -110,7 +137,7 @@ pub struct Args { #[clap(long)] pub generic_negative: Option, - /// valid http statuses (for CLF and JSON logs) - #[clap(long, default_values_t = [200,101])] - pub valid_http_statuses: Vec, + /// valid http statuses (for CLF and JSON logs). Coma separated list, accepts ranges with XX. + #[clap(long, default_value = "10x,20x,30x,404,408")] + pub valid_http_statuses: String, }