diff --git a/Cargo.lock b/Cargo.lock index 2463c3911..a7fa9cce4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -268,6 +268,16 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "crossbeam-channel" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" +dependencies = [ + "crossbeam-utils", + "maybe-uninit", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -454,7 +464,7 @@ checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] @@ -523,6 +533,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.3.3" @@ -598,6 +614,18 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +[[package]] +name = "pbr" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74333e3d1d8bced07fd0b8599304825684bcdb4a1fcc6fa6a470e6e08cefd254" +dependencies = [ + "crossbeam-channel", + "libc", + "time", + "winapi", +] + [[package]] name = "pin-project" version = "0.4.23" @@ -820,6 +848,7 @@ dependencies = [ "futures", "gcd", "log", + "pbr", "rand", "rlimit", "serde", @@ -944,6 +973,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "toml" version = "0.5.6" @@ -1001,6 +1041,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-bindgen" version = "0.2.67" diff --git a/Cargo.toml b/Cargo.toml index 783b4988e..5049ac6ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,6 +34,7 @@ toml = "0.5.6" serde = "1.0.115" serde_derive = "1.0.115" cidr-utils = "0.5.0" +pbr = "1.0.3" [package.metadata.deb] depends = "$auto, nmap" diff --git a/src/scanner/mod.rs b/src/scanner/mod.rs index 56d9d289e..0ff9895c0 100644 --- a/src/scanner/mod.rs +++ b/src/scanner/mod.rs @@ -1,15 +1,17 @@ -use super::PortStrategy; +use std::{ + io::{ErrorKind, Stdout}, + net::{IpAddr, Shutdown, SocketAddr}, + time::Duration, +}; use async_std::io; use async_std::net::TcpStream; use async_std::prelude::*; use colored::*; use futures::stream::FuturesUnordered; -use std::time::Duration; -use std::{ - io::ErrorKind, - net::{IpAddr, Shutdown, SocketAddr}, -}; +use pbr::ProgressBar; + +use super::PortStrategy; /// The class for the scanner /// IP is data type IpAddr and is the IP address @@ -48,20 +50,31 @@ impl Scanner { /// Returns all open ports as Vec pub async fn run(&self) -> Vec { let ports: Vec = self.port_strategy.order(); + let mut progress: ProgressBar = ProgressBar::new(ports.len() as u64); let batch_per_ip: usize = self.batch_size as usize / self.ips.len(); let mut open_sockets: Vec = Vec::new(); for batch in ports.chunks(batch_per_ip) { - let mut sockets = self.scan_ports(batch).await; + let mut sockets = self.scan_ports(batch, &mut progress).await; open_sockets.append(&mut sockets); } + progress.finish(); + if !self.quiet { + for socket in &open_sockets { + println!("Open {}", socket.to_string().purple()); + } + } open_sockets } /// Given a slice of sockets, scan them all. /// Returns a vector of open sockets. - async fn scan_ports(&self, ports: &[u16]) -> Vec { + async fn scan_ports( + &self, + ports: &[u16], + progress: &mut ProgressBar, + ) -> Vec { let mut ftrs = FuturesUnordered::new(); for port in ports { for ip in &self.ips { @@ -75,8 +88,10 @@ impl Scanner { Ok(socket) => open_sockets.push(socket), _ => {} } + if !self.quiet { + progress.inc(); + } } - open_sockets } @@ -100,9 +115,6 @@ impl Scanner { match x.shutdown(Shutdown::Both) { _ => {} } - if !self.quiet { - println!("Open {}", socket.to_string().purple()); - } Ok(socket) } @@ -138,11 +150,14 @@ impl Scanner { #[cfg(test)] mod tests { - use super::*; - use crate::{PortRange, ScanOrder}; - use async_std::task::block_on; use std::{net::IpAddr, time::Duration}; + use async_std::task::block_on; + + use crate::{PortRange, ScanOrder}; + + use super::*; + #[test] fn scanner_runs() { // Makes sure the program still runs and doesn't panic