-
- {html.escape(status_txt)}
- {version_tag}
-
+ {html.escape(status_txt)}
{html.escape(pl_disp)} · {html.escape(hostname)}
·
{err_stat}
·
{warn_stat}
- ·
- {info_stat}
- ·
- {ok_stat}
{filter_chip}
·
+ {version_html}
+ ·
@@ -1497,18 +1228,6 @@ STICKY_CSS = """
.status-pill.sticky-green { color: var(--ok); border-color: #1f6b3a; background: #0a1a10; }
.status-pill.sticky-yellow { color: var(--warn); border-color: #a68b2d; background: #1a1608; }
.status-pill.sticky-red { color: var(--err); border-color: #a33; background: #1a0a0a; }
-.status-stack {
- display: inline-flex; flex-direction: column; align-items: flex-start;
- gap: 2px; margin-right: 2px;
-}
-.suite-ver-tag {
- display: inline-block; font-size: 10px; font-weight: 700;
- letter-spacing: 0.04em; padding: 0 6px; border-radius: 2px;
- color: var(--ok); border: 1px solid #1f6b3a; background: #0a1a10;
- text-decoration: none; line-height: 1.4;
-}
-.suite-ver-tag.dim { color: #9ab; border-color: #345; background: #0a1018; opacity: 0.9; }
-.suite-ver-tag:hover { filter: brightness(1.15); text-decoration: underline; }
.host { font-weight: 600; color: #eee; font-size: 13px; }
.sep { color: var(--dim); }
.stat {
@@ -1517,8 +1236,6 @@ STICKY_CSS = """
}
.stat.err { color: var(--err); border-color: #522; background: #1a0a0a; }
.stat.warn { color: var(--warn); border-color: #664; background: #1a1608; }
-.stat.info { color: var(--info); border-color: #234; background: #0a1520; }
-.stat.ok { color: var(--ok); border-color: #1f6b3a; background: #0a1a10; }
.stat.muted { opacity: 0.55; font-weight: 600; }
a.stat:hover { text-decoration: underline; filter: brightness(1.15); }
a.stat[aria-pressed="true"] {
@@ -1534,8 +1251,6 @@ a.stat[aria-pressed="true"] {
.filter-chip[hidden] { display: none !important; }
body.filter-error .filter-chip { border-color: #a33; background: #1a0a0a; color: var(--err); }
body.filter-warn .filter-chip { border-color: #a68b2d; background: #1a1608; color: var(--warn); }
-body.filter-info .filter-chip { border-color: #246; background: #0a1520; color: var(--info); }
-body.filter-ok .filter-chip { border-color: #1f6b3a; background: #0a1a10; color: var(--ok); }
.filter-clear {
font: inherit; font-size: 11px; font-weight: 700;
cursor: pointer; color: inherit;
@@ -1546,9 +1261,7 @@ body.filter-ok .filter-chip { border-color: #1f6b3a; background: #0a1a10; color:
/* Console filter: sticky + overviews stay; match lines + dimmed neighbours (v1.13.11+)
v1.15.2: stamp out black voids — hide blanks, zero-size non-matches, compact console */
body.filter-error #mon-console,
-body.filter-warn #mon-console,
-body.filter-info #mon-console,
-body.filter-ok #mon-console {
+body.filter-warn #mon-console {
padding: 6px 8px;
min-height: 0;
display: flex;
@@ -1556,9 +1269,7 @@ body.filter-ok #mon-console {
gap: 1px;
}
body.filter-error #mon-console .line:not(.error):not(.blocker):not(.filter-ctx),
-body.filter-warn #mon-console .line:not(.warn):not(.filter-ctx),
-body.filter-info #mon-console .line:not(.info):not(.filter-ctx),
-body.filter-ok #mon-console .line:not(.ok):not(.filter-ctx) {
+body.filter-warn #mon-console .line:not(.warn):not(.filter-ctx) {
display: none !important;
height: 0 !important;
margin: 0 !important;
@@ -1570,19 +1281,13 @@ body.filter-ok #mon-console .line:not(.ok):not(.filter-ctx) {
/* empty / whitespace-only lines never take space in filter mode */
body.filter-error #mon-console .line:empty,
body.filter-warn #mon-console .line:empty,
-body.filter-info #mon-console .line:empty,
-body.filter-ok #mon-console .line:empty,
body.filter-error #mon-console .line.line-blank,
-body.filter-warn #mon-console .line.line-blank,
-body.filter-info #mon-console .line.line-blank,
-body.filter-ok #mon-console .line.line-blank {
+body.filter-warn #mon-console .line.line-blank {
display: none !important;
}
-/* Context lines: grayed / muted so the match still stands out */
+/* Context lines: grayed / muted so the warn|error still stands out */
body.filter-error #mon-console .line.filter-ctx,
-body.filter-warn #mon-console .line.filter-ctx,
-body.filter-info #mon-console .line.filter-ctx,
-body.filter-ok #mon-console .line.filter-ctx {
+body.filter-warn #mon-console .line.filter-ctx {
opacity: 0.55;
color: #8a8a8a !important;
filter: grayscale(0.85);
@@ -1592,25 +1297,19 @@ body.filter-ok #mon-console .line.filter-ctx {
background: transparent !important;
}
body.filter-error #mon-console .line.filter-ctx a.jump,
-body.filter-warn #mon-console .line.filter-ctx a.jump,
-body.filter-info #mon-console .line.filter-ctx a.jump,
-body.filter-ok #mon-console .line.filter-ctx a.jump {
+body.filter-warn #mon-console .line.filter-ctx a.jump {
color: #6a6a6a !important;
}
/* Match lines stay tight */
body.filter-error #mon-console .line.error,
body.filter-error #mon-console .line.blocker,
-body.filter-warn #mon-console .line.warn,
-body.filter-info #mon-console .line.info,
-body.filter-ok #mon-console .line.ok {
+body.filter-warn #mon-console .line.warn {
margin: 1px 0 !important;
padding: 3px 6px !important;
}
/* Compact ellipsis between distant clusters (not a black slab) */
body.filter-error #mon-console .filter-gap,
-body.filter-warn #mon-console .filter-gap,
-body.filter-info #mon-console .filter-gap,
-body.filter-ok #mon-console .filter-gap {
+body.filter-warn #mon-console .filter-gap {
display: block;
color: #666;
text-align: center;
@@ -1624,14 +1323,10 @@ body.filter-ok #mon-console .filter-gap {
background: transparent;
height: auto;
}
-body:not(.filter-error):not(.filter-warn):not(.filter-info):not(.filter-ok) #mon-console .filter-gap { display: none !important; }
+body:not(.filter-error):not(.filter-warn) #mon-console .filter-gap { display: none !important; }
body.filter-error .env-context,
-body.filter-warn .env-context,
-body.filter-info .env-context,
-body.filter-ok .env-context { display: none !important; }
-body.filter-warn .err-top,
-body.filter-info .err-top,
-body.filter-ok .err-top { display: none; }
+body.filter-warn .env-context { display: none !important; }
+body.filter-warn .err-top { display: none; }
/* secondary jump anchors: never affect layout */
#mon-console .anchor-only {
display: inline;
@@ -1881,8 +1576,6 @@ STICKY_JS = """
function currentFilter() {
if (document.body.classList.contains("filter-error")) return "error";
if (document.body.classList.contains("filter-warn")) return "warn";
- if (document.body.classList.contains("filter-info")) return "info";
- if (document.body.classList.contains("filter-ok")) return "ok";
return "";
}
@@ -1908,8 +1601,6 @@ STICKY_JS = """
return el.classList.contains("error") || el.classList.contains("blocker");
}
if (mode === "warn") return el.classList.contains("warn");
- if (mode === "info") return el.classList.contains("info");
- if (mode === "ok") return el.classList.contains("ok");
return false;
}
function isBlankLine(el) {
@@ -1926,18 +1617,9 @@ STICKY_JS = """
return true;
}
var t = (el.textContent || "").replace(/\u00a0/g, " ").trim();
- // Skip pure chrome lines (spaces/tabs/newlines/hyphen + Unicode box-drawing).
- // Do NOT use a JS character-class regex with box glyphs here: when this
- // script is embedded in a Python string, Python emits SyntaxWarning for
- // sequences like \\- and the glyphs show up as noise in mon logs.
- if (!t.length) return true;
- for (var bi = 0; bi < t.length; bi++) {
- var bc = t.charCodeAt(bi);
- if (bc === 32 || bc === 9 || bc === 10 || bc === 13 || bc === 0x2d) continue;
- if (bc >= 0x2500 && bc <= 0x257f) continue; // U+2500–U+257F box drawing
- return false;
- }
- return true;
+ // box-drawing / pure chrome only (JS char class; escapes doubled for Python).
+ if (/^[╔╗╚╝║═│┌┐└┘\\s-]+$/.test(t)) return true;
+ return false;
}
var keep = new Array(lines.length);
var i, j, k, n, idx;
@@ -1987,14 +1669,11 @@ STICKY_JS = """
function setFilter(mode, opts) {
opts = opts || {};
- document.body.classList.remove("filter-error", "filter-warn", "filter-info", "filter-ok");
+ document.body.classList.remove("filter-error", "filter-warn");
var errA = document.querySelector('a.stat.err[data-filter="error"]');
var warnA = document.querySelector('a.stat.warn[data-filter="warn"]');
- var infoA = document.querySelector('a.stat.info[data-filter="info"]');
- var okA = document.querySelector('a.stat.ok[data-filter="ok"]');
- [errA, warnA, infoA, okA].forEach(function (a) {
- if (a) a.setAttribute("aria-pressed", "false");
- });
+ if (errA) errA.setAttribute("aria-pressed", "false");
+ if (warnA) warnA.setAttribute("aria-pressed", "false");
if (mode === "error") {
document.body.classList.add("filter-error");
@@ -2002,19 +1681,11 @@ STICKY_JS = """
} else if (mode === "warn") {
document.body.classList.add("filter-warn");
if (warnA) warnA.setAttribute("aria-pressed", "true");
- } else if (mode === "info") {
- document.body.classList.add("filter-info");
- if (infoA) infoA.setAttribute("aria-pressed", "true");
- } else if (mode === "ok") {
- document.body.classList.add("filter-ok");
- if (okA) okA.setAttribute("aria-pressed", "true");
}
- if (mode === "error" || mode === "warn" || mode === "info" || mode === "ok") {
- markFilterContext(mode);
- } else {
- clearFilterContext();
- }
+ // Mark dimmed neighbours (or clear when filter off)
+ if (mode === "error" || mode === "warn") markFilterContext(mode);
+ else clearFilterContext();
if (chip && chipLabel && bar) {
if (mode === "error") {
@@ -2023,12 +1694,6 @@ STICKY_JS = """
} else if (mode === "warn") {
chip.hidden = false;
chipLabel.textContent = bar.getAttribute("data-i18n-filter-warn") || "Filter: warnings + context";
- } else if (mode === "info") {
- chip.hidden = false;
- chipLabel.textContent = bar.getAttribute("data-i18n-filter-info") || "Filter: info + context";
- } else if (mode === "ok") {
- chip.hidden = false;
- chipLabel.textContent = bar.getAttribute("data-i18n-filter-ok") || "Filter: OK only + context";
} else {
chip.hidden = true;
chipLabel.textContent = "";
@@ -2037,28 +1702,24 @@ STICKY_JS = """
if (opts.updateHash !== false) {
var want = mode === "error" ? "#filter-error"
- : mode === "warn" ? "#filter-warn"
- : mode === "info" ? "#filter-info"
- : mode === "ok" ? "#filter-ok" : "";
+ : mode === "warn" ? "#filter-warn" : "";
if (want) {
if (location.hash !== want) {
try { history.replaceState(null, "", want); } catch (e) { location.hash = want; }
}
- } else if (/^#(filter-error|filter-warn|filter-info|filter-ok|first-error|first-warn)$/.test(location.hash || "")) {
+ } else if (location.hash === "#filter-error" || location.hash === "#filter-warn"
+ || location.hash === "#first-error" || location.hash === "#first-warn") {
try { history.replaceState(null, "", location.pathname + location.search); } catch (e) {}
}
}
if (opts.scrollFirst && mode) {
- var sel = mode === "error" ? ".line.error, .line.blocker"
- : mode === "warn" ? ".line.warn"
- : mode === "info" ? ".line.info"
- : ".line.ok";
- var id = mode === "error" ? "first-error" : mode === "warn" ? "first-warn" : "";
- var el = id ? document.getElementById(id) : null;
+ var id = mode === "error" ? "first-error" : "first-warn";
+ var el = document.getElementById(id);
if (el && el.scrollIntoView) {
setTimeout(function () { el.scrollIntoView({ block: "start", behavior: "smooth" }); }, 30);
} else if (consoleEl) {
+ var sel = mode === "error" ? ".line.error, .line.blocker" : ".line.warn";
var first = consoleEl.querySelector(sel);
if (first && first.scrollIntoView) {
setTimeout(function () { first.scrollIntoView({ block: "start", behavior: "smooth" }); }, 30);
@@ -2076,9 +1737,7 @@ STICKY_JS = """
a.addEventListener("click", function (ev) {
ev.preventDefault();
var mode = a.getAttribute("data-filter");
- if (mode === "error" || mode === "warn" || mode === "info" || mode === "ok") {
- toggleFilter(mode);
- }
+ if (mode === "error" || mode === "warn") toggleFilter(mode);
});
});
if (clearBtn) {
@@ -2093,10 +1752,6 @@ STICKY_JS = """
setFilter("error", { updateHash: false, scrollFirst: h === "first-error" });
} else if (h === "filter-warn" || h === "first-warn") {
setFilter("warn", { updateHash: false, scrollFirst: h === "first-warn" });
- } else if (h === "filter-info") {
- setFilter("info", { updateHash: false, scrollFirst: true });
- } else if (h === "filter-ok") {
- setFilter("ok", { updateHash: false, scrollFirst: true });
} else if (currentFilter()) {
// keep filter if hash is something else (e.g. err-slug)
}
@@ -2135,9 +1790,9 @@ def build_html(
# Split monitoring env context (collapsible, default closed) from check log
env_lines, body_raw, env_hint = extract_env_context(raw_lines)
# Sticky counts from full log; first-error anchors index into body only
- n_err, n_warn, n_info, n_ok, _, _, _, _ = count_status(raw_lines)
+ n_err, n_warn, _n_info, _n_ok, _, _, _, _ = count_status(raw_lines)
_e2, _w2, _i2, _o2, first_err_i, first_warn_i, _fi, _fo = count_status(body_raw)
- del _e2, _w2, _i2, _o2, _fi, _fo
+ del _e2, _w2, _i2, _o2, _fi, _fo, _n_info, _n_ok
errors = extract_errors(raw_lines)
err_slugs: dict[str, str] = {}
@@ -2187,7 +1842,12 @@ def build_html(
page_label or ""
).lower()
if _is_apt:
- _lang_board = ui_lang(host_hint=hostname + "\n" + log_text)
+ _lang_board = ui_lang()
+ if re.search(r"lefrancpaysan|francpaysan", hostname + "\n" + log_text, re.I):
+ import os
+
+ if not (os.environ.get("TALER_MON_LANG") or "").strip():
+ _lang_board = "fr"
err_nav += aptdeploy_board_html(log_text, lang=_lang_board)
if errors and mode == "err":
@@ -2232,7 +1892,11 @@ def build_html(
first_err_href = "#first-error" if first_err_i is not None else None
first_warn_href = "#first-warn" if first_warn_i is not None else None
- lang = ui_lang(host_hint=hostname + "\n" + log_text)
+ lang = ui_lang()
+ if re.search(r"lefrancpaysan|francpaysan", hostname + "\n" + log_text, re.I):
+ import os
+ if not (os.environ.get("TALER_MON_LANG") or "").strip():
+ lang = "fr"
scope = monitoring_scope(page_label, hostname, log_text, lang=lang)
page_lang = lang
@@ -2245,8 +1909,6 @@ def build_html(
generated_iso=generated_iso,
n_err=n_err,
n_warn=n_warn,
- n_info=n_info,
- n_ok=n_ok,
hostname=hostname,
page_label=page_label,
mode=mode,
@@ -2596,7 +2258,7 @@ def main() -> None:
ap.add_argument(
"--lang",
default="",
- help="UI language en|fr|de (default: domains.conf lang / env; de never stock default)",
+ help="UI language en|fr (default: env TALER_MON_LANG or auto)",
)
ap.add_argument(
"--page-label",
@@ -2617,8 +2279,8 @@ def main() -> None:
for l in log_text.splitlines()
if not is_log_noise_line(strip_ansi(l))
]
- n_err, n_warn, n_info, n_ok, _, _, _, _ = count_status(raw_for_counts)
- # n_info/n_ok used by sticky filters when build_html is called below
+ n_err, n_warn, _n_info, _n_ok, _, _, _, _ = count_status(raw_for_counts)
+ del _n_info, _n_ok
if args.mode == "redirect":
html_out = build_redirect_html(
diff --git a/surface-catalog.conf b/surface-catalog.conf
index 3caa703..cae2a14 100644
--- a/surface-catalog.conf
+++ b/surface-catalog.conf
@@ -46,10 +46,7 @@ bugs.gnunet.org 443 https gnunet-bugs
# --- taler-systems.com ---
www.taler-systems.com 443 https tsa-www
taler-systems.com 443 https tsa-apex
-# Anastasis / TSA mail plane (MX mail.anastasis.lu → pixel). Do NOT list
-# anastasis.taler-systems.com — it does not resolve (was a catalog typo).
-mail.anastasis.lu 443,25,465,587,143,993 https anastasis-mail
-pixel.taler-systems.com 443,25,465,587,143,993 https pixel-mail
+anastasis.taler-systems.com 443,25,465,587,143,993 https anastasis-mail
# --- mail (also covered by phase mail; listed for surface nmap/ports) ---
firefly.gnunet.org 443,25,465,587,143,993 https firefly-mail
diff --git a/taler-monitoring.sh b/taler-monitoring.sh
index 5379f3f..67ddf76 100755
--- a/taler-monitoring.sh
+++ b/taler-monitoring.sh
@@ -93,16 +93,14 @@ Phases:
sanity public + optional server
server server-side only (SSH)
e2e withdraw + pay (small amounts; remote aborts on login/KYC)
- ladder amount ladder classic (default 23-rung withdraw + pay; any currency)
- max-ladder max-search: highest withdrawable + highest payable (≤ available)
- goa-ladder alias of ladder (legacy phase name; same check_amount_ladder.sh)
+ ladder withdraw/pay amount ladder (GOA ceiling or stage TESTPAYSAN max_wire)
auth401 merchant Basic-auth / case matrix (HTTP 401 paths; may create throwaway instance)
aptdeploy koopa podman apt-src smoke: taler-merchant in
koopa-taler-deploy-test-apt-src-trixie{,-testing}
surface REMOTE-ONLY public inventory (NOT in default/all/full):
ecosystem hosts (taler.net, gnunet.org, taler-systems.com, mattermost, …)
or -d DOMAIN → that domain’s surface; port/protocol/TLS/CVE (OSV)
- mattermost Mattermost chat health (SPA + ping + client floors: mobile/desktop/support ≥10.11)
+ mattermost Mattermost chat health (default mattermost.taler.net; SPA + /api/v4/system/ping)
mail MX/SMTP/IMAP for Taler mail (firefly, pixel/TSA, catalogued domains)
monpages public monitoring HTML via FQDN (obligatory ERROR; GOA full inventory, FP only FP)
uses MON_HOSTS + HTML_URL_OK (same as host-agent); v1.3.1+
@@ -124,7 +122,7 @@ Options:
--merchant URL merchant-backend base — overrides profile
--currency CODE expected currency (GOA, KUDOS, CHF, …); empty = report only
--no-probe do not probe alternate hosts (unknown domains only)
- --lang en|fr|de UI/console language (sticky bar + badges; de available, not a profile default)
+ --lang en|fr UI/console language (sticky bar + badges)
overrides auto (FrancPaysan→fr, else en)
--ver, --version, -V print suite version, git commit, and repo URLs
-h, --help
@@ -167,8 +165,7 @@ Env (same meaning):
SURFACE_CVE_LEVEL=warn|error bare Server-header versions default warn
(Debian package versions default error)
SURFACE_CATALOG=path override surface-catalog.conf
- TALER_MON_LANG=en|fr|de same as --lang (profile lang from domains.conf; de never stock default)
- TALER_MON_LOCALE=fr-CH|de-CH regional l10n from domains.conf locale column
+ TALER_MON_LANG=en|fr same as --lang (default en; auto fr for *lefrancpaysan*)
Full load (GOA / hacktivism):
./taler-monitoring.sh -d hacktivism.ch full
@@ -228,13 +225,12 @@ NO_PROBE=0
while [ $# -gt 0 ]; do
case "$1" in
--lang)
- [ $# -ge 2 ] || { echo "error: --lang needs en|fr|de" >&2; exit 2; }
+ [ $# -ge 2 ] || { echo "error: --lang needs en|fr" >&2; exit 2; }
_lang="$2"
case "$_lang" in
fr|FR|fra|french) TALER_MON_LANG=fr ;;
- de|DE|deu|ger|german|deutsch) TALER_MON_LANG=de ;;
en|EN|eng|english) TALER_MON_LANG=en ;;
- *) echo "error: unknown language '$_lang' (use en, fr, or de)" >&2; exit 2 ;;
+ *) echo "error: unknown language '$_lang' (use en or fr)" >&2; exit 2 ;;
esac
TALER_MON_LANG_SET=1
export TALER_MON_LANG TALER_MON_LANG_SET
@@ -267,7 +263,7 @@ while [ $# -gt 0 ]; do
CURRENCY_OVERRIDE="$2"; shift 2
;;
--no-probe) NO_PROBE=1; shift ;;
- urls|inside|versions|sanity|server|e2e|ladder|goa-ladder|max-ladder|maxladder|auth401|aptdeploy|apt-deploy|apt_src|surface|ecosystem|mattermost|mail|monpages|pages|devtesting|franken|fake-franken|fake_franken|all|full) PHASES+=("$1"); shift ;;
+ urls|inside|versions|sanity|server|e2e|ladder|goa-ladder|auth401|aptdeploy|apt-deploy|apt_src|surface|ecosystem|mattermost|mail|monpages|pages|devtesting|franken|fake-franken|fake_franken|all|full) PHASES+=("$1"); shift ;;
*)
# bare domain shorthand: ./taler-monitoring.sh taler.net
if [[ "$1" == *.* && "$1" != *://* && "$1" != -* ]]; then
@@ -297,7 +293,7 @@ if [ "${LOCAL_STACK:-1}" != "1" ]; then
SKIP_SSH=1
fi
-# Remote: no SSH; bank withdraw ladder set in check_e2e (smaller notes)
+# Remote: no SSH; ATM withdraw ladder set in check_e2e (smaller notes)
if [ "${LOCAL_STACK}" != "1" ]; then
E2E_FAKE_INCOMING=0
E2E_REMOTE=1
@@ -311,15 +307,14 @@ export EXPECT_CURRENCY SKIP_SSH LOCAL_STACK TALER_DOMAIN_PROBE CHECK_LANDING
export TALER_DOMAIN_FROM_CLI="${TALER_DOMAIN_FROM_CLI:-0}"
export DOMAIN_SET="${DOMAIN_SET:-0}"
export WITHDRAW_AMT PAY_AMT CREDIT_AMT MERCHANT_INSTANCE
-export E2E_FAKE_INCOMING E2E_REMOTE E2E_VARIABLE E2E_ATM_MAX E2E_BANK_WITHDRAW_MAX
+export E2E_FAKE_INCOMING E2E_REMOTE E2E_VARIABLE E2E_ATM_MAX
export E2E_WITHDRAW_VALUES E2E_PAY_VALUES E2E_USE_TEMPLATES E2E_TEMPLATE_MAP
export PAIVANA_PUBLIC E2E_PAIVANA E2E_PAIVANA_TEMPLATE E2E_PAIVANA_AMOUNT E2E_PAIVANA_INSTANCE
export INSIDE_PROFILE INSIDE_SSH
export INSIDE_BANK_CTR INSIDE_EXCHANGE_CTR INSIDE_MERCHANT_CTR
export INSIDE_BANK_PORT INSIDE_EXCHANGE_PORT INSIDE_MERCHANT_PORT
export INSIDE_DNS_BANK INSIDE_DNS_EXCHANGE INSIDE_DNS_MERCHANT
-# Amount ladder — check_amount_ladder.sh + ladder/lib_pay.sh + ladder/extract_rpubs.py
-# Phases: ladder|goa-ladder (classic), max-ladder|maxladder (max-search).
+# Ladder: withdraw then pay — 0 + random mids + max-1 + max (see check_goa_ladder.sh).
# Defaults so set -u export is safe when vars were never set by caller.
: "${LADDER_STEPS:=23}"
: "${LADDER_MIN_AMOUNT:=0.000001}"
@@ -333,23 +328,16 @@ export INSIDE_DNS_BANK INSIDE_DNS_EXCHANGE INSIDE_DNS_MERCHANT
: "${LADDER_INCLUDE_ZERO:=1}"
: "${LADDER_INCLUDE_MAX:=1}"
: "${LADDER_HIGH_FROM:=1000000}"
-: "${LADDER_HIGH_RUNGS:=4}"
+: "${LADDER_HIGH_RUNGS:=12}"
: "${LADDER_LOAD:=1}"
: "${LADDER_PAY:=1}"
: "${LADDER_WITHDRAW_SCALE:=1.5}"
: "${LADDER_PAY_SETTLE_ROUNDS:=6}"
-: "${LADDER_MODE:=classic}"
-: "${LADDER_MAX_PROBES:=32}"
-: "${LADDER_MAX_TOL_REL:=0.001}"
-: "${LADDER_MAX_SEED:=}"
-: "${LADDER_PAY_WITH_MAX:=0}"
-: "${LADDER_HIGH_RUNGS:=6}"
export LADDER_STEPS LADDER_MIN_AMOUNT LADDER_CONFIRM_POLLS LADDER_MAX_RUNGS LADDER_TIMEOUT_S LADDER_REPORT_DIR
export LADDER_SETTLE_ROUNDS LADDER_SETTLE_SLEEP EXP_PW_FILE EXP_USER
export LADDER_MAX_AMOUNT LADDER_INCLUDE_ZERO LADDER_INCLUDE_MAX
export LADDER_HIGH_FROM LADDER_HIGH_RUNGS LADDER_LOAD
export LADDER_PAY LADDER_WITHDRAW_SCALE LADDER_PAY_SETTLE_ROUNDS
-export LADDER_MODE LADDER_MAX_PROBES LADDER_MAX_TOL_REL LADDER_MAX_SEED LADDER_PAY_WITH_MAX
export TALER_DOMAIN_APPLIED=1
i18n_init 2>/dev/null || true
# Optional: auth401 and other phases may honor CONTINUE_ON_ERROR
@@ -443,9 +431,9 @@ _progress_estimate_phase() {
versions) n=35 ;;
sanity) n=35 ;;
server) n=20 ;;
- # e2e: bank withdraw ladder emits many INFO lines (coins before/after each note)
+ # e2e: ATM ladder emits many INFO lines (coins before/after each note)
e2e) n=240 ;;
- ladder|goa-ladder|max-ladder|maxladder) n=120 ;;
+ ladder|goa-ladder) n=120 ;;
auth401) n=70 ;;
aptdeploy) n=40 ;;
surface|ecosystem) n=120 ;;
@@ -559,8 +547,6 @@ elif [ "${LOCAL_STACK:-0}" = "1" ] && command -v podman >/dev/null 2>&1 \
fi
printf 'target domain=%s\n' "${TALER_DOMAIN}"
-printf ' ui_lang %s\n' "${TALER_MON_LANG:-en}"
-printf ' locale %s\n' "${TALER_MON_LOCALE:-${TALER_DOMAIN_LOCALE:-?}}"
printf ' bank %s\n' "$BANK_PUBLIC"
printf ' exchange %s\n' "$EXCHANGE_PUBLIC"
printf ' merchant %s\n' "$MERCHANT_PUBLIC"
@@ -621,15 +607,7 @@ while [ "$_phase_idx" -lt "$_n_phases" ]; do
sanity) run_phase sanity "$ROOT/check_sanity.sh" || ec=1 ;;
server) run_phase server "$ROOT/check_server.sh" || ec=1 ;;
e2e) run_phase e2e "$ROOT/check_e2e.sh" || ec=1 ;;
- ladder|goa-ladder)
- run_phase ladder "$ROOT/check_amount_ladder.sh" || ec=1
- ;;
- max-ladder|maxladder)
- # Feature: hunt highest mint+confirm withdrawable amount (any currency)
- LADDER_MODE=max
- export LADDER_MODE
- run_phase ladder "$ROOT/check_amount_ladder.sh" || ec=1
- ;;
+ ladder|goa-ladder) run_phase ladder "$ROOT/check_goa_ladder.sh" || ec=1 ;;
auth401) run_phase auth401 "$ROOT/check_auth401.sh" || ec=1 ;;
aptdeploy|apt-deploy|apt_src) run_phase aptdeploy "$ROOT/check_apt_deploy.sh" || ec=1 ;;
surface|ecosystem) run_phase surface "$ROOT/check_surface.sh" || ec=1 ;;
diff --git a/tests/test_normalize_taler_uri.sh b/tests/test_normalize_taler_uri.sh
deleted file mode 100755
index 1db180b..0000000
--- a/tests/test_normalize_taler_uri.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env bash
-# Unit tests for normalize_taler_uri / taler_uri_has_default_port (lib.sh).
-# Run: ./tests/test_normalize_taler_uri.sh
-set -euo pipefail
-ROOT=$(cd "$(dirname "$0")/.." && pwd)
-# shellcheck source=../lib.sh
-source "$ROOT/lib.sh"
-
-pass=0
-fail=0
-assert_eq() {
- local name="$1" got="$2" want="$3"
- if [ "$got" = "$want" ]; then
- pass=$((pass + 1))
- else
- echo "FAIL $name" >&2
- echo " got: $got" >&2
- echo " want: $want" >&2
- fail=$((fail + 1))
- fi
-}
-assert_true() {
- local name="$1"
- if "$@"; then
- # shift name
- :
- fi
-}
-
-# --- strip :443 / :80 ---
-assert_eq "withdraw :443/" \
- "$(normalize_taler_uri 'taler://withdraw/bank.hacktivism.ch:443/taler-integration/abc-123')" \
- "taler://withdraw/bank.hacktivism.ch/taler-integration/abc-123"
-
-assert_eq "withdraw :443 end" \
- "$(normalize_taler_uri 'taler://withdraw/bank.example:443')" \
- "taler://withdraw/bank.example"
-
-assert_eq "pay :443" \
- "$(normalize_taler_uri 'taler://pay/taler.hacktivism.ch:443/instances/x/orders/y?c=z')" \
- "taler://pay/taler.hacktivism.ch/instances/x/orders/y?c=z"
-
-assert_eq "pay-template :80" \
- "$(normalize_taler_uri 'taler://pay-template/shop.example:80/instances/i/t')" \
- "taler://pay-template/shop.example/instances/i/t"
-
-assert_eq "already clean" \
- "$(normalize_taler_uri 'taler://withdraw/bank.hacktivism.ch/taler-integration/uuid')" \
- "taler://withdraw/bank.hacktivism.ch/taler-integration/uuid"
-
-assert_eq "empty" "$(normalize_taler_uri '')" ""
-
-# non-default port kept
-assert_eq "keep :8443" \
- "$(normalize_taler_uri 'taler://withdraw/bank.example:8443/taler-integration/x')" \
- "taler://withdraw/bank.example:8443/taler-integration/x"
-
-# has_default_port detector
-if taler_uri_has_default_port 'taler://withdraw/h:443/p'; then
- pass=$((pass + 1))
-else
- echo "FAIL detector should match :443" >&2
- fail=$((fail + 1))
-fi
-if taler_uri_has_default_port 'taler://withdraw/h/p'; then
- echo "FAIL detector should not match clean URI" >&2
- fail=$((fail + 1))
-else
- pass=$((pass + 1))
-fi
-
-echo "normalize_taler_uri tests: pass=$pass fail=$fail"
-[ "$fail" -eq 0 ]