diff options
| author | 2026-08-03 13:46:43 +0200 | |
|---|---|---|
| committer | 2026-08-03 14:43:21 +0200 | |
| commit | df29cb194b4c5a2e52edbd1256197cf6ffd4f526 (patch) | |
| tree | e2bd274dfacd5f83e0d1e6aeba96a73eaf36c3bf | |
| parent | 165449f203fddce0fcc7ac9a773a8ad7f37c9c77 (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.java | 75 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/Scan.java | 3 |
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; |
