summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-03 13:46:43 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-03 14:43:21 +0200
commitdf29cb194b4c5a2e52edbd1256197cf6ffd4f526 (patch)
treee2bd274dfacd5f83e0d1e6aeba96a73eaf36c3bf
parent165449f203fddce0fcc7ac9a773a8ad7f37c9c77 (diff)
Show individual parts of the progressbar depending on how much space is
available. Each part besides of the current hosts stats can be deactivated if space in command line width is not enough
-rw-r--r--src/main/java/com/it_jaros/jscanner/ProgressBar.java75
-rw-r--r--src/main/java/com/it_jaros/jscanner/Scan.java3
2 files changed, 53 insertions, 25 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/ProgressBar.java b/src/main/java/com/it_jaros/jscanner/ProgressBar.java
index 6360895..62bb2c1 100644
--- a/src/main/java/com/it_jaros/jscanner/ProgressBar.java
+++ b/src/main/java/com/it_jaros/jscanner/ProgressBar.java
@@ -16,7 +16,6 @@ public class ProgressBar {
private final ScheduledExecutorService ui = Executors.newSingleThreadScheduledExecutor();
private final Scan scan;
private final boolean quiet;
- private final int columnWidth = ProgressBar.getColumnWidth();
private final Object outputLock = new Object();
public ProgressBar(Scan scan, boolean quiet) {
@@ -125,7 +124,7 @@ public class ProgressBar {
System.err.print("Scanning targets...\n\n");
ui.scheduleAtFixedRate(() -> {
synchronized (outputLock) {
- printStatusLine(scan);
+ printStatusLine();
}
}, 1, 1000, TimeUnit.MILLISECONDS);
}
@@ -166,42 +165,68 @@ public class ProgressBar {
return String.format("%ds", seconds);
}
- private void printStatusLine(final Scan scan) {
- this.printStatusLine(scan.getHostCounter(), scan.getHostTotalCounter(), scan.getSocketCounter(), scan.getThreadCounter());
- }
- private void printStatusLine(
- Counter hostCounter, Counter hostTotalCounter, Counter
- socketCounter, Counter
- threadCounter) {
+ private void printStatusLine() {
long duration = scan.getDurationMillis();
- int total = hostTotalCounter.current();
- int running = hostCounter.current();
+ int total = scan.getHostTotalCounter().current();
+ int running = scan.getHostCounter().current();
int done = total - running;
long percent = total == 0 ? 100 : done * 100L / total;
- String line = String.format(
- "hosts: %d running, %d done | %s | sockets: %d active, %d peak | workers: %d active, %d peak",
+ String hostStat = String.format(
+ "hosts: %d running, %d done",
running,
- done,
- formatDuration(duration),
- socketCounter.current(),
- socketCounter.max(),
- threadCounter.current(),
- threadCounter.max()
+ done
+ );
+ String durationStat = String.format(
+ " | %s",
+ formatDuration(duration)
+ );
+ String socketStat = String.format(
+ " | sockets: %d active, %d peak",
+ scan.getSocketCounter().current(),
+ scan.getSocketCounter().max()
+ );
+ String workerStat = String.format(
+ " | workers: %d active, %d peak",
+ scan.getThreadCounter().current(),
+ scan.getThreadCounter().max()
);
- String barFormat = " | [%s] %3d%%";
- int barWidth = Math.max(5, ProgressBar.getColumnWidth() - line.length() - barFormat.length());
- String progressBar = progressBar(percent, barWidth);
- String status = line + String.format(barFormat, progressBar, percent);
- System.err.print("\r" + status);
+ int availableWidth = ProgressBar.getColumnWidth();
+ String statusLine = appendIfEnoughSpace("", availableWidth, hostStat, durationStat, socketStat, workerStat);
+
+ String barFormat = " [%s] %3d%%";
+ int remainingWidth = availableWidth - statusLine.length() - barFormat.length();
+ if (remainingWidth > 0) {
+ String progressBar = String.format(
+ barFormat,
+ progressBar(percent, remainingWidth),
+ percent
+ );
+ statusLine = appendIfEnoughSpace(statusLine, availableWidth, progressBar);
+ }
+ System.err.print("\r" + statusLine);
System.err.flush();
}
+ private String appendIfEnoughSpace(String current, int availableSize, String... additional) {
+ StringBuilder builder = new StringBuilder(current);
+ for (String add : additional) {
+ if ((builder.length() + add.length()) <= availableSize) {
+ builder.append(add);
+ }
+ }
+
+ return builder.toString();
+ }
+
private static String progressBar(long percent, int width) {
- int filled = (int) (percent * width / 100);
+ if (width <= 0) {
+ return "";
+ }
+ int filled = (int) (percent * width / 100);
return "#".repeat(filled) + "-".repeat(width - filled);
}
}
diff --git a/src/main/java/com/it_jaros/jscanner/Scan.java b/src/main/java/com/it_jaros/jscanner/Scan.java
index 391cadd..3bd62bd 100644
--- a/src/main/java/com/it_jaros/jscanner/Scan.java
+++ b/src/main/java/com/it_jaros/jscanner/Scan.java
@@ -116,6 +116,9 @@ public class Scan {
public long getDurationMillis() {
if (stop == 0) {
+ if (start == 0) {
+ return 0;
+ }
return System.currentTimeMillis() - start;
}
return stop - start;