commit fa7fd9f91375dfd2e9d3e7fb0eee99181e7ea475
parent 8094a2ec94cdce0ac7ddf2f9e24db08815b5412d
Author: Matthias Jaros <jaros@mailbox.org>
Date: Mon, 6 Apr 2026 20:07:54 +0200
Make bar adjust to terminal width
Diffstat:
1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/src/main/java/com/it_jaros/network_scanner/ProgressBar.java b/src/main/java/com/it_jaros/network_scanner/ProgressBar.java
@@ -1,5 +1,7 @@
package com.it_jaros.network_scanner;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
@@ -13,9 +15,26 @@ public class ProgressBar {
private final ScheduledExecutorService ui = Executors.newSingleThreadScheduledExecutor();
private final ReentrantLock lock = new ReentrantLock();
+ private final int columnWidth = ProgressBar.getColumnWidth();
private List<Progress> hosts;
+ private static int getColumnWidth() {
+ try {
+ Process process = new ProcessBuilder("sh", "-c", "stty size < /dev/tty | cut -d' ' -f2").start();
+
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(process.getInputStream()))) {
+ String line = reader.readLine();
+ if (line != null && !line.isBlank()) {
+ return Integer.parseInt(line.trim());
+ }
+ }
+ } catch (Exception ignored) {}
+
+ return 80;
+ }
+
public void start() {
this.hosts = new ArrayList<>();
System.out.print("Scanning targets...\n\n");
@@ -65,14 +84,18 @@ public class ProgressBar {
}
public String createBar(String label, int open, int filtered, int done, int total) {
- int width = 30;
+ int terminalWidth = columnWidth;
+ int bracketWidth = terminalWidth / 3;
double pct = total == 0 ? 1.0 : (done / (double) total);
- int filled = (int) (pct * width);
-
- String brackets = "[" + "#".repeat(filled) + "-".repeat(width - filled) + "]";
int percent = (int) (pct * 100);
- return String.format("%-40s open: %s filtered: %s %s %3d%% (%d/%d)", label, open, filtered, brackets, percent, done, total);
+ String statsLeft = String.format("open:%d filtered:%d (%d/%d)", open, filtered, done, total);
+ String statsRight = String.format("%3d%%", percent);
+ int filled = (int) (pct * bracketWidth);
+ String brackets = "[" + "#".repeat(filled) + "-".repeat(bracketWidth - filled) + "]";
+
+ int spacesBetween = terminalWidth - bracketWidth - (label + statsLeft + statsRight).length() - 5;
+ return String.format("%s:%s%s %s %s", label, " ".repeat(spacesBetween),statsLeft, brackets, statsRight);
}
public void stop() {