summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-13 20:36:07 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-13 20:36:47 +0200
commit9ada0eae23e467d19edd4b45a9a3c215a320a06e (patch)
tree3f49c11b52124dc96c2a4e2b41d57e2d052348d7
parent6221afe05e7499b3062111bda22e53752bac47bb (diff)
Renamed PortResultAccumulator to PortScanResultAccumulator which matches
better what it does. Also now added feature to count appearance of certain exceptions and which ports are affected and print error log now in only one line instead of 10000x
-rw-r--r--src/main/java/com/it_jaros/jns/CliPrinter.java7
-rw-r--r--src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java4
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/PortScanResultAccumulator.java (renamed from src/main/java/com/it_jaros/jns/scan/engine/PortResultAccumulator.java)23
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java4
4 files changed, 26 insertions, 12 deletions
diff --git a/src/main/java/com/it_jaros/jns/CliPrinter.java b/src/main/java/com/it_jaros/jns/CliPrinter.java
index c8969d9..6ceb399 100644
--- a/src/main/java/com/it_jaros/jns/CliPrinter.java
+++ b/src/main/java/com/it_jaros/jns/CliPrinter.java
@@ -58,10 +58,11 @@ public class CliPrinter {
result.errors().size()
));
String errors = result.errors().stream().map((ScanFailure error) -> String.format(
- "\t%s: %s, %s",
- error.port(),
+ "\t%dx %s: %s ports: %s",
+ error.ports().size(),
error.exception().type(),
- error.exception().message()
+ error.exception().message(),
+ error.ports().stream().sorted().map(String::valueOf).collect(Collectors.joining(","))
)).collect(Collectors.joining("\n"));
sb.append(errors);
sb.append("\n");
diff --git a/src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java b/src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java
index 8a16a5d..a65d84e 100644
--- a/src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java
+++ b/src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java
@@ -2,8 +2,10 @@ package com.it_jaros.jns.scan.domain;
import com.it_jaros.jns.scan.ExceptionInfo;
+import java.util.List;
+
public record ScanFailure(
- Integer port,
+ List<Integer> ports,
ExceptionInfo exception
) {
}
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/PortResultAccumulator.java b/src/main/java/com/it_jaros/jns/scan/engine/PortScanResultAccumulator.java
index bcb6432..89238ed 100644
--- a/src/main/java/com/it_jaros/jns/scan/engine/PortResultAccumulator.java
+++ b/src/main/java/com/it_jaros/jns/scan/engine/PortScanResultAccumulator.java
@@ -7,14 +7,14 @@ import com.it_jaros.jns.scan.service.ServiceType;
import java.util.*;
-final class PortResultAccumulator {
+final class PortScanResultAccumulator {
private final String host;
private final BitSet openPorts = new BitSet(PortRange.MAX_PORT);
private final BitSet filteredPorts = new BitSet(PortRange.MAX_PORT);
private final Map<Integer, ServiceType> serviceTypes = new HashMap<>();
- private final List<ScanFailure> scanFailures = new ArrayList<>();
+ private final Map<Class<? extends Throwable>, ScanFailure> failureCounts = new HashMap<>();
- PortResultAccumulator(String host) {
+ PortScanResultAccumulator(String host) {
this.host = host;
}
@@ -31,19 +31,30 @@ final class PortResultAccumulator {
// intentional no-op for uncovered port states
}
}
- Exception e = portResult.getException();
+ final Exception e = portResult.getException();
if (e != null) {
- scanFailures.add(new ScanFailure(portResult.getPort(), ExceptionInfo.from(e)));
+ ScanFailure scanFailure = failureCounts.computeIfAbsent(
+ e.getClass(),
+ k -> new ScanFailure(
+ new ArrayList<>(),
+ ExceptionInfo.from(e)
+ )
+ );
+ scanFailure.ports().add(portResult.getPort());
}
}
+ List<ScanFailure> getFailureSummary() {
+ return failureCounts.values().stream().toList();
+ }
+
ScanResult build() {
return new ScanResult(
host,
new PortList(openPorts),
new PortList(filteredPorts),
Collections.unmodifiableMap(serviceTypes),
- Collections.unmodifiableList(scanFailures)
+ getFailureSummary()
);
}
}
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
index 675dadd..d27cae2 100644
--- a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
+++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java
@@ -16,17 +16,17 @@ public class ScanHostTask implements Callable<ScanResult> {
private final CancelledToken cancelledToken;
private InetAddress hostAddress;
+ private final PortScanResultAccumulator accumulator;
private final Scan scan;
private final ScanExecutionContext context;
private final String host; // input parameter
private final boolean disableOnlineCheck;
private final int maxWorkersPerHost;
- private final PortResultAccumulator accumulator;
public ScanHostTask(String host, ScanExecutionContext context) {
this.host = host;
this.context = context;
- this.accumulator = new PortResultAccumulator(host);
+ this.accumulator = new PortScanResultAccumulator(host);
this.cancelledToken = context.cancelledToken();
this.disableOnlineCheck = context.scanOptions().disableOnlineCheck();
this.maxWorkersPerHost = context.scanOptions().maxWorkersPerHost();