diff options
| author | 2026-08-13 20:34:15 +0200 | |
|---|---|---|
| committer | 2026-08-13 20:34:15 +0200 | |
| commit | 6221afe05e7499b3062111bda22e53752bac47bb (patch) | |
| tree | 045c616ae4ca816455b89675fbf654eae4865fb5 /src/main/java/com | |
| parent | 8f94145316a998867a7bb077cd869b896dde48c5 (diff) | |
Added ScanHostException to wrap lower level Exceptions and also encode
host info in it.
Diffstat (limited to 'src/main/java/com')
4 files changed, 32 insertions, 11 deletions
diff --git a/src/main/java/com/it_jaros/jns/scan/Scanner.java b/src/main/java/com/it_jaros/jns/scan/Scanner.java index f081f29..76a802e 100644 --- a/src/main/java/com/it_jaros/jns/scan/Scanner.java +++ b/src/main/java/com/it_jaros/jns/scan/Scanner.java @@ -58,7 +58,15 @@ public class Scanner implements AutoCloseable { if (poll instanceof PollState.Success<ScanResult>(ScanResult value)) { consumer.accept(value); } else if (poll instanceof PollState.Failure<ScanResult>(Throwable error)) { - System.err.printf("runScan(): ScanHostTask() failed with error %s -> %s%n", error.getClass().getSimpleName(), error.getMessage()); + if (error instanceof RejectedExecutionException) { + // happens when strg-c is pressed + continue; + } + if (error instanceof ScanHostException) { + System.err.printf("runScan(): ScanHostTask(%s) failed with error %s -> %s%n", error.getMessage(), error.getCause().getClass().getSimpleName(), error.getCause().getMessage()); + } else { + System.err.printf("runScan(): ScanHostTask() failed with error %s -> %s%n", error.getClass().getSimpleName(), error.getCause().getMessage()); + } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java new file mode 100644 index 0000000..cc05b55 --- /dev/null +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostException.java @@ -0,0 +1,7 @@ +package com.it_jaros.jns.scan.engine; + +public class ScanHostException extends Exception { + public ScanHostException(String host, Exception e) { + super(host, e); + } +} 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 24928d9..675dadd 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 @@ -6,6 +6,7 @@ import com.it_jaros.jns.scan.domain.PortResult; import com.it_jaros.jns.scan.domain.PortState; import com.it_jaros.jns.scan.domain.ScanResult; +import java.net.InetAddress; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -13,10 +14,11 @@ import java.util.concurrent.TimeUnit; public class ScanHostTask implements Callable<ScanResult> { + private final CancelledToken cancelledToken; + private InetAddress hostAddress; private final Scan scan; - private final String host; // input parameter private final ScanExecutionContext context; - private final CancelledToken cancelledToken; + private final String host; // input parameter private final boolean disableOnlineCheck; private final int maxWorkersPerHost; private final PortResultAccumulator accumulator; @@ -32,13 +34,16 @@ public class ScanHostTask implements Callable<ScanResult> { } @Override - public ScanResult call() { + public ScanResult call() throws Exception { try { scan.hostStart(); if (context.cancelledToken().isCancelled()) { return ScanResult.empty(host); } + this.hostAddress = InetAddress.getByName(host); return scanHostPorts(); + } catch (Exception e) { + throw new ScanHostException(host, e); } finally { scan.hostFinish(); } @@ -58,7 +63,7 @@ public class ScanHostTask implements Callable<ScanResult> { ProducerState<PortResult> state = new ProducerThread(context).startProducer( portRange.iterator(), maxWorkersPerHost, - port -> new ScanPortTask(host, port, context) + port -> new ScanPortTask(hostAddress, port, context) ); // consumer is the main thread @@ -71,7 +76,7 @@ public class ScanHostTask implements Callable<ScanResult> { if (poll instanceof PollState.Success<PortResult>(PortResult value)) { accumulator.add(value); } else if (poll instanceof PollState.Failure(Throwable error)) { - System.err.printf("scanHostPorts(%s): ScanPortTask() failed for with error %s -> %s%n", host, error.getClass().getSimpleName(), error.getMessage()); + System.err.printf("scanHostPorts(%s): ScanPortTask() failed with error %s -> %s%n", host, error.getClass().getSimpleName(), error.getMessage()); } } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); @@ -83,7 +88,7 @@ public class ScanHostTask implements Callable<ScanResult> { private boolean checkHostOnline() { try { - PortResult result = new ScanPortTask(host, 7, context).call(); + PortResult result = new ScanPortTask(hostAddress, 7, context).call(); Exception exception = result.getException(); accumulator.add(result); if (exception == null && !result.getState().equals(PortState.FILTERED)) { diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java index b6c5964..5809275 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java @@ -7,6 +7,7 @@ import com.it_jaros.jns.scan.domain.PortState; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.ConnectException; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; @@ -23,13 +24,13 @@ public class ScanPortTask implements Callable<PortResult> { private final PortScanRateLimiter portScanRateLimiter; // per-host shared limiter private final Scan scan; private final Semaphore socketLimit; - private final String host; + private final InetAddress inetAddress; private final boolean bannerRecognition; private final int port; private final long timeoutInNanos; - ScanPortTask(String host, int port, ScanExecutionContext context) { - this.host = host; + ScanPortTask(InetAddress inetAddress, int port, ScanExecutionContext context) { + this.inetAddress = inetAddress; this.port = port; this.bannerRecognition = context.scanOptions().bannerRecognition(); this.cancelledToken = context.cancelledToken(); @@ -61,7 +62,7 @@ public class ScanPortTask implements Callable<PortResult> { result.setState(PortState.UNKNOWN); try(SocketChannel socketChannel = SocketChannel.open()) { socketChannel.configureBlocking(false); - socketChannel.connect(new InetSocketAddress(host, port)); + socketChannel.connect(new InetSocketAddress(inetAddress, port)); final long deadlineNanos = System.nanoTime() + timeoutInNanos; final long waitInNanos = TimeUnit.MILLISECONDS.toNanos(1000); boolean isConnected = socketChannel.finishConnect(); |
