diff --git a/src/database.rs b/src/database.rs index aa9740b..d85542a 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,20 +1,11 @@ -use std::{ - collections::HashSet, - io::Error, - net::IpAddr, - sync::{Arc, Mutex}, - time::Instant, -}; +use std::{net::IpAddr, sync::Arc, time::Instant}; -use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; -use memchr::memmem; -use rocksdb::{Cache, ColumnFamily, DB, IteratorMode, Options, ReadOptions, WriteBatch}; +use rocksdb::{Cache, ColumnFamily, DB, IteratorMode, Options, WriteBatch}; use serde::{Deserialize, Serialize}; use crate::port_scan::port_scan::ScanResult; static COLUMN_COUNT: usize = 5; -static TEST_ROW_COUNT: usize = 1000; // Global settings for optimal performance const BLOCK_CACHE_SIZE_MB: usize = 512; // 512MB block cache @@ -51,14 +42,6 @@ impl StringRow { } } -/// Enum for defining search criteria -#[derive(Debug)] -enum SearchCriteria { - ByColumnValue(usize, String), // Search by specific column value - ByColumnPrefix(usize, String), // Search by column value prefix - // ByIdRange(String, String), // Search by ID range -} - impl ResultDatabase { pub fn new(path: &str) -> Self { let mut options = Options::default(); @@ -256,7 +239,7 @@ impl ResultDatabase { if value_str.contains(substring) { // Convert key to string and add to results if let Ok(key_str) = std::str::from_utf8(&key_bytes) { - if let Some(row) = decode_row_binary(&value_bytes) { + if let Some(row) = decode_row_binary(key_str, &value_bytes) { matching_keys.push(row); } } @@ -268,95 +251,6 @@ impl ResultDatabase { } } -// Count results from a search without printing -fn search( - db: &DB, - cf_default: &ColumnFamily, - cf_columns: &[&ColumnFamily], - criteria: SearchCriteria, -) -> Result, Box> { - let mut results: Vec = Vec::new(); - - match criteria { - SearchCriteria::ByColumnValue(col_idx, value) => { - if col_idx >= cf_columns.len() { - return Ok(results); - } - - // Create search key with escaped value - let prefix = format!("{}:", fast_escape(&value)); - let mut opts = ReadOptions::default(); - opts.set_prefix_same_as_start(true); - - let iterator = db.iterator_cf_opt( - cf_columns[col_idx], - opts, - rocksdb::IteratorMode::From(prefix.as_bytes(), rocksdb::Direction::Forward), - ); - - for item in iterator { - let (idx_key, data) = item?; - let idx_key_str = String::from_utf8(idx_key.to_vec())?; - - // Skip if we've moved past our prefix - if !idx_key_str.starts_with(&prefix) { - break; - } - - let row = decode_row_binary(&data); - - if let Some(row) = row { - results.push(row); - } - } - } - - SearchCriteria::ByColumnPrefix(col_idx, prefix) => { - if col_idx >= cf_columns.len() { - return Ok(results); - } - - // Create search key with escaped prefix - let search_prefix = fast_escape(&prefix); - - let iterator = db.iterator_cf( - cf_columns[col_idx], - rocksdb::IteratorMode::From(search_prefix.as_bytes(), rocksdb::Direction::Forward), - ); - - for item in iterator { - let (idx_key, data) = item?; - let idx_key_str = String::from_utf8(idx_key.to_vec())?; - - // Extract just the value part of the index key - let parts: Vec<&str> = idx_key_str.splitn(2, ':').collect(); - if parts.len() < 2 { - continue; - } - - let value_part = fast_unescape(parts[0]); - - // Skip if value doesn't start with our prefix - if !value_part.starts_with(&prefix) { - // If we've moved past potential matches, break early - if value_part > prefix { - break; - } - continue; - } - - let row = decode_row_binary(&data); - - if let Some(row) = row { - results.push(row); - } - } - } - } - - Ok(results) -} - // Fast minimal escaping for key values #[inline] fn fast_escape(s: &str) -> String { @@ -366,62 +260,22 @@ fn fast_escape(s: &str) -> String { // Fast unescaping for key values #[inline] -fn fast_unescape(s: &str) -> String { - // Only unescape the colon - s.replace("\\:", ":") -} // Fast direct row fetch by ID fn fetch_row(db: &DB, cf_default: &ColumnFamily, row_id: &str) -> Option { match db.get_cf(cf_default, row_id.as_bytes()) { - Ok(Some(value)) => decode_row_binary(&value), + Ok(Some(value)) => decode_row_binary(row_id, &value), _ => None, } } - -// Fast column value fetch -fn fetch_column(db: &DB, cf_default: &ColumnFamily, row_id: &str, column_idx: usize) -> String { - match fetch_row(db, cf_default, row_id) { - Some(row) => get_column_value(&row, column_idx), - None => String::new(), - } -} - -// Get a column value, returning empty string if column doesn't exist -#[inline] -fn get_column_value(row: &StringRow, column_index: usize) -> String { - if column_index < row.values.len() { - row.values[column_index].clone() - } else { - String::new() // Return empty string for missing columns - } -} - // Binary decoding of row data -fn decode_row_binary(data: &[u8]) -> Option { +fn decode_row_binary(key: &str, data: &[u8]) -> Option { if data.len() < 8 { return None; } let mut pos = 0; - // Read ID length - let mut id_len_bytes = [0u8; 4]; - id_len_bytes.copy_from_slice(&data[pos..pos + 4]); - let id_len = u32::from_le_bytes(id_len_bytes) as usize; - pos += 4; - - // Read ID - if pos + id_len > data.len() { - return None; - } - let id = String::from_utf8_lossy(&data[pos..pos + id_len]).to_string(); - pos += id_len; - - // Read number of values - if pos + 4 > data.len() { - return None; - } let mut values_count_bytes = [0u8; 4]; values_count_bytes.copy_from_slice(&data[pos..pos + 4]); let values_count = u32::from_le_bytes(values_count_bytes) as usize; @@ -448,16 +302,14 @@ fn decode_row_binary(data: &[u8]) -> Option { pos += value_len; } - Some(StringRow { id, values }) + Some(StringRow { + id: key.to_string(), + values, + }) } // Binary encoding of row data for maximum performance fn encode_row_binary(buf: &mut Vec, row: &StringRow) { - // Write ID length and ID - let id_bytes = row.id.as_bytes(); - buf.extend_from_slice(&(id_bytes.len() as u32).to_le_bytes()); - buf.extend_from_slice(id_bytes); - // Write number of values buf.extend_from_slice(&(row.values.len() as u32).to_le_bytes()); @@ -468,157 +320,3 @@ fn encode_row_binary(buf: &mut Vec, row: &StringRow) { buf.extend_from_slice(value_bytes); } } - -// fn benchmark_create_rows() { -// for i in 0..10000 { -// // Generate 10,000 test rows -// let mut values = Vec::with_capacity(5); - -// // Add IP address (column 0) -// if i % 3 == 0 { -// values.push(format!("192.168.1.{}", i % 255)); -// } else if i % 3 == 1 { -// values.push(format!("10.0.{}.{}", (i / 255) % 255, i % 255)); -// } else { -// values.push(format!("172.16.{}.{}", (i / 255) % 255, i % 255)); -// } - -// // Add status (column 1) -// if i % 5 < 4 { -// // 80% active -// values.push("active".to_string()); -// } else { -// values.push("inactive".to_string()); -// } - -// // Add response time (column 2) for active servers -// if i % 5 < 4 { -// values.push(format!("{}ms", (i % 100) + 1)); -// } - -// // Add server name (column 3) -// if i % 2 == 0 { -// values.push(format!("server{:04}", i)); -// } - -// // Add priority (column 4) for some servers -// if i % 7 == 0 { -// values.push("high_priority".to_string()); -// } else if i % 11 == 0 { -// values.push("low_priority".to_string()); -// } - -// // string_rows.push(StringRow { -// // id: format!("row{:06}", i), -// // values, -// // }); -// } -// } - -// // Benchmark search performance -// fn benchmark_search( -// db: &DB, -// cf_default: &ColumnFamily, -// cf_columns: &[&ColumnFamily], -// name: &str, -// criteria_fn: F, -// ) -> Result<(), Box> -// where -// F: Fn() -> SearchCriteria, -// { -// let mut total_duration = Duration::from_secs(0); -// let mut total_results = 0; - -// for i in 1..=3 { -// let criteria = criteria_fn(); -// let start = Instant::now(); -// let count = count_search_results(db, cf_default, cf_columns, criteria)?; -// let duration = start.elapsed(); - -// total_duration += duration; -// total_results = count; // All runs should return same count - -// println!(" Run {}: Found {} results in {:?}", i, count, duration); -// } - -// let avg_duration = total_duration / 3; -// println!( -// " Average: {:?} for {} results", -// avg_duration, total_results -// ); -// println!( -// " Speed: {:.2} results/ms", -// total_results as f64 / avg_duration.as_millis() as f64 -// ); - -// Ok(()) -// } - -// // Benchmark direct row fetch performance -// fn benchmark_direct_fetch( -// db: &DB, -// cf_default: &ColumnFamily, -// name: &str, -// row_id: &str, -// ) -> Result<(), Box> { -// let mut total_duration = Duration::from_secs(0); - -// for i in 1..=3 { -// let start = Instant::now(); - -// // Do multiple fetches to get a measurable time -// for _ in 0..1000 { -// let _ = fetch_row(db, cf_default, row_id); -// } - -// let duration = start.elapsed(); -// total_duration += duration; - -// println!(" Run {}: 1000 row fetches in {:?}", i, duration); -// } - -// let avg_duration = total_duration / 3; -// println!(" Average: {:?} for 1000 fetches", avg_duration); -// println!( -// " Speed: {:.2} fetches/ms", -// 1000.0 / avg_duration.as_millis() as f64 -// ); - -// Ok(()) -// } - -// // Benchmark column fetch performance -// fn benchmark_column_fetch( -// db: &DB, -// cf_default: &ColumnFamily, -// name: &str, -// row_id: &str, -// col_idx: usize, -// ) -> Result<(), Box> { -// let mut total_duration = Duration::from_secs(0); - -// for i in 1..=3 { -// let start = Instant::now(); - -// // Do multiple fetches to get a measurable time -// for _ in 0..1000 { -// let _ = fetch_column(db, cf_default, row_id, col_idx); -// } - -// let duration = start.elapsed(); -// total_duration += duration; - -// println!(" Run {}: 1000 column fetches in {:?}", i, duration); -// } - -// let avg_duration = total_duration / 3; -// println!(" Average: {:?} for 1000 fetches", avg_duration); -// println!( -// " Speed: {:.2} fetches/ms", -// 1000.0 / avg_duration.as_millis() as f64 -// ); - -// Ok(()) -// } -// -// // Example usage with batching for very large datasets diff --git a/src/main.rs b/src/main.rs index 54cc4e4..87870ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ use std::{env, net::IpAddr, time::Duration}; -use online_scan::PingResult; use parse_ip_range::parse_ip_targets; use untitled::{database::ResultDatabase, online_scan, parse_ip_range, port_scan::tcp_scan}; +const BATCH_SIZE: usize = 4096; + fn main() -> Result<(), Box> { let args: Vec = env::args().collect(); let database = ResultDatabase::new("ping_result_database"); @@ -66,89 +67,105 @@ fn scan( let _ = database.add_ping_results(&up_hosts); } "tcp" => { - let length = hosts.len(); + let chunks = hosts.chunks(BATCH_SIZE); + let num_chunks = chunks.len(); + for (i, hosts) in chunks.enumerate() { + let hosts = hosts.to_vec(); + let length = hosts.len(); - let up_hosts: Vec = online_scan::ping_scanner::ping_scan(hosts).unwrap(); - println!("Finished! {} Scanned, {} Up", length, up_hosts.len()); - let _ = database.add_ping_results(&up_hosts); + println!("Scanning chunk {}/{} ({} hosts)", i + 1, num_chunks, length); - let tcp_ports = vec![ - 1, 3, 4, 6, 7, 9, 13, 17, 19, 20, 21, 22, 23, 24, 25, 26, 30, 32, 33, 37, 42, 43, - 49, 53, 70, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 99, 100, 106, 109, 110, 111, - 113, 119, 125, 135, 139, 143, 144, 146, 161, 163, 179, 199, 211, 212, 222, 254, - 255, 256, 259, 264, 280, 301, 306, 311, 340, 366, 389, 406, 407, 416, 417, 425, - 427, 443, 444, 445, 458, 464, 465, 481, 497, 500, 512, 513, 514, 515, 524, 541, - 543, 544, 545, 548, 554, 555, 563, 587, 593, 616, 617, 625, 631, 636, 646, 648, - 666, 667, 668, 683, 687, 691, 700, 705, 711, 714, 720, 722, 726, 749, 765, 777, - 783, 787, 800, 801, 808, 843, 873, 880, 888, 898, 900, 901, 902, 903, 911, 912, - 981, 987, 990, 992, 993, 995, 999, 1000, 1001, 1002, 1007, 1009, 1010, 1011, 1021, - 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, - 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, - 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1102, 1104, 1105, 1106, 1107, - 1108, 1110, 1111, 1112, 1113, 1114, 1117, 1119, 1121, 1122, 1123, 1124, 1126, 1130, - 1131, 1132, 1137, 1138, 1141, 1145, 1147, 1148, 1149, 1151, 1152, 1154, 1163, 1164, - 1165, 1166, 1169, 1174, 1175, 1183, 1185, 1186, 1187, 1192, 1198, 1199, 1201, 1213, - 1216, 1217, 1218, 1233, 1234, 1236, 1244, 1247, 1248, 1259, 1271, 1272, 1277, 1287, - 1296, 1300, 1301, 1309, 1310, 1311, 1322, 1328, 1334, 1352, 1417, 1433, 1434, 1443, - 1455, 1461, 1494, 1500, 1501, 1503, 1521, 1524, 1533, 1556, 1580, 1583, 1594, 1600, - 1641, 1658, 1666, 1687, 1688, 1700, 1717, 1718, 1719, 1720, 1721, 1723, 1755, 1761, - 1782, 1783, 1801, 1805, 1812, 1839, 1840, 1862, 1863, 1864, 1875, 1900, 1914, 1935, - 1947, 1971, 1972, 1974, 1984, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2008, 2009, 2010, 2013, 2020, 2021, 2022, 2030, 2033, 2034, 2035, 2038, 2040, - 2041, 2042, 2043, 2045, 2046, 2047, 2048, 2049, 2065, 2068, 2099, 2100, 2103, 2105, - 2106, 2107, 2111, 2119, 2121, 2126, 2135, 2144, 2160, 2161, 2170, 2179, 2190, 2191, - 2196, 2200, 2222, 2251, 2260, 2288, 2301, 2323, 2366, 2381, 2382, 2383, 2393, 2394, - 2399, 2401, 2492, 2500, 2522, 2525, 2557, 2601, 2602, 2604, 2605, 2607, 2608, 2638, - 2701, 2702, 2710, 2717, 2718, 2725, 2800, 2809, 2811, 2869, 2875, 2909, 2910, 2920, - 2967, 2968, 2998, 3000, 3001, 3003, 3005, 3006, 3007, 3011, 3013, 3017, 3030, 3031, - 3052, 3071, 3077, 3128, 3168, 3211, 3221, 3260, 3261, 3268, 3269, 3283, 3300, 3301, - 3306, 3322, 3323, 3324, 3325, 3333, 3351, 3367, 3369, 3370, 3371, 3372, 3389, 3390, - 3404, 3476, 3493, 3517, 3527, 3546, 3551, 3580, 3659, 3689, 3690, 3703, 3737, 3766, - 3784, 3800, 3801, 3809, 3814, 3826, 3827, 3828, 3851, 3869, 3871, 3878, 3880, 3889, - 3905, 3914, 3918, 3920, 3945, 3971, 3986, 3995, 3998, 4000, 4001, 4002, 4003, 4004, - 4005, 4006, 4045, 4111, 4125, 4126, 4129, 4224, 4242, 4279, 4321, 4343, 4443, 4444, - 4445, 4446, 4449, 4550, 4567, 4662, 4848, 4899, 4900, 4998, 5000, 5001, 5002, 5003, - 5004, 5009, 5030, 5033, 5050, 5051, 5054, 5060, 5061, 5080, 5087, 5100, 5101, 5102, - 5120, 5190, 5200, 5214, 5221, 5222, 5225, 5226, 5269, 5280, 5298, 5357, 5405, 5414, - 5431, 5432, 5440, 5500, 5510, 5544, 5550, 5555, 5560, 5566, 5631, 5633, 5666, 5678, - 5679, 5718, 5730, 5800, 5801, 5802, 5810, 5811, 5815, 5822, 5825, 5850, 5859, 5862, - 5877, 5900, 5901, 5902, 5903, 5904, 5906, 5907, 5910, 5911, 5915, 5922, 5925, 5950, - 5952, 5959, 5960, 5961, 5962, 5963, 5987, 5988, 5989, 5998, 5999, 6000, 6001, 6002, - 6003, 6004, 6005, 6006, 6007, 6009, 6025, 6059, 6100, 6101, 6106, 6112, 6123, 6129, - 6156, 6346, 6389, 6502, 6510, 6543, 6547, 6565, 6566, 6567, 6580, 6646, 6666, 6667, - 6668, 6669, 6689, 6692, 6699, 6779, 6788, 6789, 6792, 6839, 6881, 6901, 6969, 7000, - 7001, 7002, 7004, 7007, 7019, 7025, 7070, 7100, 7103, 7106, 7200, 7201, 7402, 7435, - 7443, 7496, 7512, 7625, 7627, 7676, 7741, 7777, 7778, 7800, 7911, 7920, 7921, 7937, - 7938, 7999, 8000, 8001, 8002, 8007, 8008, 8009, 8010, 8011, 8021, 8022, 8031, 8042, - 8045, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8093, 8099, - 8100, 8180, 8181, 8192, 8193, 8194, 8200, 8222, 8254, 8290, 8291, 8292, 8300, 8333, - 8383, 8400, 8402, 8443, 8500, 8600, 8649, 8651, 8652, 8654, 8701, 8800, 8873, 8888, - 8899, 8994, 9000, 9001, 9002, 9003, 9009, 9010, 9011, 9040, 9050, 9071, 9080, 9081, - 9090, 9091, 9099, 9100, 9101, 9102, 9103, 9110, 9111, 9200, 9207, 9220, 9290, 9415, - 9418, 9485, 9500, 9502, 9503, 9535, 9575, 9593, 9594, 9595, 9618, 9666, 9876, 9877, - 9878, 9898, 9900, 9917, 9929, 9943, 9944, 9968, 9998, 9999, 10000, 10001, 10002, - 10003, 10004, 10009, 10010, 10012, 10024, 10025, 10082, 10180, 10215, 10243, 10566, - 10616, 10617, 10621, 10626, 10628, 10629, 10778, 11110, 11111, 11967, 12000, 12174, - 12265, 12345, 13456, 13722, 13782, 13783, 14000, 14238, 14441, 14442, 15000, 15002, - 15003, 15004, 15660, 15742, 16000, 16001, 16012, 16016, 16018, 16080, 16113, 16992, - 16993, 17877, 17988, 18040, 18101, 18988, 19101, 19283, 19315, 19350, 19780, 19801, - 19842, 20000, 20005, 20031, 20221, 20222, 20828, 21571, 22939, 23502, 24444, 24800, - 25734, 25735, 26214, 27000, 27352, 27353, 27355, 27356, 27715, 28201, 30000, 30718, - 30951, 31038, 31337, 32768, 32769, 32770, 32771, 32772, 32773, 32774, 32775, 32776, - 32777, 32778, 32779, 32780, 32781, 32782, 32783, 32784, 32785, 33354, 33899, 34571, - 34572, 34573, 35500, 38292, 40193, 40911, 41511, 42510, 44176, 44442, 44443, 44501, - 45100, 48080, 49152, 49153, 49154, 49155, 49156, 49157, 49158, 49159, 49160, 49161, - 49163, 49165, 49167, 49175, 49176, 49400, 49999, 50000, 50001, 50002, 50003, 50006, - 50300, 50389, 50500, 50636, 50800, 51103, 51493, 52673, 52822, 52848, 52869, 54045, - 54328, 55055, 55056, 55555, 55600, 56737, 56738, 57294, 57797, 58080, 60020, 60443, - 61532, 61900, 62078, 63331, 64623, 64680, 65000, 65129, 65389, - ]; + let up_hosts: Vec = online_scan::ping_scanner::ping_scan(hosts).unwrap(); + println!( + "Finished Pinging! {} Scanned, {} Up", + length, + up_hosts.len() + ); + let _ = database.add_ping_results(&up_hosts); - let tcp_results = tcp_scan::tcp_scan(up_hosts, tcp_ports, Duration::from_secs(3)); - let _ = database.add_tcp_results(&tcp_results); + let tcp_ports = vec![ + 25565, 3, 4, 6, 7, 9, 13, 17, 19, 20, 21, 22, 23, 24, 25, 26, 30, 32, 33, 37, + 42, 43, 49, 53, 70, 79, 80, 81, 82, 83, 84, 85, 88, 89, 90, 99, 100, 106, 109, + 110, 111, 113, 119, 125, 135, 139, 143, 144, 146, 161, 163, 179, 199, 211, 212, + 222, 254, 255, 256, 259, 264, 280, 301, 306, 311, 340, 366, 389, 406, 407, 416, + 417, 425, 427, 443, 444, 445, 458, 464, 465, 481, 497, 500, 512, 513, 514, 515, + 524, 541, 543, 544, 545, 548, 554, 555, 563, 587, 593, 616, 617, 625, 631, 636, + 646, 648, 666, 667, 668, 683, 687, 691, 700, 705, 711, 714, 720, 722, 726, 749, + 765, 777, 783, 787, 800, 801, 808, 843, 873, 880, 888, 898, 900, 901, 902, 903, + 911, 912, 981, 987, 990, 992, 993, 995, 999, 1000, 1001, 1002, 1007, 1009, + 1010, 1011, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, + 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, + 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, + 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, + 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1102, 1104, 1105, 1106, 1107, 1108, 1110, 1111, 1112, + 1113, 1114, 1117, 1119, 1121, 1122, 1123, 1124, 1126, 1130, 1131, 1132, 1137, + 1138, 1141, 1145, 1147, 1148, 1149, 1151, 1152, 1154, 1163, 1164, 1165, 1166, + 1169, 1174, 1175, 1183, 1185, 1186, 1187, 1192, 1198, 1199, 1201, 1213, 1216, + 1217, 1218, 1233, 1234, 1236, 1244, 1247, 1248, 1259, 1271, 1272, 1277, 1287, + 1296, 1300, 1301, 1309, 1310, 1311, 1322, 1328, 1334, 1352, 1417, 1433, 1434, + 1443, 1455, 1461, 1494, 1500, 1501, 1503, 1521, 1524, 1533, 1556, 1580, 1583, + 1594, 1600, 1641, 1658, 1666, 1687, 1688, 1700, 1717, 1718, 1719, 1720, 1721, + 1723, 1755, 1761, 1782, 1783, 1801, 1805, 1812, 1839, 1840, 1862, 1863, 1864, + 1875, 1900, 1914, 1935, 1947, 1971, 1972, 1974, 1984, 1998, 1999, 2000, 2001, + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2013, 2020, 2021, 2022, + 2030, 2033, 2034, 2035, 2038, 2040, 2041, 2042, 2043, 2045, 2046, 2047, 2048, + 2049, 2065, 2068, 2099, 2100, 2103, 2105, 2106, 2107, 2111, 2119, 2121, 2126, + 2135, 2144, 2160, 2161, 2170, 2179, 2190, 2191, 2196, 2200, 2222, 2251, 2260, + 2288, 2301, 2323, 2366, 2381, 2382, 2383, 2393, 2394, 2399, 2401, 2492, 2500, + 2522, 2525, 2557, 2601, 2602, 2604, 2605, 2607, 2608, 2638, 2701, 2702, 2710, + 2717, 2718, 2725, 2800, 2809, 2811, 2869, 2875, 2909, 2910, 2920, 2967, 2968, + 2998, 3000, 3001, 3003, 3005, 3006, 3007, 3011, 3013, 3017, 3030, 3031, 3052, + 3071, 3077, 3128, 3168, 3211, 3221, 3260, 3261, 3268, 3269, 3283, 3300, 3301, + 3306, 3322, 3323, 3324, 3325, 3333, 3351, 3367, 3369, 3370, 3371, 3372, 3389, + 3390, 3404, 3476, 3493, 3517, 3527, 3546, 3551, 3580, 3659, 3689, 3690, 3703, + 3737, 3766, 3784, 3800, 3801, 3809, 3814, 3826, 3827, 3828, 3851, 3869, 3871, + 3878, 3880, 3889, 3905, 3914, 3918, 3920, 3945, 3971, 3986, 3995, 3998, 4000, + 4001, 4002, 4003, 4004, 4005, 4006, 4045, 4111, 4125, 4126, 4129, 4224, 4242, + 4279, 4321, 4343, 4443, 4444, 4445, 4446, 4449, 4550, 4567, 4662, 4848, 4899, + 4900, 4998, 5000, 5001, 5002, 5003, 5004, 5009, 5030, 5033, 5050, 5051, 5054, + 5060, 5061, 5080, 5087, 5100, 5101, 5102, 5120, 5190, 5200, 5214, 5221, 5222, + 5225, 5226, 5269, 5280, 5298, 5357, 5405, 5414, 5431, 5432, 5440, 5500, 5510, + 5544, 5550, 5555, 5560, 5566, 5631, 5633, 5666, 5678, 5679, 5718, 5730, 5800, + 5801, 5802, 5810, 5811, 5815, 5822, 5825, 5850, 5859, 5862, 5877, 5900, 5901, + 5902, 5903, 5904, 5906, 5907, 5910, 5911, 5915, 5922, 5925, 5950, 5952, 5959, + 5960, 5961, 5962, 5963, 5987, 5988, 5989, 5998, 5999, 6000, 6001, 6002, 6003, + 6004, 6005, 6006, 6007, 6009, 6025, 6059, 6100, 6101, 6106, 6112, 6123, 6129, + 6156, 6346, 6389, 6502, 6510, 6543, 6547, 6565, 6566, 6567, 6580, 6646, 6666, + 6667, 6668, 6669, 6689, 6692, 6699, 6779, 6788, 6789, 6792, 6839, 6881, 6901, + 6969, 7000, 7001, 7002, 7004, 7007, 7019, 7025, 7070, 7100, 7103, 7106, 7200, + 7201, 7402, 7435, 7443, 7496, 7512, 7625, 7627, 7676, 7741, 7777, 7778, 7800, + 7911, 7920, 7921, 7937, 7938, 7999, 8000, 8001, 8002, 8007, 8008, 8009, 8010, + 8011, 8021, 8022, 8031, 8042, 8045, 8080, 8081, 8082, 8083, 8084, 8085, 8086, + 8087, 8088, 8089, 8090, 8093, 8099, 8100, 8180, 8181, 8192, 8193, 8194, 8200, + 8222, 8254, 8290, 8291, 8292, 8300, 8333, 8383, 8400, 8402, 8443, 8500, 8600, + 8649, 8651, 8652, 8654, 8701, 8800, 8873, 8888, 8899, 8994, 9000, 9001, 9002, + 9003, 9009, 9010, 9011, 9040, 9050, 9071, 9080, 9081, 9090, 9091, 9099, 9100, + 9101, 9102, 9103, 9110, 9111, 9200, 9207, 9220, 9290, 9415, 9418, 9485, 9500, + 9502, 9503, 9535, 9575, 9593, 9594, 9595, 9618, 9666, 9876, 9877, 9878, 9898, + 9900, 9917, 9929, 9943, 9944, 9968, 9998, 9999, 10000, 10001, 10002, 10003, + 10004, 10009, 10010, 10012, 10024, 10025, 10082, 10180, 10215, 10243, 10566, + 10616, 10617, 10621, 10626, 10628, 10629, 10778, 11110, 11111, 11967, 12000, + 12174, 12265, 12345, 13456, 13722, 13782, 13783, 14000, 14238, 14441, 14442, + 15000, 15002, 15003, 15004, 15660, 15742, 16000, 16001, 16012, 16016, 16018, + 16080, 16113, 16992, 16993, 17877, 17988, 18040, 18101, 18988, 19101, 19283, + 19315, 19350, 19780, 19801, 19842, 20000, 20005, 20031, 20221, 20222, 20828, + 21571, 22939, 23502, 24444, 24800, 25734, 25735, 26214, 27000, 27352, 27353, + 27355, 27356, 27715, 28201, 30000, 30718, 30951, 31038, 31337, 32768, 32769, + 32770, 32771, 32772, 32773, 32774, 32775, 32776, 32777, 32778, 32779, 32780, + 32781, 32782, 32783, 32784, 32785, 33354, 33899, 34571, 34572, 34573, 35500, + 38292, 40193, 40911, 41511, 42510, 44176, 44442, 44443, 44501, 45100, 48080, + 49152, 49153, 49154, 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49163, + 49165, 49167, 49175, 49176, 49400, 49999, 50000, 50001, 50002, 50003, 50006, + 50300, 50389, 50500, 50636, 50800, 51103, 51493, 52673, 52822, 52848, 52869, + 54045, 54328, 55055, 55056, 55555, 55600, 56737, 56738, 57294, 57797, 58080, + 60020, 60443, 61532, 61900, 62078, 63331, 64623, 64680, 65000, 65129, 65389, + ]; + + let tcp_results = tcp_scan::tcp_scan(up_hosts, tcp_ports, Duration::from_secs(3)); + let _ = database.add_tcp_results(&tcp_results); + } } _ => { println!("Invalid search type!"); diff --git a/src/online_scan/ping_scanner.rs b/src/online_scan/ping_scanner.rs index 79ffa6e..e920410 100644 --- a/src/online_scan/ping_scanner.rs +++ b/src/online_scan/ping_scanner.rs @@ -19,8 +19,6 @@ static TIMEOUT: Duration = Duration::from_secs(3); // static MAX_PINGS_PER_SECOND: u64 = 10000; static SEND_DELAY_NANOS: Duration = Duration::from_micros(10); -use crate::online_scan::PingResult; - pub fn ping_scan(hosts: Vec) -> Result, Box> { let results = Arc::new(Mutex::new(Vec::::new())); @@ -42,7 +40,6 @@ pub fn ping_scan(hosts: Vec) -> Result, Box = None; // let mut pb: Option = None; @@ -84,7 +81,6 @@ pub fn ping_scan(hosts: Vec) -> Result, Box, ports: Vec, timeout: Duration) -> Vec let results_map = results.lock().unwrap(); targets .iter() - .map(|ip| ScanResult { - ip: *ip, - open_ports: results_map.get(ip).cloned().unwrap_or_default(), + .map(|ip| { + let mut open_ports = results_map.get(ip).cloned().unwrap_or_default(); + open_ports.sort(); + ScanResult { + ip: *ip, + open_ports, + } }) .collect() }