From 604417d8b2842e3683b69ee2635f7a366a96446b Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Mon, 30 Mar 2026 12:20:33 +0200 Subject: Refactored cli option parsing and added -file option. Refactored reading of hosts to have less redundancy. --- .../java/com/it_jaros/network_scanner/Scanner.java | 35 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/it_jaros/network_scanner/Scanner.java') diff --git a/src/main/java/com/it_jaros/network_scanner/Scanner.java b/src/main/java/com/it_jaros/network_scanner/Scanner.java index d70a446..0969c5a 100644 --- a/src/main/java/com/it_jaros/network_scanner/Scanner.java +++ b/src/main/java/com/it_jaros/network_scanner/Scanner.java @@ -1,7 +1,12 @@ package com.it_jaros.network_scanner; +import java.io.BufferedReader; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.*; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.BitSet; import java.util.List; @@ -9,6 +14,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.LockSupport; +import java.util.stream.Stream; public class Scanner { @@ -31,16 +37,41 @@ public class Scanner { } public List scan(ScanOptions options) { + if (options.file() != null) { + return scanHosts(options.file(), options.ports()); + } return scanHosts(options.targetHosts(), options.ports()); } + public List scanHosts(String sourceFile, String ports) { + try (BufferedReader reader = Files.newBufferedReader(Path.of(sourceFile))) { + return scanHosts(reader.lines(), ports); + } catch (FileNotFoundException | NoSuchFileException e) { + System.out.printf("Could not open file %s%n", sourceFile); + } catch (IOException e) { + System.out.printf("Error while trying to read hosts: %s -> %s %n", e.getClass().getSimpleName(), e.getMessage()); + } + + return List.of(); + } + public List scanHosts(List targetHosts, String ports) { + try (Stream stream = targetHosts.stream()){ + return scanHosts(stream, ports); + } catch (IOException e) { + System.out.printf("Error while trying to read hosts: %s -> %s %n", e.getClass().getSimpleName(), e.getMessage()); + } + + return List.of(); + } + + public List scanHosts(Stream hosts, String ports) throws IOException { List results = new ArrayList<>(); progressBar.start(); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { List> futures = new ArrayList<>(); Semaphore maxHosts = new Semaphore(maxHostsLimit); - for (String host : targetHosts) { + hosts.forEach((final String host) -> { maxHosts.acquireUninterruptibly(); futures.add(executor.submit(() -> { try { @@ -49,7 +80,7 @@ public class Scanner { maxHosts.release(); } })); - } + }); futures.forEach((Future f) -> { try { -- cgit v1.3.1