*** Wartungsfenster jeden ersten Mittwoch vormittag im Monat ***

Skip to content
Snippets Groups Projects
Commit 4493a3cc authored by Moser, Maximilian's avatar Moser, Maximilian
Browse files

Add argument parsing to the rust reporting implementation

parent 262b9b47
No related branches found
No related tags found
1 merge request!4Add Rust implementation to log parsing
......@@ -20,6 +20,12 @@ dependencies = [
"libc",
]
[[package]]
name = "argparse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47"
[[package]]
name = "autocfg"
version = "1.1.0"
......@@ -201,6 +207,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
name = "nginx-parser"
version = "0.1.0"
dependencies = [
"argparse",
"chrono",
"itertools",
"regex",
......
......@@ -6,6 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
argparse = "0.2.2"
chrono = "0.4.23"
itertools = "0.10.5"
regex = "1.7.1"
......
use chrono::{DateTime, FixedOffset};
use argparse::{ArgumentParser, Store};
use chrono::NaiveDateTime;
use itertools::Itertools;
use regex::Regex;
use std::collections::HashMap;
......@@ -20,9 +21,50 @@ impl RecordInteraction {
}
}
fn parse_datetime(string: &String) -> Option<NaiveDateTime> {
let ext_string = format!("{} 00:00:00", string);
match string.as_str() {
"" => None,
_ => match NaiveDateTime::parse_from_str(string, "%Y-%m-%d %H:%M:%S") {
Ok(timestamp) => Some(timestamp),
Err(_error) => match NaiveDateTime::parse_from_str(&ext_string, "%Y-%m-%d %H:%M:%S") {
Ok(timestamp) => Some(timestamp),
Err(_error) => {
println!("{}, {}", _error, string);
None
}
},
},
}
}
fn main() {
// TODO: argument parsing
let recid_prefix = "";
let mut min_timestamp_str: String = "".to_string();
let mut max_timestamp_str: String = "".to_string();
let mut recid_prefix: String = "".to_string();
{
// this block limits the scope of borrows for the parser.refer() methods
let mut parser = ArgumentParser::new();
parser.set_description("Nginx log parser for getting InvenioRDM record statistics");
parser.refer(&mut min_timestamp_str).add_option(
&["-s", "--start"],
Store,
"Start datetime (YYYY-MM-DD HH:MM:SS)",
);
parser.refer(&mut max_timestamp_str).add_option(
&["-e", "--end"],
Store,
"End datetime (YYYY-MM-DD HH:MM:SS)",
);
parser
.refer(&mut recid_prefix)
.add_option(&["-p", "--prefix"], Store, "Recid prefix");
parser.parse_args_or_exit();
}
let min_timestamp = parse_datetime(&min_timestamp_str);
let max_timestamp = parse_datetime(&max_timestamp_str);
let file_download_regex =
Regex::new(r"GET /records/(\w+\-\w+)/files/(.*?)(\?download=1|\?preview=\d|\s)").unwrap();
......@@ -32,19 +74,30 @@ fn main() {
Regex::new(r"\[(\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}\s+.?\d{0,4})\]").unwrap();
let mut record_interactions = HashMap::new();
let mut start_timestamp: Option<DateTime<FixedOffset>> = None;
let mut end_timestamp: Option<DateTime<FixedOffset>> = None;
let mut start_timestamp: Option<NaiveDateTime> = None;
let mut end_timestamp: Option<NaiveDateTime> = None;
for line in io::stdin().lock().lines() {
let line = line.unwrap();
// check the line for a timestamp and parse it
// TODO: capture begin & end timestamps
// TODO: `continue` if the parsed timestamp is before the supplied one
let timestamp;
if timestamp_regex.is_match(&line) {
let capture = timestamp_regex.captures(&line).unwrap();
timestamp = DateTime::parse_from_str(&capture[1], "%d/%b/%Y:%H:%M:%S %z").unwrap();
timestamp = NaiveDateTime::parse_from_str(&capture[1], "%d/%b/%Y:%H:%M:%S %z").unwrap();
// check if the line is within the user-specified bounds
if let Some(start) = min_timestamp {
if start > timestamp {
continue;
}
}
if let Some(end) = max_timestamp {
if end < timestamp {
continue;
}
}
end_timestamp = Some(timestamp);
if start_timestamp == None {
start_timestamp = Some(timestamp);
......@@ -84,10 +137,13 @@ fn main() {
}
let start = match start_timestamp {
Some(timestamp) => timestamp.to_rfc3339(),
Some(timestamp) => timestamp.format("%Y-%m-%d %H:%M:%S").to_string(),
None => panic!("No proper logs could be parsed!"),
};
let end = end_timestamp.unwrap().to_rfc3339();
let end = end_timestamp
.unwrap()
.format("%Y-%m-%d %H:%M:%S")
.to_string();
println!("Start: {}", start);
println!("End: {}", end);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment