summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-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();