diff --git a/VERSION b/VERSION index 80138e7..43ded90 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.13.4 +1.13.5 diff --git a/VERSIONS.md b/VERSIONS.md index d78d636..c5815e4 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre | Tag | Date (UTC) | Notes | |-----|------------|--------| +| **v1.13.5** | 2026-07-19 | **Bugfix:** progress bar — env-aware phase estimates (CHECK_BANK/LANDING, mon hosts); re-fit total after each phase (done+remaining); drop fake +12 for host-agent monpages post-check (fixes stage 42/139→46/46 snap). | | **v1.13.4** | 2026-07-19 | **Bugfix:** monpages race-proof — atomic HTML write; rsync `--delay-updates` + settle; fetch retries; larger head windows; pre-publish soft content (`MONPAGES_PRE_PUBLISH`); bootstrap markers. | | **v1.13.3** | 2026-07-19 | **Bugfix:** sticky **generated** time in **Europe/Zurich** (CEST/CET · MESZ/MEZ), not UTC `…Z`; ISO keeps offset for age JS. | | **v1.13.2** | 2026-07-19 | **Bugfix:** sticky version link uses **commit** URL (`/src/commit/`) not `/src/tag/v…` (tags not yet pushed → Forgejo fat 404); tags v1.11–v1.13.1 pushed to origin. | diff --git a/lib.sh b/lib.sh index 92dc43b..6dcccf9 100755 --- a/lib.sh +++ b/lib.sh @@ -574,8 +574,9 @@ set_progress_total() { # Optional: expected number of numbered checks in this run. # PROGRESS_TOTAL=0 → no percent, only "done=N". # Does not reset GLOBAL_N / PROGRESS_DONE if already mid-run (state file). + # May shrink when parent re-fits after a short phase (total = done + remaining est), + # but never below PROGRESS_DONE. local n="${1:-0}" - # Never shrink below already completed work (re-estimate mid-run safe) if [ "${PROGRESS_DONE:-0}" -gt 0 ] && [ "$n" -gt 0 ] && [ "$n" -lt "$PROGRESS_DONE" ]; then n=$PROGRESS_DONE fi diff --git a/taler-monitoring.sh b/taler-monitoring.sh index 7c0bce2..16f5134 100755 --- a/taler-monitoring.sh +++ b/taler-monitoring.sh @@ -396,36 +396,73 @@ if [ "${#PHASES[@]}" -eq 0 ]; then fi # Global expected check count for progress bar done/total (override: PROGRESS_TOTAL=N). -# One estimate for the whole run — phase summary() must NOT reset this mid-run. -# Prefer slightly high; lib.sh only grows if short (never shrinks until progress_finish). +# Auto estimate is env-aware (CHECK_BANK=0 etc.) and re-fit after each phase so stage +# jobs do not sit at 42/139 then snap to 46/46. Phase summary() must NOT snap mid-run. +# Host-agent monpages post-check is outside this process — never counted here. +_progress_estimate_phase() { + local p="$1" n=0 hosts=1 + hosts=$(printf '%s' "${MON_HOSTS:-x}" | wc -w) + [ "$hosts" -lt 1 ] && hosts=1 + case "$p" in + urls) + # Core: exchange + merchant + webui + perf + terms (~28–40). Bank/landing optional. + # Stage (CHECK_BANK=0 CHECK_LANDING=0) lands near ~34 numbered lines — keep close. + n=28 + [ "${CHECK_BANK:-1}" != "0" ] && n=$((n + 24)) + [ "${CHECK_LANDING:-1}" != "0" ] && n=$((n + 18)) # intro + stats.json + qr + n=$((n + 6)) # headroom (SPA / terms / privacy / alt paths) + ;; + inside) n=30 ;; + versions) n=35 ;; + sanity) n=35 ;; + server) n=20 ;; + # e2e: ATM ladder emits many INFO lines (coins before/after each note) + e2e) n=240 ;; + ladder|goa-ladder) n=120 ;; + auth401) n=70 ;; + aptdeploy) n=40 ;; + surface|ecosystem) n=120 ;; + monpages|pages) + # slash + bare (+ optional _err) per inventory host; GOA full suite ≈20 URLs + case "${TALER_DOMAIN:-}" in + *hacktivism*) n=24 ;; + *lefrancpaysan*|*francpaysan*) n=$((hosts * 2 + 6)); [ "$n" -lt 12 ] && n=12 ;; + *) n=$((hosts * 2 + 4)); [ "$n" -lt 8 ] && n=8 ;; + esac + [ "$n" -gt 48 ] && n=48 + ;; + mattermost) n=25 ;; + mail) n=40 ;; + devtesting|franken|fake-franken|fake_franken) n=10 ;; + *) n=15 ;; + esac + printf '%s' "$n" +} + +# Recompute PROGRESS_TOTAL = done + estimate(remaining phases). Allows shrink after short phases. +_progress_refit_remaining() { + [ "${PROGRESS_TOTAL_AUTO:-0}" = "1" ] || return 0 + local rem=0 rp + for rp in "$@"; do + rem=$((rem + $(_progress_estimate_phase "$rp"))) + done + if type _mon_state_load >/dev/null 2>&1; then + _mon_state_load + fi + set_progress_total "$(( ${PROGRESS_DONE:-0} + rem ))" +} + +PROGRESS_TOTAL_AUTO=0 if [ "${PROGRESS_TOTAL:-0}" = "0" ] || [ -z "${PROGRESS_TOTAL:-}" ]; then + PROGRESS_TOTAL_AUTO=1 _pt=0 for p in "${PHASES[@]}"; do - case "$p" in - urls) _pt=$((_pt + 95)) ;; # +qr + webui SPA fingerprints - inside) _pt=$((_pt + 30)) ;; - versions) _pt=$((_pt + 35)) ;; # + disk probes can be many - sanity) _pt=$((_pt + 35)) ;; - server) _pt=$((_pt + 20)) ;; - # e2e: ATM ladder emits many INFO lines (coins before/after each note) - e2e) _pt=$((_pt + 240)) ;; - ladder|goa-ladder) _pt=$((_pt + 120)) ;; - auth401) _pt=$((_pt + 70)) ;; - aptdeploy) _pt=$((_pt + 40)) ;; - surface|ecosystem) _pt=$((_pt + 120)) ;; - monpages|pages) _pt=$((_pt + 20)) ;; - mattermost) _pt=$((_pt + 25)) ;; - mail) _pt=$((_pt + 40)) ;; - devtesting|franken|fake-franken|fake_franken) _pt=$((_pt + 12)) ;; - esac + _pt=$((_pt + $(_progress_estimate_phase "$p"))) done - # monpages post-check after htmlify can add another inventory pass - case " ${PHASES[*]} " in - *" monpages "*|*" pages "*) _pt=$((_pt + 12)) ;; - esac set_progress_total "$_pt" unset _pt fi +export PROGRESS_TOTAL_AUTO # Whole-run wall clock (default 10 min). Override: RUN_TIMEOUT=0 (unlimited). : "${RUN_TIMEOUT:=600}" @@ -516,9 +553,13 @@ unset _INSIDE_ACCESS_HINT chmod +x "$ROOT"/check_*.sh 2>/dev/null || true ec=0 -for p in "${PHASES[@]}"; do +_phase_idx=0 +_n_phases=${#PHASES[@]} +while [ "$_phase_idx" -lt "$_n_phases" ]; do + p="${PHASES[$_phase_idx]}" if [ "$RUN_TIMED_OUT" = "1" ]; then RUN_SKIPPED_PHASES+=("$p") + _phase_idx=$((_phase_idx + 1)) continue fi left=$(mon_seconds_left) @@ -526,6 +567,7 @@ for p in "${PHASES[@]}"; do RUN_TIMED_OUT=1 RUN_TIMEOUT_AT_PHASE="${RUN_TIMEOUT_AT_PHASE:-$p}" RUN_SKIPPED_PHASES+=("$p") + _phase_idx=$((_phase_idx + 1)) continue fi case "$p" in @@ -546,7 +588,21 @@ for p in "${PHASES[@]}"; do run_phase devtesting "$ROOT/check_devtesting.sh" || ec=1 ;; esac + # After each phase: refit total = actual done + estimate(remaining). Fixes + # stage over-estimate (e.g. 42/139 while only ~4 checks left). + if [ "${PROGRESS_TOTAL_AUTO:-0}" = "1" ]; then + _rem_args=() + _j=$((_phase_idx + 1)) + while [ "$_j" -lt "$_n_phases" ]; do + _rem_args+=("${PHASES[$_j]}") + _j=$((_j + 1)) + done + _progress_refit_remaining "${_rem_args[@]+"${_rem_args[@]}"}" + unset _rem_args _j + fi + _phase_idx=$((_phase_idx + 1)) done +unset _phase_idx _n_phases # Extraordinary run-budget failure: always report at end; HTML links top → here. if [ "$RUN_TIMED_OUT" = "1" ]; then