diff options
| author | 2026-08-13 20:36:07 +0200 | |
|---|---|---|
| committer | 2026-08-13 20:36:47 +0200 | |
| commit | 9ada0eae23e467d19edd4b45a9a3c215a320a06e (patch) | |
| tree | 3f49c11b52124dc96c2a4e2b41d57e2d052348d7 /src/main | |
| parent | 6221afe05e7499b3062111bda22e53752bac47bb (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
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/com/it_jaros/jns/CliPrinter.java | 7 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jns/scan/domain/ScanFailure.java | 4 | ||||
| -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.java | 4 |
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(); |
