commit ea9dc4aeaa722ab2e95cfb57f35e319ee983927b
parent 0c9cf3e014fcdb2b3db790accccbe9c8425f5e5f
Author: Matthias Jaros <jaros@mailbox.org>
Date: Fri, 23 Jan 2026 22:14:59 +0100
Added cli parser
Diffstat:
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);