From 4c1846f58af87983899210155b5ab4bacd42d013 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Sun, 23 Jun 2024 14:19:36 +0200 Subject: [PATCH] Add a listing of tasks and fixup chrono from and to sql --- snow-scanner/Cargo.toml | 2 +- snow-scanner/src/main.rs | 92 +++++++++++++++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/snow-scanner/Cargo.toml b/snow-scanner/Cargo.toml index c8c424c..a7081c7 100644 --- a/snow-scanner/Cargo.toml +++ b/snow-scanner/Cargo.toml @@ -34,7 +34,7 @@ rouille = "3.6.2" hmac = "0.12.1" sha2 = "0.10.8" hex = "0.4.3" -rusqlite = { version = "0.31.0", features = ["bundled"] } +rusqlite = { version = "0.31.0", features = ["bundled", "chrono"] } dns-ptr-resolver = "1.2.0" hickory-client = { version = "0.24.1", default-features = false } chrono = "0.4.38" diff --git a/snow-scanner/src/main.rs b/snow-scanner/src/main.rs index a12a131..ff03949 100644 --- a/snow-scanner/src/main.rs +++ b/snow-scanner/src/main.rs @@ -19,7 +19,7 @@ use hickory_client::client::SyncClient; use hickory_client::rr::Name; use hickory_client::tcp::TcpClientConnection; -use dns_ptr_resolver::{get_ptr, ResolvedResult, ResolvingError}; +use dns_ptr_resolver::{get_ptr, ResolvedResult}; // Create alias for HMAC-SHA256 type HmacSha256 = Hmac; @@ -86,9 +86,9 @@ fn save_scanner(conn: &Connection, scanner: &Scanner) -> Result<(), ()> { ":ip_type": &scanner.ip_type, ":scanner_name": &scanner.scanner_name, ":created_at": &scanner.created_at.to_string(), - ":updated_at": serialize_dt(scanner.updated_at), - ":last_seen_at": serialize_dt(scanner.last_seen_at), - ":last_checked_at": serialize_dt(scanner.last_checked_at) + ":updated_at": &scanner.updated_at, + ":last_seen_at": &scanner.last_seen_at, + ":last_checked_at": &scanner.last_checked_at }, ) { Ok(_) => { @@ -100,10 +100,10 @@ fn save_scanner(conn: &Connection, scanner: &Scanner) -> Result<(), ()> { } } -fn serialize_dt(dt: Option>) -> Option { +fn serialize_dt_html(dt: Option>) -> String { match dt { - Some(dt) => Some(dt.to_string()), - None => None, + Some(dt) => dt.to_string(), + None => "".to_string(), } } @@ -117,10 +117,10 @@ fn save_scan_task(conn: &Connection, scan_task: &ScanTask) -> Result<(), Rusqlit ":cidr": &scan_task.cidr, ":created_by_username": &scan_task.created_by_username, ":created_at": &scan_task.created_at.to_string(), - ":updated_at": serialize_dt(scan_task.updated_at), - ":started_at": serialize_dt(scan_task.started_at), - ":ended_at": serialize_dt(scan_task.ended_at), - ":still_processing_at": serialize_dt(scan_task.still_processing_at), + ":updated_at": &scan_task.updated_at, + ":started_at": &scan_task.started_at, + ":ended_at": &scan_task.ended_at, + ":still_processing_at": &scan_task.still_processing_at, }, ) { Ok(_) => { @@ -326,6 +326,73 @@ fn handle_list_scanners(conn: &Mutex, scanner_name: String) -> Respo } } +static SCAN_TASKS_HEAD: &str = r#" + + + Wdes - snow scanner | Scan tasks + + + + + + + + + + + + +"#; + +static SCAN_TASKS_FOOT: &str = r#" + +
CIDRStarted atStill processing atEnded at
+ + +"#; + +fn handle_list_scan_tasks(conn: &Mutex) -> Response { + let db = conn.lock().unwrap(); + + let mut stmt = db + .prepare( + r#" + SELECT task_group_id, cidr, created_by_username, unixepoch(started_at), unixepoch(still_processing_at), unixepoch(ended_at) + FROM scan_tasks + ORDER BY created_at, task_group_id ASC + "#, + ) + .unwrap(); + let mut rows = stmt.query(named_params! {}).unwrap(); + let mut html_data: Vec = vec![SCAN_TASKS_HEAD.to_string()]; + + while let Some(row) = rows.next().unwrap() { + let cidr: String = row.get(1).unwrap(); + let started_at: String = serialize_dt_html(row.get(3).unwrap()); + let still_processing_at: String = serialize_dt_html(row.get(4).unwrap()); + let ended_at: String = serialize_dt_html(row.get(5).unwrap()); + html_data.push(format!( + " + + {cidr} + {started_at} + {still_processing_at} + {ended_at} + + " + )); + } + + html_data.push(SCAN_TASKS_FOOT.to_string()); + + Response { + status_code: 200, + headers: vec![("Content-Type".into(), "text/html; charset=utf-8".into())], + data: ResponseBody::from_string(html_data.join("\n")), + upgrade: None, + } +} + fn get_connection(db_path: &str) -> Connection { let conn = Connection::open_with_flags( db_path, @@ -448,6 +515,9 @@ fn main() -> Result<()> { (POST) (/report) => {handle_report(&conn, &request)}, (POST) (/scan) => {handle_scan(&conn, &request)}, + (GET) (/scan/tasks) => { + handle_list_scan_tasks(&conn) + }, (POST) (/register) => { let data = try_or_400!(post_input!(request, {