From c73e7d62b42bcc4f698c0fd5f1bc3fa151497ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hern=C3=A2ni=20Marques?= Date: Sun, 19 Jul 2026 01:25:10 +0200 Subject: [PATCH] release 1.7.3: monitoring pages as first-class suite section README section lists public HTML report paths; sticky "What this monitors" adds a dedicated block that monpages/public pages are part of taler-monitoring. --- README.md | 25 ++++++++ VERSION | 2 +- VERSIONS.md | 7 ++- host-agent/README.md | 4 ++ site-gen/console_to_html.py | 116 ++++++++++++++++++++++++++++++------ 5 files changed, 133 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 73f19fa..796da73 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,31 @@ Full local GOA example: `./taler-monitoring.sh -d hacktivism.ch urls inside vers Repo: https://git.hacktivism.ch/hernani/taler-monitoring · tree: `~/src/taler-monitoring` Version: `./taler-monitoring.sh --ver` (or `--version` / `-V`) + +## Monitoring pages (part of the suite) + +The **public HTML reports** are not an external addon — they are a first-class part of **taler-monitoring**: + +| Kind | Public path(s) | Produced by | +|------|----------------|-------------| +| Stack host report | `https://{bank,exchange,merchant}/monitoring/` | host-agent + `site-gen/console_to_html.py` | +| Surface inventory | `https://taler.hacktivism.ch/taler-monitoring-surface/` | `run-surface-monitoring.sh` | +| apt-src deploy tests | `https://taler.hacktivism.ch/taler-monitoring-aptdeploy/` | `run-aptdeploy-monitoring.sh` | +| Mattermost | `https://taler.hacktivism.ch/taler-monitoring-mattermost/` | `run-mattermost-monitoring.sh` | +| Mail (MX/SMTP/IMAP) | `https://taler.hacktivism.ch/taler-monitoring-mail/` | `run-mail-monitoring.sh` | + +Related: + +- **Phase `monpages`:** outside-in check that those FQDNs serve suite HTML (sticky-bar), not merchant JSON code 21. +- **Sticky “What this monitors”:** each page lists its checks **and** a dedicated block *Monitoring pages themselves (suite)*. +- **Publish:** staging `~/monitoring-sites-staging` → `DEPLOY_WWW_ROOT` + Caddy handles (`site-gen/caddy-monitoring-handles.snippet`, v1.7.2+). + +```bash +./taler-monitoring.sh monpages +./taler-monitoring.sh -d hacktivism.ch monpages +``` + + Host packages (koopa / runners): **[DEPENDENCIES.md](./DEPENDENCIES.md)**. Host-agents (GOA + FP; shared report pipeline): **[host-agent/README.md](./host-agent/README.md)**. Public HTML site-gen (same timeout/log/HTML defaults): **[site-gen/README.md](./site-gen/README.md)**. diff --git a/VERSION b/VERSION index 0a182f2..bbf649f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.2 \ No newline at end of file +1.7.3 \ No newline at end of file diff --git a/VERSIONS.md b/VERSIONS.md index df1fdf5..57b8238 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -13,11 +13,12 @@ Tags and `VERSION` use **MAJOR.FEATURE.FIX** (three components), introduced in * | **FEATURE** | New capabilities (phases, HTML features, i18n packs, …) | | **FIX** | Bugfixes and docs that do not add a feature | -Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.7.2`). File `VERSION` omits the `v` prefix. +Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.7.3`). File `VERSION` omits the `v` prefix. | Tag | Date (UTC) | Notes | |-----|------------|--------| | **v1.8.0** | *planned* | **L10n** packs for user-facing strings: **fr-CH** (FrancPaysan) and **de-CH** (hacktivism / Taler CH German). | +| **v1.7.3** | 2026-07-18 | Monitoring **pages themselves** as suite scope: README section + sticky “What this monitors” block (monpages / public HTML paths). | | **v1.7.2** | 2026-07-18 | **Bugfix:** Caddy static handles — `root` must be host dir + matcher `/monitoring*` (not leaf dir + `/monitoring/`), else file_server returns empty 404 after apply. | | **v1.7.1** | 2026-07-18 | Host-agent default `STRICT_EXIT=1`; monpages staging-vs-public diagnosis; re-htmlify after public check fails. | | **v1.7.0** | 2026-07-18 | CLI `--ver` / `--version` / `-V`: suite version, git commit, repo/tag/commit URLs. | @@ -36,7 +37,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.7.2`). File `VERSION` omits the `v` pre ## Sticky bar version (v1.3.0+) -Generated HTML shows the installed release tag (e.g. `v1.7.2`) and links to Forgejo: +Generated HTML shows the installed release tag (e.g. `v1.7.3`) and links to Forgejo: `https://git.hacktivism.ch/hernani/taler-monitoring/src/tag/` @@ -66,5 +67,5 @@ Full locale packs (fr-CH / de-CH): **v1.8.0** (planned). ```bash git clone https://git.hacktivism.ch/hernani/taler-monitoring.git ~/src/taler-monitoring -cd ~/src/taler-monitoring && git checkout v1.7.2 +cd ~/src/taler-monitoring && git checkout v1.7.3 ``` diff --git a/host-agent/README.md b/host-agent/README.md index 4f08517..a01c91b 100644 --- a/host-agent/README.md +++ b/host-agent/README.md @@ -192,3 +192,7 @@ Caddy `/var/www/monitoring-sites` is separate (you configured hernani write acce Host-agent jobs default to **`STRICT_EXIT=1`**: non-zero exit if suite checks fail, `DEPLOY_WWW_ROOT` is not writable, or public monpages (FQDN) fail. Set `STRICT_EXIT=0` only if you want timers to stay green while still logging errors (not recommended for production). + +## Monitoring pages (suite) + +Public sticky-bar HTML under `/monitoring*` and `/taler-monitoring-*` is part of **taler-monitoring** (not a separate product). See main [README — Monitoring pages](../README.md#monitoring-pages-part-of-the-suite). Phase **monpages** verifies they are live. diff --git a/site-gen/console_to_html.py b/site-gen/console_to_html.py index d9bb75e..fec8149 100755 --- a/site-gen/console_to_html.py +++ b/site-gen/console_to_html.py @@ -65,6 +65,25 @@ def ui(lang: str, key: str, **kwargs) -> str: "stack_i4": "HTML host: {host}", "stack_i5": "Timer: host-agent path + 4h · /monitoring on bank, exchange, merchant fronts", "stack_i_phases": "Log header phases= {phases}", + "pages_title": "Monitoring pages (suite HTML)", + "pages_summary": "Public sticky-bar reports · phase monpages · part of taler-monitoring", + "pages_i1": "These HTML reports are generated by taler-monitoring (site-gen/console_to_html.py + host-agent)", + "pages_i2": "Stack pages: /monitoring/ on bank, exchange, and merchant public hosts", + "pages_i3": "Suite pages on taler.hacktivism.ch: /taler-monitoring-surface/, /taler-monitoring-aptdeploy/, /taler-monitoring-mattermost/, /taler-monitoring-mail/", + "pages_i4": "Phase monpages: outside-in check that each public FQDN serves real suite HTML (not merchant JSON code 21)", + "pages_i5": "Host-agent publishes staging → DEPLOY_WWW_ROOT; Caddy must handle paths (see site-gen/caddy-monitoring-handles.snippet)", + "pages_i6": "This page host: {host} · path label: {label}", + "pages_section_lead": "Monitoring pages themselves (suite):", + "mm_title": "Mattermost chat health", + "mm_summary": "mattermost.taler.net · SPA + /api/v4/system/ping · TLS", + "mm_i1": "Outside-in phase mattermost (default https://mattermost.taler.net)", + "mm_i2": "Landing SPA, /api/v4/system/ping JSON, /login, TLS certificate expiry", + "mm_i3": "HTML on taler.hacktivism.ch /taler-monitoring-mattermost/", + "mail_title": "Mail (MX / SMTP / IMAP)", + "mail_summary": "firefly + pixel/TSA · catalog mail-catalog.conf", + "mail_i1": "Outside-in phase mail: MX, SMTP/IMAP ports and handshakes, SPF/DMARC", + "mail_i2": "Domains: taler.net & gnunet.org (firefly), taler-systems.com (pixel / mail.anastasis.lu)", + "mail_i3": "HTML on taler.hacktivism.ch /taler-monitoring-mail/", "footer": "Console-style render of taler-monitoring output. Sticky bar: green = clean · yellow = warnings · red = errors. Commit pins the exact tree used for this run.", "redirect_fail": "has failures.", "redirect_see": "See {link} for the full console log, error index, and sticky status bar.", @@ -118,7 +137,26 @@ def ui(lang: str, key: str, **kwargs) -> str: "stack_i4": "Hôte HTML : {host}", "stack_i5": "Minuterie : host-agent path + 4 h · /monitoring sur bank, exchange, fronts marchands", "stack_i_phases": "En-tête de journal phases= {phases}", - "footer": "Rendu console de taler-monitoring. Barre collante : vert = OK · jaune = avertissements · rouge = erreurs. Le commit fixe l'arbre exact de cette exécution.", + "pages_title": "Pages de monitoring (HTML de la suite)", + "pages_summary": "Rapports publics sticky-bar · phase monpages · partie de taler-monitoring", + "pages_i1": "Ces rapports HTML sont générés par taler-monitoring (site-gen/console_to_html.py + host-agent)", + "pages_i2": "Pages pile : /monitoring/ sur bank, exchange et hôtes marchands publics", + "pages_i3": "Pages suite sur taler.hacktivism.ch : /taler-monitoring-surface/, /taler-monitoring-aptdeploy/, /taler-monitoring-mattermost/, /taler-monitoring-mail/", + "pages_i4": "Phase monpages : contrôle outside-in que chaque FQDN public sert le HTML de la suite (pas JSON merchant code 21)", + "pages_i5": "Host-agent publie staging → DEPLOY_WWW_ROOT ; Caddy doit gérer les chemins (voir site-gen/caddy-monitoring-handles.snippet)", + "pages_i6": "Hôte de cette page : {host} · libellé : {label}", + "pages_section_lead": "Les pages de monitoring elles-mêmes (suite) :", + "mm_title": "Santé du chat Mattermost", + "mm_summary": "mattermost.taler.net · SPA + /api/v4/system/ping · TLS", + "mm_i1": "Phase outside-in mattermost (défaut https://mattermost.taler.net)", + "mm_i2": "SPA d'accueil, /api/v4/system/ping JSON, /login, expiration du certificat TLS", + "mm_i3": "HTML sur taler.hacktivism.ch /taler-monitoring-mattermost/", + "mail_title": "Mail (MX / SMTP / IMAP)", + "mail_summary": "firefly + pixel/TSA · catalogue mail-catalog.conf", + "mail_i1": "Phase outside-in mail : MX, ports SMTP/IMAP et handshakes, SPF/DMARC", + "mail_i2": "Domaines : taler.net & gnunet.org (firefly), taler-systems.com (pixel / mail.anastasis.lu)", + "mail_i3": "HTML sur taler.hacktivism.ch /taler-monitoring-mail/", +"footer": "Rendu console de taler-monitoring. Barre collante : vert = OK · jaune = avertissements · rouge = erreurs. Le commit fixe l'arbre exact de cette exécution.", "redirect_fail": "a des échecs.", "redirect_see": "Voir {link} pour le journal console complet, l'index d'erreurs et la barre de statut.", "ago_s": "il y a {n}s", @@ -320,6 +358,19 @@ def extract_phases(log_text: str) -> str: + +def _pages_items(lang: str, host: str, label: str) -> list[str]: + """Dedicated section: monitoring HTML pages are part of taler-monitoring.""" + return [ + ui(lang, "pages_section_lead"), + ui(lang, "pages_i1"), + ui(lang, "pages_i2"), + ui(lang, "pages_i3"), + ui(lang, "pages_i4"), + ui(lang, "pages_i5"), + ui(lang, "pages_i6", host=host, label=label), + ] + def monitoring_scope( page_label: str, hostname: str, @@ -337,35 +388,65 @@ def monitoring_scope( lang = "fr" if "surface" in label: + items = [ + ui(lang, "surface_i1"), + ui(lang, "surface_i2"), + ui(lang, "surface_i3"), + ui(lang, "surface_i4", host=host), + ui(lang, "surface_i5"), + ] + _pages_items(lang, host, label) return { "kind": "surface", "lang": lang, "title": ui(lang, "surface_title"), "summary": ui(lang, "surface_summary"), - "items": [ - ui(lang, "surface_i1"), - ui(lang, "surface_i2"), - ui(lang, "surface_i3"), - ui(lang, "surface_i4", host=host), - ui(lang, "surface_i5"), - ], + "items": items, } if "aptdeploy" in label or "apt-deploy" in label or "apt_src" in label: + items = [ + ui(lang, "apt_i1"), + ui(lang, "apt_i2"), + ui(lang, "apt_i3"), + ui(lang, "apt_i4"), + ui(lang, "apt_i5"), + ui(lang, "apt_i6", host=host), + ui(lang, "apt_i7"), + ] + _pages_items(lang, host, label) return { "kind": "aptdeploy", "lang": lang, "title": ui(lang, "apt_title"), "summary": ui(lang, "apt_summary"), - "items": [ - ui(lang, "apt_i1"), - ui(lang, "apt_i2"), - ui(lang, "apt_i3"), - ui(lang, "apt_i4"), - ui(lang, "apt_i5"), - ui(lang, "apt_i6", host=host), - ui(lang, "apt_i7"), - ], + "items": items, + } + + if "mattermost" in label: + items = [ + ui(lang, "mm_i1"), + ui(lang, "mm_i2"), + ui(lang, "mm_i3"), + ] + _pages_items(lang, host, label) + return { + "kind": "mattermost", + "lang": lang, + "title": ui(lang, "mm_title"), + "summary": ui(lang, "mm_summary"), + "items": items, + } + + if label in ("taler-monitoring-mail", "mail") or label.endswith("-mail"): + items = [ + ui(lang, "mail_i1"), + ui(lang, "mail_i2"), + ui(lang, "mail_i3"), + ] + _pages_items(lang, host, label) + return { + "kind": "mail", + "lang": lang, + "title": ui(lang, "mail_title"), + "summary": ui(lang, "mail_summary"), + "items": items, } phase_txt = phases or "urls · inside · versions" @@ -392,6 +473,7 @@ def monitoring_scope( if phases: items.insert(2, ui(lang, "stack_i_phases", phases=phases)) + items = items + _pages_items(lang, host, label) return { "kind": role, "lang": lang,