summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-03-09 12:59:56 +0100
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit699afc9450e7b083ecc0002b5493e6cd0e39b250 (patch)
tree0cf4f8640c89ea72e402f83f3b355c8583c07287
parent36b2e832b6c992a53abe988c680a94f5919b2fba (diff)
Refactored printing of progress bars to be able to handle adding of more
hosts during time
-rw-r--r--src/main/java/com/it_jaros/networkScanner/ProgressBar.java32
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java9
2 files changed, 28 insertions, 13 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/ProgressBar.java b/src/main/java/com/it_jaros/networkScanner/ProgressBar.java
index 409668a..78920d4 100644
--- a/src/main/java/com/it_jaros/networkScanner/ProgressBar.java
+++ b/src/main/java/com/it_jaros/networkScanner/ProgressBar.java
@@ -1,32 +1,48 @@
package com.it_jaros.networkScanner;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
public class ProgressBar {
private ScheduledExecutorService ui = Executors.newSingleThreadScheduledExecutor();
private List<Progress> hosts;
+ private ReentrantLock lock = new ReentrantLock();
- public void start(List<Progress> hosts) {
- this.hosts = hosts;
+ public void start() {
+ System.out.println("Progress:");
+ this.hosts = new ArrayList<>();
// move cursor down depending on how many hosts have to be scanned
- hosts.forEach((h) -> System.out.print("\n"));
+ System.out.print("\n");
ui.scheduleAtFixedRate(() -> {
- drawProgress();
+ lock.lock();
+ drawProgress(false);
+ lock.unlock();
}, 1, 200, TimeUnit.MILLISECONDS);
}
- private void drawProgress() {
- // clear bars by moving cursor up
- System.out.print("\u001b[" + hosts.size() + "A");
+ private void drawProgress(boolean last) {
+ // Make space for drawing of progress bars
+ //System.out.print("\u001b[" + hosts.size() + "B");
// paint a bar per host
for (Progress progress : hosts) {
drawBar(progress);
}
+
+ // move cursor up again
+ if (!last)
+ System.out.print("\u001b[" + hosts.size() + "A");
+ }
+
+ public void submit(Progress progress) {
+ lock.lock();
+ hosts.add(progress);
+ lock.unlock();
}
private void drawBar(Progress progress) {
@@ -54,7 +70,7 @@ public class ProgressBar {
try {
ui.awaitTermination(10, TimeUnit.SECONDS);
// we need to draw one last time for the 100% to appear
- drawProgress();
+ drawProgress(true);
} catch (InterruptedException ignored) {
}
}
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java
index 0aedb27..cfef136 100644
--- a/src/main/java/com/it_jaros/networkScanner/Scanner.java
+++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java
@@ -18,13 +18,13 @@ import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.LockSupport;
public class Scanner {
-
+
private final Counter counter = new Counter();
private final ProgressBar progressBar = new ProgressBar();
private final Semaphore socketLimit;
private final int timeoutInMillis;
private final long delayInNanos;
-
+
public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis) {
this.timeoutInMillis = timeoutInMillis;
this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis));
@@ -38,13 +38,12 @@ public class Scanner {
public List<ScanResult> scanTargets(List<String> targets, String ports) {
List<ScanResult> results = new ArrayList<>();
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) {
- List<Progress> progresses = new ArrayList<>();
+ progressBar.start();
for (String target : targets) {
ScanResult result = scanTargetPorts(target, ports, executor);
results.add(result);
- progresses.add(result.progress());
+ progressBar.submit(result.progress());
}
- progressBar.start(progresses);
}
progressBar.stop();