jscanner

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit ea9dc4aeaa722ab2e95cfb57f35e319ee983927b
parent 0c9cf3e014fcdb2b3db790accccbe9c8425f5e5f
Author: Matthias Jaros <jaros@mailbox.org>
Date:   Fri, 23 Jan 2026 22:14:59 +0100

Added cli parser

Diffstat:
Msrc/main/java/com/it_jaros/networkScanner/App.java | 49++++++++++++++++++++++++-------------------------
Asrc/main/java/com/it_jaros/networkScanner/CliParser.java | 46++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/main/java/com/it_jaros/networkScanner/FdCounter.java | 43-------------------------------------------
Asrc/main/java/com/it_jaros/networkScanner/ScanTarget.java | 3+++
Msrc/main/java/com/it_jaros/networkScanner/Scanner.java | 5+++++
5 files changed, 78 insertions(+), 68 deletions(-)

diff --git a/src/main/java/com/it_jaros/networkScanner/App.java b/src/main/java/com/it_jaros/networkScanner/App.java @@ -4,39 +4,38 @@ import java.util.List; public class App { public static void main(String[] args) { - Scanner scanner = new Scanner(); - if (args.length < 1 || args[0] == "") { + try { + ScanTarget target = (new CliParser()).parseArgs(args); + Scanner scanner = new Scanner(); + List<Integer> openPorts = scanner.scanPorts(target); + printResults(target, openPorts); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); usageAndExit(); - } - String target = args[0]; - System.out.printf( - "Scanning host=%s \n", - target); - - try (FdCounter fd = new FdCounter()) { - fd.start(20); // sample every 20ms - List<Integer> openPorts = scanner.scanPorts(target, 10000); - printPorts(target, openPorts); - System.out.println("FD baseline: " + fd.baseline()); - System.out.println("FD limit: " + fd.maxFds()); - System.out.println("Peak open FDs during scan: " + fd.peakOpenFds()); + } catch (Exception e) { + System.err.println("Something went wrong"); } } - public static void printPorts(String address, List<Integer> openPorts) { - System.out.println("Address:" + address); - openPorts.forEach((p) -> System.out.println("Open port: " + p)); + public static void printResults(ScanTarget address, List<Integer> openPorts) { + System.out.println("Target: " + address.address()); + System.out.print("Ports:"); + openPorts.forEach((p) -> System.out.print(" " + p)); } - private static void usageAndExit() { + public static void usageAndExit() { System.err.println(""" - Usage: - java -jar scanner.jar <host> + Usage: + java -jar scanner.jar [OPTIONS] <host> + + Options: + --delay: Waiting period in between connection attempts for a host + --connLimit: Socket Connection limit for a host - Examples: - java -jar scanner.jar localhost - java -jar scanner.jar fd00::1 - """); + Examples: + java -jar scanner.jar localhost + java -jar scanner.jar fd00::1 + """); System.exit(1); } } diff --git a/src/main/java/com/it_jaros/networkScanner/CliParser.java b/src/main/java/com/it_jaros/networkScanner/CliParser.java @@ -0,0 +1,46 @@ +package com.it_jaros.networkScanner; + +public class CliParser { + + public ScanTarget parseArgs(String[] args) { + if (args.length < 1 || args[0].trim().equals("")) { + throw new IllegalArgumentException("No argument given"); + } + + String currentArg; + String target = null; + int socketLimit = 1000; + int delayInMillis = 0; + for (int i = 0; i < args.length; i++) { + currentArg = args[i]; + if (!currentArg.startsWith("-")) { + target = currentArg; + continue; + } + + try { + switch (currentArg) { + case "--help", "-h": + App.usageAndExit(); + case "--socketLimit", "-sl": + socketLimit = Integer.parseInt(args[++i]); + break; + case "--delay", "-d": + delayInMillis = Integer.parseInt(args[++i]); + break; + default: + throw new IllegalArgumentException("No such param " + currentArg); + } + } catch (IndexOutOfBoundsException | NumberFormatException e) { + System.out.printf("Missing or wrong argument for option %s", currentArg); + System.exit(2); + } + } + + System.out.printf( + "Scanning target '%s' with socketLimit(%s), delayInMillis(%s) \n", target, socketLimit, delayInMillis); + + return new ScanTarget(target, socketLimit, delayInMillis); + } + +} diff --git a/src/main/java/com/it_jaros/networkScanner/FdCounter.java b/src/main/java/com/it_jaros/networkScanner/FdCounter.java @@ -1,43 +0,0 @@ -package com.it_jaros.networkScanner; - -import java.lang.management.ManagementFactory; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -import com.sun.management.UnixOperatingSystemMXBean; - -public final class FdCounter implements AutoCloseable { - private final UnixOperatingSystemMXBean os = - (UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - private final ScheduledExecutorService ses = - Executors.newSingleThreadScheduledExecutor(Thread.ofPlatform().daemon().factory()); - private final AtomicLong peak = new AtomicLong(0); - private long baseline; - - public void start(long everyMillis) { - this.baseline = os.getOpenFileDescriptorCount(); - ses.scheduleAtFixedRate(() -> { - long now = os.getOpenFileDescriptorCount(); - peak.accumulateAndGet(now, Math::max); - }, 0, everyMillis, TimeUnit.MILLISECONDS); - } - - public long peakOpenFds() { - return peak.get(); - } - - public long maxFds() { - return os.getMaxFileDescriptorCount(); - } - - public long baseline() { - return this.baseline; - } - - @Override public void close() { - ses.shutdownNow(); - } -} - diff --git a/src/main/java/com/it_jaros/networkScanner/ScanTarget.java b/src/main/java/com/it_jaros/networkScanner/ScanTarget.java @@ -0,0 +1,3 @@ +package com.it_jaros.networkScanner; + +public record ScanTarget(String address, int openSocketLimit, int delay) {} diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -17,6 +17,11 @@ public class Scanner { private final int socketLimitDefault = 1024; public Scanner() {} + + public List<Integer> scanPorts(ScanTarget + target) { + return scanPorts(target.address(), target.openSocketLimit()); + } public List<Integer> scanPorts(String address) { return scanPorts(address, socketLimitDefault);