release 1.8.0: simplified mon pages + surface nmap + mail hosts

Public layout: only taler-monitoring-surface(+_err) for ecosystem
software/versions; nine landing stacks keep /monitoring(+_err).
Fold mail (firefly.gnunet.org, anastasis.taler-systems.com) and
mattermost into the surface job; deprecate separate mon pages/timers.
nmap OS fingerprinting; package-behind defaults to ERROR.
This commit is contained in:
Hernâni Marques 2026-07-19 00:29:49 +02:00
parent 2b846dab7a
commit e7a3cd558f
No known key found for this signature in database
GPG key ID: CB5738652768F7E9
15 changed files with 263 additions and 154 deletions

View file

@ -8,6 +8,7 @@
|--------|------------------|------| |--------|------------------|------|
| `bash` | (base) | runner | | `bash` | (base) | runner |
| `curl` | `curl` | HTTPS/API probes + **monpages** FQDN checks | | `curl` | `curl` | HTTPS/API probes + **monpages** FQDN checks |
| `nmap` | `nmap` | **surface** OS/service fingerprint (`SURFACE_NMAP=1`, v1.8.0+; OS detect may need root) |
| `python3` | `python313-base` (provides `/usr/bin/python3`) | JSON, HTML site-gen, metrics | | `python3` | `python313-base` (provides `/usr/bin/python3`) | JSON, HTML site-gen, metrics |
| `podman` | `podman` | **inside**: `podman exec` into taler-hacktivism* | | `podman` | `podman` | **inside**: `podman exec` into taler-hacktivism* |
| `git` | `git` | pin commit SHA in monitoring HTML footer | | `git` | `git` | pin commit SHA in monitoring HTML footer |

View file

@ -6,34 +6,31 @@ Checks for **GNU Taler** stacks (bank, exchange, merchant; optional surface inve
|------|------| |------|------|
| **Outside-only** | Public HTTPS from anywhere — no SSH, no host-agent. Phases such as `urls`, `monpages`, `surface`, … | | **Outside-only** | Public HTTPS from anywhere — no SSH, no host-agent. Phases such as `urls`, `monpages`, `surface`, … |
| **Inside / local** | Where you operate the stack: podman/SSH (`inside`, `versions`, `e2e`, `ladder`, …) | | **Inside / local** | Where you operate the stack: podman/SSH (`inside`, `versions`, `e2e`, `ladder`, …) |
| **Host-agent + HTML** | Optional: timers run the suite and publish sticky-bar HTML under `…/monitoring/` (and surface/aptdeploy paths) | | **Host-agent + HTML** | Optional: timers run the suite and publish sticky-bar HTML (see simplified page layout below) |
Outside-only example: `./taler-monitoring.sh -d demo.taler.net urls` Outside-only example: `./taler-monitoring.sh -d demo.taler.net urls`
Mattermost chat: `./taler-monitoring.sh mattermost` (default `https://mattermost.taler.net`) Surface (ecosystem + mail + mattermost + versions): `./taler-monitoring.sh surface mattermost mail versions`
Mail (firefly/pixel): `./taler-monitoring.sh mail`
Full local GOA example: `./taler-monitoring.sh -d hacktivism.ch urls inside versions` Full local GOA example: `./taler-monitoring.sh -d hacktivism.ch urls inside versions`
Repo: https://git.hacktivism.ch/hernani/taler-monitoring · tree: `~/src/taler-monitoring` Repo: https://git.hacktivism.ch/hernani/taler-monitoring · tree: `~/src/taler-monitoring`
Version: `./taler-monitoring.sh --ver` (or `--version` / `-V`) Version: `./taler-monitoring.sh --ver` (or `--version` / `-V`)
## Monitoring pages (part of the suite) ## Monitoring pages — simplified overview (v1.8.0+)
The **public HTML reports** are not an external addon — they are a first-class part of **taler-monitoring**: Public HTML is **not** an external addon. Layout is intentionally small:
| Kind | Public path(s) | Produced by | | Kind | Where | Purpose |
|------|----------------|-------------| |------|--------|---------|
| Stack host report | `https://{bank,exchange,merchant}/monitoring/` | host-agent + `site-gen/console_to_html.py` | | **Landing-stack report** | `https://{host}/monitoring/` and `/monitoring_err/` | Per **landing** front (9 stacks): GOA bank/exchange/taler · FP stage bank/exchange/monnaie · FP prod bank/exchange/monnaie |
| Surface inventory | `https://taler.hacktivism.ch/taler-monitoring-surface/` | `run-surface-monitoring.sh` | | **Ecosystem surface** | **only** `https://taler.hacktivism.ch/taler-monitoring-surface/` and `…/taler-monitoring-surface_err/` | Software/versions found in the Taler universe (ports, nmap OS fingerprint, Mattermost, mail firefly+anastasis, package signals) |
| 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` | There are **no** first-class public pages for `/taler-monitoring-mail*`, `/taler-monitoring-mattermost*`, or similar — those checks run **inside the surface job** and appear on the surface page.
| Mail (MX/SMTP/IMAP) | `https://taler.hacktivism.ch/taler-monitoring-mail/` | `run-mail-monitoring.sh` |
Related: Related:
- **Phase `monpages`:** obligatory outside-in check that public mon HTML is live (sticky-bar), not merchant JSON code 21 — GOA full inventory, FP only FP hosts. - **Phase `monpages`:** obligatory ERROR if expected pages are missing (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` + reverse-proxy handles.
- **Publish:** staging `~/monitoring-sites-staging``DEPLOY_WWW_ROOT` + Caddy handles (`site-gen/caddy-monitoring-handles.snippet`, v1.7.2+).
```bash ```bash
./taler-monitoring.sh monpages ./taler-monitoring.sh monpages
@ -401,21 +398,20 @@ LADDER_LOAD=0 ./taler-monitoring.sh ladder
Default **English**. Select language with `--lang en|fr` or `TALER_MON_LANG`. Default **English**. Select language with `--lang en|fr` or `TALER_MON_LANG`.
FrancPaysan stacks auto-select **French** (`*lefrancpaysan*`). See `VERSIONS.md` and `i18n.sh`. FrancPaysan stacks auto-select **French** (`*lefrancpaysan*`). See `VERSIONS.md` and `i18n.sh`.
## Public monitoring pages via FQDN (v1.3.1+ / obligatory v1.7.6+) ## Public monitoring pages via FQDN (v1.3.1+ / obligatory v1.7.6+ / layout v1.8.0+)
Phase **`monpages`** is **obligatory**: missing or non-suite HTML is **ERROR** Phase **`monpages`** is **obligatory**: missing or non-suite HTML is **ERROR**.
(not merchant JSON code 21, not 404). Soft mode only with Soft mode only with `MONPAGES_REQUIRE_PUBLIC=0` (escape hatch).
`MONPAGES_REQUIRE_PUBLIC=0` (escape hatch).
| Stack | What is checked | | Stack | What monpages expects (v1.8.0) |
|-------|-----------------| |-------|--------------------------------|
| **GOA / hacktivism** | Full suite inventory: `bank`/`exchange`/`taler` `/monitoring/` plus `/taler-monitoring-{surface,aptdeploy,mattermost,mail}/` and any extra pages found under staging/`DEPLOY_WWW_ROOT` | | **GOA** | `bank`/`exchange`/`taler` `/monitoring/` + `taler.hacktivism.ch/taler-monitoring-surface/` |
| **FrancPaysan** | Only that stacks mon hosts (`bank`/`exchange`/`monnaie` · stage variants) — never GOA URLs | | **FrancPaysan** | That stacks three mon hosts `/monitoring/` only |
| **Nine landings (model)** | Each of the 9 landing fronts has `/monitoring` + `/monitoring_err` (when a failed run exists) |
```bash ```bash
./taler-monitoring.sh -d hacktivism.ch monpages ./taler-monitoring.sh -d hacktivism.ch monpages
./taler-monitoring.sh -d lefrancpaysan.ch monpages ./taler-monitoring.sh -d lefrancpaysan.ch monpages
# host-agent runs monpages by default and again after HTML publish
``` ```
If pages are missing publicly: `sudo ~/koopa-caddy/apply-monitoring-live.sh` on koopa If pages are missing publicly: `sudo ~/koopa-caddy/apply-monitoring-live.sh` on koopa

View file

@ -20,7 +20,8 @@ Every check line has a **global** run number and a **grouped** id:
| **versions** | `check_versions.sh` | `outside` `inside` `compare` | | **versions** | `check_versions.sh` | `outside` `inside` `compare` |
| **aptdeploy** | `check_apt_deploy.sh` | `trixie` `trixie-testing` (koopa podman apt-src merchant smoke) | | **aptdeploy** | `check_apt_deploy.sh` | `trixie` `trixie-testing` (koopa podman apt-src merchant smoke) |
| **surface** | `check_surface.sh` | **remote-only** ecosystem / `-d` domain inventory (not in default/all/full) | | **surface** | `check_surface.sh` | **remote-only** ecosystem / `-d` domain inventory (not in default/all/full) |
| **monpages** | `check_monitoring_pages.sh` | public monitoring HTML via FQDN — **obligatory ERROR**; GOA full inventory; FP only FP mon hosts | | **monpages** | `check_monitoring_pages.sh` | public HTML via FQDN — **obligatory ERROR**; GOA: 3×`/monitoring/` + surface; FP: stack mon only (v1.8.0) |
| **surface** | `check_surface.sh` | ecosystem inventory + **nmap** OS fingerprint; mail/mattermost content reported via surface page |
| **sanity** | `check_sanity.sh` | `bank` `exchange` `merchant` | | **sanity** | `check_sanity.sh` | `bank` `exchange` `merchant` |
| **server** | `check_server.sh` | (flat `server-NN` or host groups) | | **server** | `check_server.sh` | (flat `server-NN` or host groups) |
| **e2e** | `check_e2e.sh` | `prereq` `load` `bank` `wallet` `atm` `settle` `pay` `shop` `paivana` `dig` `report` | | **e2e** | `check_e2e.sh` | `prereq` `load` `bank` `wallet` `atm` `settle` `pay` `shop` `paivana` `dig` `report` |

View file

@ -1 +1 @@
1.7.7 1.8.0

View file

@ -13,14 +13,15 @@ Tags and `VERSION` use **MAJOR.FEATURE.FIX** (three components), introduced in *
| **FEATURE** | New capabilities (phases, HTML features, i18n packs, …) | | **FEATURE** | New capabilities (phases, HTML features, i18n packs, …) |
| **FIX** | Bugfixes and docs that do not add a feature | | **FIX** | Bugfixes and docs that do not add a feature |
Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.7.5`). File `VERSION` omits the `v` prefix. Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` prefix.
| Tag | Date (UTC) | Notes | | Tag | Date (UTC) | Notes |
|-----|------------|--------| |-----|------------|--------|
| **v1.7.7** | 2026-07-18 | **domains:** stage mytops merchant FQDN is `stage.my.taler-ops.ch` (betel mon sites). | **v1.8.0** | 2026-07-19 | **Simplified public pages:** only `/taler-monitoring-surface(+_err)` on `taler.hacktivism.ch` for ecosystem software/versions; **9 landing stacks** each keep `/monitoring(+_err)`. Mail (firefly.gnunet.org + anastasis.taler-systems.com) and Mattermost folded into surface job; separate mail/mattermost mon pages + timers deprecated. **nmap** OS fingerprinting on surface (`SURFACE_NMAP`); **ERROR** when packages are behind (`TALER_PKG_BEHIND=error` default) or OS fingerprint is EOL. |
| **v1.8.0** | *planned* | **L10n** packs for user-facing strings: **fr-CH** (FrancPaysan) and **de-CH** (hacktivism / Taler CH German). | | **v1.8.1** | *planned* | **L10n** packs: **fr-CH** (FrancPaysan) and **de-CH** (hacktivism / Taler CH German). |
| **v1.7.6** | 2026-07-18 | **monpages obligatory (ERROR):** GOA checks full suite inventory (bank/exchange/taler `/monitoring/` + surface/aptdeploy/mattermost/mail + on-disk discovery); FP only its own mon hosts; `MONPAGES_REQUIRE_PUBLIC=1` default (escape hatch `=0`). **Bugfix:** `with_timeout` no longer re-runs a phase when it exits non-zero. | | **v1.7.7** | 2026-07-18 | **domains:** stage mytops merchant FQDN is `stage.my.taler-ops.ch` (betel mon sites). |
| **v1.7.5** | 2026-07-18 | **Bugfix:** monpages soft mode `MONPAGES_REQUIRE_PUBLIC=0` (FP wrappers default) — missing public HTML is WARN until vhost publish; generic publish hints. | | **v1.8.0** | 2026-07-18 | **monpages obligatory (ERROR):** GOA checks full suite inventory (bank/exchange/taler `/monitoring/` + surface/aptdeploy/mattermost/mail + on-disk discovery); FP only its own mon hosts; `MONPAGES_REQUIRE_PUBLIC=1` default (escape hatch `=0`). **Bugfix:** `with_timeout` no longer re-runs a phase when it exits non-zero. |
| **v1.8.0** | 2026-07-18 | **Bugfix:** monpages soft mode `MONPAGES_REQUIRE_PUBLIC=0` (FP wrappers default) — missing public HTML is WARN until vhost publish; generic publish hints. |
| **v1.7.4** | 2026-07-18 | **Bugfix:** monpages bare URLs (`/monitoring` without `/`) WARN by default (trailing slash remains ERROR); avoids false red when slash form is live. | | **v1.7.4** | 2026-07-18 | **Bugfix:** monpages bare URLs (`/monitoring` without `/`) WARN by default (trailing slash remains ERROR); avoids false red when slash form is live. |
| **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.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.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. |
@ -41,7 +42,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.7.5`). File `VERSION` omits the `v` pre
## Sticky bar version (v1.3.0+) ## Sticky bar version (v1.3.0+)
Generated HTML shows the installed release tag (e.g. `v1.7.6`) and links to Forgejo: Generated HTML shows the installed release tag (e.g. `v1.8.0`) and links to Forgejo:
`https://git.hacktivism.ch/hernani/taler-monitoring/src/tag/<tag>` `https://git.hacktivism.ch/hernani/taler-monitoring/src/tag/<tag>`
@ -71,5 +72,5 @@ Full locale packs (fr-CH / de-CH): **v1.8.0** (planned).
```bash ```bash
git clone https://git.hacktivism.ch/hernani/taler-monitoring.git ~/src/taler-monitoring git clone https://git.hacktivism.ch/hernani/taler-monitoring.git ~/src/taler-monitoring
cd ~/src/taler-monitoring && git checkout v1.7.6 cd ~/src/taler-monitoring && git checkout v1.8.0
``` ```

View file

@ -99,6 +99,20 @@ _host_allowed() {
esac esac
} }
# Public page layout (v1.8.0+ simplified):
# • 9 landing stacks → /monitoring/ (+ /monitoring_err/ when present)
# • ecosystem software/versions inventory → only
# https://taler.hacktivism.ch/taler-monitoring-surface/
# https://taler.hacktivism.ch/taler-monitoring-surface_err/
# Legacy /taler-monitoring-{mail,mattermost,aptdeploy}* are NOT first-class pages.
_path_allowed() {
case "$1" in
monitoring|monitoring_err|taler-monitoring-surface|taler-monitoring-surface_err) return 0 ;;
*) return 1 ;;
esac
}
# Emit https://host/path/ for each …/host/path/index.html under root (max depth 3). # Emit https://host/path/ for each …/host/path/index.html under root (max depth 3).
_discover_tree() { _discover_tree() {
local root="$1" fam="$2" local root="$1" fam="$2"
@ -112,10 +126,19 @@ _discover_tree() {
path="${path%/index.html}" path="${path%/index.html}"
[ -n "$host" ] && [ -n "$path" ] || continue [ -n "$host" ] && [ -n "$path" ] || continue
_host_allowed "$host" "$fam" || continue _host_allowed "$host" "$fam" || continue
_path_allowed "$path" || continue
printf 'https://%s/%s/\n' "$host" "$path" printf 'https://%s/%s/\n' "$host" "$path"
done < <(find "${root%/}" -mindepth 3 -maxdepth 3 -type f -name index.html -print0 2>/dev/null) done < <(find "${root%/}" -mindepth 3 -maxdepth 3 -type f -name index.html -print0 2>/dev/null)
} }
# Nine landing stacks (GOA 3 + FP stage 3 + FP prod 3) with /monitoring/
_landing_nine() {
printf '%s\n' \
bank.hacktivism.ch exchange.hacktivism.ch taler.hacktivism.ch \
stage.bank.lefrancpaysan.ch stage.exchange.lefrancpaysan.ch stage.monnaie.lefrancpaysan.ch \
bank.lefrancpaysan.ch exchange.lefrancpaysan.ch monnaie.lefrancpaysan.ch
}
# Suite catalog of OK pages that must exist for this family. # Suite catalog of OK pages that must exist for this family.
_catalog_urls() { _catalog_urls() {
local fam="$1" h local fam="$1" h
@ -124,14 +147,8 @@ _catalog_urls() {
for h in bank.hacktivism.ch exchange.hacktivism.ch taler.hacktivism.ch; do for h in bank.hacktivism.ch exchange.hacktivism.ch taler.hacktivism.ch; do
printf 'https://%s/monitoring/\n' "$h" printf 'https://%s/monitoring/\n' "$h"
done done
for h in \ # ecosystem surface only (versions / software found in Taler universe)
taler-monitoring-surface \ printf 'https://taler.hacktivism.ch/taler-monitoring-surface/\n'
taler-monitoring-aptdeploy \
taler-monitoring-mattermost \
taler-monitoring-mail
do
printf 'https://taler.hacktivism.ch/%s/\n' "$h"
done
;; ;;
fp) fp)
for h in $MON_HOSTS; do for h in $MON_HOSTS; do
@ -140,6 +157,14 @@ _catalog_urls() {
printf 'https://%s/monitoring/\n' "$h" printf 'https://%s/monitoring/\n' "$h"
done done
;; ;;
all|nine)
# optional: all nine landings + surface
while IFS= read -r h; do
[ -n "$h" ] || continue
printf 'https://%s/monitoring/\n' "$h"
done < <(_landing_nine)
printf 'https://taler.hacktivism.ch/taler-monitoring-surface/\n'
;;
esac esac
} }

View file

@ -32,6 +32,10 @@ PORT_TIMEOUT="${SURFACE_PORT_TIMEOUT:-2}"
HTTP_TIMEOUT="${SURFACE_HTTP_TIMEOUT:-12}" HTTP_TIMEOUT="${SURFACE_HTTP_TIMEOUT:-12}"
# CVE via OSV (public, no key). Disable: SURFACE_CVE=0 # CVE via OSV (public, no key). Disable: SURFACE_CVE=0
: "${SURFACE_CVE:=1}" : "${SURFACE_CVE:=1}"
# nmap OS / service fingerprint (v1.8.0+). Disable: SURFACE_NMAP=0
: "${SURFACE_NMAP:=1}"
# OS detection (-O) often needs root; falls back to -sV when denied
: "${SURFACE_NMAP_OS:=1}"
# Extra ports when -d domain mode # Extra ports when -d domain mode
DOMAIN_EXTRA_PORTS="${SURFACE_DOMAIN_PORTS:-22,80,443,8443}" DOMAIN_EXTRA_PORTS="${SURFACE_DOMAIN_PORTS:-22,80,443,8443}"
@ -496,6 +500,109 @@ cert_expiry_check() {
return 0 return 0
} }
# nmap OS / service fingerprint (v1.8.0+).
# ERROR when fingerprint indicates an OS that is EOL / should be upgraded.
# Soft/info when nmap missing or unprivileged OS scan fails.
nmap_fingerprint_host() {
local h="$1"
local xml out osline accuracy eol=0
[ "${SURFACE_NMAP:-1}" = "1" ] || return 0
if ! command -v nmap >/dev/null 2>&1; then
warn "nmap" "$h · nmap not installed (apt install nmap) — skip OS fingerprint"
return 0
fi
xml=$(mktemp)
out=$(mktemp)
# Prefer OS detection when allowed; always try service version light
if [ "${SURFACE_NMAP_OS:-1}" = "1" ] && {
nmap -Pn -n -T4 -O --osscan-guess --max-os-tries 1 --host-timeout 45s \
-p 22,80,443,25,465,587,993 "$h" -oX "$xml" >"$out" 2>&1
}; then
:
else
nmap -Pn -n -T4 -sV --version-light --host-timeout 35s \
-p 22,80,443,25,465,587,993 "$h" -oX "$xml" >"$out" 2>&1 || true
fi
# Parse best OS match from XML
osline=$(
python3 - "$xml" <<'PY' 2>/dev/null || true
import sys, xml.etree.ElementTree as ET
path = sys.argv[1]
try:
root = ET.parse(path).getroot()
except Exception:
sys.exit(0)
best = None
best_acc = -1
for osm in root.findall(".//osmatch"):
name = osm.get("name") or ""
try:
acc = int(osm.get("accuracy") or "0")
except ValueError:
acc = 0
if name and acc >= best_acc:
best_acc = acc
best = name
if best:
print(f"{best_acc}|{best}")
# also surface product/version from service table
svcs = []
for port in root.findall(".//port"):
state = (port.find("state").get("state") if port.find("state") is not None else "")
if state != "open":
continue
svc = port.find("service")
if svc is None:
continue
prod = svc.get("product") or svc.get("name") or ""
ver = svc.get("version") or ""
if prod:
svcs.append(f"{prod} {ver}".strip())
if svcs:
print("SVC|" + "; ".join(svcs[:8]))
PY
)
rm -f "$xml" "$out"
if [ -z "$osline" ]; then
info "nmap" "$h · no OS/service fingerprint (need root for -O, or host filtered)"
return 0
fi
local osname="" svcinfo=""
while IFS= read -r line; do
case "$line" in
SVC\|*) svcinfo=${line#SVC|} ;;
*\|*)
accuracy=${line%%|*}
osname=${line#*|}
ok "nmap-os" "$h · OS guess ${accuracy}% · $osname"
;;
esac
done <<<"$osline"
[ -n "$svcinfo" ] && info "nmap-svc" "$h · $svcinfo"
# EOL / upgrade-required OS fingerprints → ERROR
case "$(printf '%s' "$osname" | tr 'A-Z' 'a-z')" in
*debian*6*|*debian*7*|*debian*8*|*debian*9*|*debian*10*|*debian*\"buster\"*|*debian*buster*)
eol=1 ;;
*ubuntu*12.04*|*ubuntu*14.04*|*ubuntu*16.04*|*ubuntu*18.04*|*ubuntu*20.04*)
eol=1 ;;
*centos*[5-7]*|*red\ hat\ enterprise*5*|*red\ hat\ enterprise*6*|*red\ hat\ enterprise*7*)
eol=1 ;;
*windows\ server\ 2008*|*windows\ server\ 2012*|*windows\ xp*|*windows\ 7*)
eol=1 ;;
*freebsd\ 1[0-2]*|*freebsd\ [0-9].*)
eol=1 ;;
esac
if [ "$eol" = "1" ]; then
err "nmap-upgrade" "$h OS fingerprint indicates EOL / upgrade required" "$osname"
return 1
fi
if [ -n "$osname" ]; then
info "nmap-upgrade" "$h OS fingerprint not on EOL list · $osname"
fi
return 0
}
scan_host() { scan_host() {
local h="$1" local h="$1"
local ports proto label expect local ports proto label expect
@ -621,6 +728,9 @@ scan_host() {
fi fi
fi fi
# nmap OS / service fingerprint (v1.8.0+) — ERROR on EOL OS
nmap_fingerprint_host "$h" || true
# Expected service must answer protocol (not just ping/port) # Expected service must answer protocol (not just ping/port)
# Note: ${array[*]:-x} is NOT valid default syntax (bash treats : as slice). # Note: ${array[*]:-x} is NOT valid default syntax (bash treats : as slice).
local ports_txt="${open_ports[*]}" local ports_txt="${open_ports[*]}"
@ -667,7 +777,7 @@ else
fi fi
info "inventory" "${#ORDERED_HOSTS[@]} hosts to probe (remote only · no SSH · no local podman on targets)" info "inventory" "${#ORDERED_HOSTS[@]} hosts to probe (remote only · no SSH · no local podman on targets)"
info "flags" "SURFACE_CVE=${SURFACE_CVE:-1} PORT_TIMEOUT=${PORT_TIMEOUT:-2} HTTP_TIMEOUT=${HTTP_TIMEOUT:-12}" info "flags" "SURFACE_CVE=${SURFACE_CVE:-1} SURFACE_NMAP=${SURFACE_NMAP:-1} SURFACE_NMAP_OS=${SURFACE_NMAP_OS:-1} PORT_TIMEOUT=${PORT_TIMEOUT:-2} HTTP_TIMEOUT=${HTTP_TIMEOUT:-12}"
for h in "${ORDERED_HOSTS[@]}"; do for h in "${ORDERED_HOSTS[@]}"; do
[ -n "$h" ] || continue [ -n "$h" ] || continue

View file

@ -11,7 +11,7 @@
# TALER_APT_BASE=https://deb.taler.net/apt/debian # TALER_APT_BASE=https://deb.taler.net/apt/debian
# TALER_APT_INDEX=…/dists/trixie/main/binary-amd64/Packages # TALER_APT_INDEX=…/dists/trixie/main/binary-amd64/Packages
# TALER_APT_TESTING_INDEX=…/dists/trixie-testing/… # TALER_APT_TESTING_INDEX=…/dists/trixie-testing/…
# TALER_PKG_BEHIND=warn|error (default: core packages ERROR if behind, else warn) # TALER_PKG_BEHIND=warn|error (default error as of v1.8.0 — any behind package is ERROR)
# SKIP_SSH=1 skip container install checks # SKIP_SSH=1 skip container install checks
set -euo pipefail set -euo pipefail
ROOT=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "$(dirname "$0")" && pwd)
@ -27,7 +27,7 @@ APT_BASE="${APT_BASE%/}"
INDEX="${TALER_APT_INDEX:-${APT_BASE}/dists/${SUITE}/main/binary-amd64/Packages}" INDEX="${TALER_APT_INDEX:-${APT_BASE}/dists/${SUITE}/main/binary-amd64/Packages}"
INRELEASE="${TALER_APT_INRELEASE:-${APT_BASE}/dists/${SUITE}/InRelease}" INRELEASE="${TALER_APT_INRELEASE:-${APT_BASE}/dists/${SUITE}/InRelease}"
TESTING_INDEX="${TALER_APT_TESTING_INDEX:-${APT_BASE}/dists/${SUITE}-testing/main/binary-amd64/Packages}" TESTING_INDEX="${TALER_APT_TESTING_INDEX:-${APT_BASE}/dists/${SUITE}-testing/main/binary-amd64/Packages}"
BEHIND_MODE="${TALER_PKG_BEHIND:-warn}" BEHIND_MODE="${TALER_PKG_BEHIND:-error}"
tmp=$(mktemp -d) tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT trap 'rm -rf "$tmp"' EXIT

View file

@ -18,8 +18,9 @@ Thin wrappers only set stack defaults:
| `run-fp-stage-monitoring.sh` | FP stage | `stagepaysan` | | `run-fp-stage-monitoring.sh` | FP stage | `stagepaysan` |
| `run-fp-prod-monitoring.sh` | FP prod | `francpaysan` | | `run-fp-prod-monitoring.sh` | FP prod | `francpaysan` |
| `run-aptdeploy.sh` | CLI: ensure + **aptdeploy** (no HTML) | local if hostname=koopa, else **ssh koopa-external** | | `run-aptdeploy.sh` | CLI: ensure + **aptdeploy** (no HTML) | local if hostname=koopa, else **ssh koopa-external** |
| `run-aptdeploy-monitoring.sh` | **aptdeploy**`/taler-monitoring-aptdeploy*` | `hernani` @ koopa (4h timer, taler only) | | `run-aptdeploy-monitoring.sh` | optional apt-src tests (not a public mon-page type) | `hernani` @ koopa (4h) |
| `run-surface-monitoring.sh` | **surface**`/taler-monitoring-surface*` | `hernani` @ koopa (hourly, taler only) | | `run-surface-monitoring.sh` | **surface** → only `/taler-monitoring-surface*` (ecosystem + mail + mattermost + versions) | `hernani` @ koopa (hourly) |
| `run-mail-monitoring.sh` / `run-mattermost-monitoring.sh` | **deprecated v1.8.0** — aliases of surface | disabled timers |
### apt-src deploy tests (hacktivism `/monitoring`) ### apt-src deploy tests (hacktivism `/monitoring`)
@ -44,24 +45,19 @@ Thin wrappers only set stack defaults:
Checks: package table, `httpd --version`, libtalerutil/`ldd` on failure, `systemctl` for Checks: package table, `httpd --version`, libtalerutil/`ldd` on failure, `systemctl` for
`taler-merchant.target`, basic local `/config` probe. No nginx/HTTPS in containers. `taler-merchant.target`, basic local `/config` probe. No nginx/HTTPS in containers.
### surface + aptdeploy HTML (taler.hacktivism.ch only) ### Public HTML layout (v1.8.0 simplified)
| URL | Role | Timer | | URL | Role |
|-----|------|-------| |-----|------|
| `…/taler-monitoring-surface/` | ecosystem surface scan | 1h | | `https://{bank,exchange,merchant}/monitoring/` (+ `_err`) | **Landing-stack** report — each of the **9** landing fronts (GOA 3 + FP stage 3 + FP prod 3) |
| `…/taler-monitoring-surface_err/` | errors + jump list | ″ | | `https://taler.hacktivism.ch/taler-monitoring-surface/` (+ `_err`) | **Only** ecosystem page: software/versions in the Taler universe (nmap OS, mail firefly+anastasis, mattermost, …) |
| `…/taler-monitoring-aptdeploy/` | apt-src container deploy tests | 4h |
| `…/taler-monitoring-aptdeploy_err/` | errors + jump list | ″ |
Not on bank/exchange. Staging: No separate public pages for mail/mattermost. Staging under `~/monitoring-sites-staging/`.
`~/monitoring-sites-staging/taler.hacktivism.ch/taler-monitoring-{surface,aptdeploy}*`.
```bash ```bash
systemctl --user enable --now taler-monitoring-surface.timer systemctl --user enable --now taler-monitoring-surface.timer
systemctl --user enable --now taler-monitoring-aptdeploy.timer
systemctl --user start taler-monitoring-surface.service systemctl --user start taler-monitoring-surface.service
systemctl --user start taler-monitoring-aptdeploy.service # mail/mattermost timers stay disabled (v1.8.0)
# Caddy: handles only in taler.hacktivism.ch block (root)
``` ```
Env examples: **`env/*.env.example`**. FP: `run-fp-prod-monitoring.sh` / `run-fp-stage-monitoring.sh` (same `run-host-report.sh` pipeline). Env examples: **`env/*.env.example`**. FP: `run-fp-prod-monitoring.sh` / `run-fp-stage-monitoring.sh` (same `run-host-report.sh` pipeline).

View file

@ -60,8 +60,10 @@ install_local() {
install -m 644 "$ROOT/taler-monitoring-hacktivism.timer" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-hacktivism.timer" "$home_unit/"
install -m 644 "$ROOT/taler-monitoring-surface.service" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-surface.service" "$home_unit/"
install -m 644 "$ROOT/taler-monitoring-surface.timer" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-surface.timer" "$home_unit/"
# optional aptdeploy (not a public mon page layout — v1.8.0 simplified overview)
install -m 644 "$ROOT/taler-monitoring-aptdeploy.service" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-aptdeploy.service" "$home_unit/"
install -m 644 "$ROOT/taler-monitoring-aptdeploy.timer" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-aptdeploy.timer" "$home_unit/"
# units still installed for migration; timers disabled (folded into surface)
install -m 644 "$ROOT/taler-monitoring-mattermost.service" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-mattermost.service" "$home_unit/"
install -m 644 "$ROOT/taler-monitoring-mattermost.timer" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-mattermost.timer" "$home_unit/"
install -m 644 "$ROOT/taler-monitoring-mail.service" "$home_unit/" install -m 644 "$ROOT/taler-monitoring-mail.service" "$home_unit/"
@ -72,31 +74,28 @@ install_local() {
systemctl --user enable --now taler-monitoring-hacktivism.timer systemctl --user enable --now taler-monitoring-hacktivism.timer
systemctl --user enable --now taler-monitoring-surface.timer systemctl --user enable --now taler-monitoring-surface.timer
systemctl --user enable --now taler-monitoring-aptdeploy.timer systemctl --user enable --now taler-monitoring-aptdeploy.timer
systemctl --user enable --now taler-monitoring-mattermost.timer # v1.8.0: mail + mattermost folded into surface — stop separate timers
systemctl --user enable --now taler-monitoring-mail.timer systemctl --user disable --now taler-monitoring-mattermost.timer 2>/dev/null || true
systemctl --user disable --now taler-monitoring-mail.timer 2>/dev/null || true
# initial stamp so path exists # initial stamp so path exists
"$ROOT/touch-software-stamp.sh" "$ROOT/touch-software-stamp.sh"
systemctl --user start taler-monitoring-hacktivism.service || true systemctl --user start taler-monitoring-hacktivism.service || true
systemctl --user start taler-monitoring-surface.service || true systemctl --user start taler-monitoring-surface.service || true
systemctl --user start taler-monitoring-aptdeploy.service || true systemctl --user start taler-monitoring-aptdeploy.service || true
systemctl --user start taler-monitoring-mattermost.service || true
systemctl --user start taler-monitoring-mail.service || true
echo "--- status ---" echo "--- status ---"
systemctl --user status taler-monitoring-hacktivism.path --no-pager -l | head -15 systemctl --user status taler-monitoring-hacktivism.path --no-pager -l | head -15
systemctl --user status taler-monitoring-hacktivism.timer --no-pager -l | head -12 systemctl --user status taler-monitoring-hacktivism.timer --no-pager -l | head -12
systemctl --user status taler-monitoring-surface.timer --no-pager -l | head -12 systemctl --user status taler-monitoring-surface.timer --no-pager -l | head -12
systemctl --user status taler-monitoring-aptdeploy.timer --no-pager -l | head -12 systemctl --user status taler-monitoring-aptdeploy.timer --no-pager -l | head -12
systemctl --user status taler-monitoring-mattermost.timer --no-pager -l | head -12
systemctl --user status taler-monitoring-mail.timer --no-pager -l | head -12
systemctl --user list-timers --all | grep taler-monitoring || true systemctl --user list-timers --all | grep taler-monitoring || true
echo "OK host-agent (hacktivism 4h + surface 1h + aptdeploy 4h + mattermost 1h + mail 4h)" echo "OK host-agent (v1.8.0 simplified):"
echo " · hacktivism 4h → /monitoring on bank/exchange/taler (landing stacks)"
echo " · surface 1h → /taler-monitoring-surface* (ecosystem versions/software)"
echo " · aptdeploy 4h (optional tests; not a public mon-page type)"
echo " · mail/mattermost timers disabled (content in surface)"
echo "suite: $mon" echo "suite: $mon"
echo "manual: systemctl --user start taler-monitoring-hacktivism.service"
echo "manual surface: systemctl --user start taler-monitoring-surface.service" echo "manual surface: systemctl --user start taler-monitoring-surface.service"
echo "manual aptdeploy: systemctl --user start taler-monitoring-aptdeploy.service"
echo "manual mattermost: systemctl --user start taler-monitoring-mattermost.service"
echo "manual mail: systemctl --user start taler-monitoring-mail.service"
echo "after upgrades: $ROOT/touch-software-stamp.sh" echo "after upgrades: $ROOT/touch-software-stamp.sh"
} }

View file

@ -1,32 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# run-mail-monitoring.sh — mail MX/SMTP/IMAP (firefly + pixel, …) → public HTML # DEPRECATED (v1.8.0): mail is part of taler-monitoring-surface.
# Public only on taler.hacktivism.ch: # Kept as a thin alias so old timers/docs do not break.
# https://taler.hacktivism.ch/taler-monitoring-mail/ #
# https://taler.hacktivism.ch/taler-monitoring-mail_err/ # Prefer: run-surface-monitoring.sh
# Public page: https://taler.hacktivism.ch/taler-monitoring-surface/
# #
set -uo pipefail set -uo pipefail
AGENT_DIR=$(cd "$(dirname "$0")" && pwd) AGENT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "NOTE: run-mail-monitoring.sh is deprecated (v1.8.0) — folding into surface" >&2
export AGENT_LABEL="${AGENT_LABEL:-mail-host-agent}" export PHASES="${PHASES:-mail surface monpages}"
export STATE_NAME="${STATE_NAME:-taler-mail-monitoring}" # force surface HTML paths (no /taler-monitoring-mail*)
export TALER_DOMAIN="${TALER_DOMAIN:-hacktivism.ch}" export HTML_OK_DIR="taler-monitoring-surface"
export INSIDE_PODMAN=0 export HTML_ERR_DIR="taler-monitoring-surface_err"
export LOCAL_STACK=0 export HTML_URL_OK="/taler-monitoring-surface/"
export SKIP_SSH=1 export HTML_URL_ERR="/taler-monitoring-surface_err/"
export INSIDE_MODE="${INSIDE_MODE:-none}" export PAGE_LABEL="taler-monitoring-surface"
export CONTINUE_ON_ERROR="${CONTINUE_ON_ERROR:-1}"
export RUN_TIMEOUT="${RUN_TIMEOUT:-600}"
export PHASES="${PHASES:-mail monpages}"
export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}" export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}"
export HTML_OUT="${HTML_OUT:-$HOME/monitoring-sites-staging}" export MONPAGES_INVENTORY=job
export DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" exec bash "$AGENT_DIR/run-surface-monitoring.sh" "$@"
export HTML_OK_DIR="taler-monitoring-mail"
export HTML_ERR_DIR="taler-monitoring-mail_err"
export HTML_URL_OK="/taler-monitoring-mail/"
export HTML_URL_ERR="/taler-monitoring-mail_err/"
export PAGE_LABEL="taler-monitoring-mail"
export APT_DEPLOY_ENSURE=0
exec bash "$AGENT_DIR/run-host-report.sh" "$@"

View file

@ -1,35 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# run-mattermost-monitoring.sh — Mattermost (mattermost.taler.net) → public HTML # DEPRECATED (v1.8.0): mattermost is part of taler-monitoring-surface.
# Public only on taler.hacktivism.ch: # Kept as a thin alias so old timers/docs do not break.
# https://taler.hacktivism.ch/taler-monitoring-mattermost/ #
# https://taler.hacktivism.ch/taler-monitoring-mattermost_err/ # Prefer: run-surface-monitoring.sh
# Public page: https://taler.hacktivism.ch/taler-monitoring-surface/
# #
set -uo pipefail set -uo pipefail
AGENT_DIR=$(cd "$(dirname "$0")" && pwd) AGENT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "NOTE: run-mattermost-monitoring.sh is deprecated (v1.8.0) — folding into surface" >&2
export AGENT_LABEL="${AGENT_LABEL:-mattermost-host-agent}" export PHASES="${PHASES:-mattermost surface monpages}"
export STATE_NAME="${STATE_NAME:-taler-mattermost-monitoring}" export HTML_OK_DIR="taler-monitoring-surface"
export TALER_DOMAIN="${TALER_DOMAIN:-hacktivism.ch}" export HTML_ERR_DIR="taler-monitoring-surface_err"
# remote public service — no SSH / podman export HTML_URL_OK="/taler-monitoring-surface/"
export INSIDE_PODMAN=0 export HTML_URL_ERR="/taler-monitoring-surface_err/"
export LOCAL_STACK=0 export PAGE_LABEL="taler-monitoring-surface"
export SKIP_SSH=1
export INSIDE_MODE="${INSIDE_MODE:-none}"
export CONTINUE_ON_ERROR="${CONTINUE_ON_ERROR:-1}"
export RUN_TIMEOUT="${RUN_TIMEOUT:-300}"
# dedicated job: mattermost + public page check
export PHASES="${PHASES:-mattermost monpages}"
export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}" export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}"
export HTML_OUT="${HTML_OUT:-$HOME/monitoring-sites-staging}" export MONPAGES_INVENTORY=job
export DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" exec bash "$AGENT_DIR/run-surface-monitoring.sh" "$@"
export HTML_OK_DIR="taler-monitoring-mattermost"
export HTML_ERR_DIR="taler-monitoring-mattermost_err"
export HTML_URL_OK="/taler-monitoring-mattermost/"
export HTML_URL_ERR="/taler-monitoring-mattermost_err/"
export PAGE_LABEL="taler-monitoring-mattermost"
export MATTERMOST_PUBLIC="${MATTERMOST_PUBLIC:-https://mattermost.taler.net}"
export APT_DEPLOY_ENSURE=0
exec bash "$AGENT_DIR/run-host-report.sh" "$@"

View file

@ -1,26 +1,33 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# run-surface-monitoring.sh — hourly remote-only ecosystem surface scan # run-surface-monitoring.sh — ecosystem surface report (v1.8.0+ simplified)
# Public only on taler.hacktivism.ch: #
# Public HTML only on taler.hacktivism.ch:
# https://taler.hacktivism.ch/taler-monitoring-surface/ # https://taler.hacktivism.ch/taler-monitoring-surface/
# https://taler.hacktivism.ch/taler-monitoring-surface_err/ # https://taler.hacktivism.ch/taler-monitoring-surface_err/
# #
# This single page covers remote ecosystem inventory: host/port probes, nmap OS
# fingerprint, Mattermost, mail (firefly + anastasis), package/version signals.
# There are NO separate public pages for mail / mattermost / aptdeploy.
#
# Landing-stack reports stay on each of the 9 fronts as /monitoring(/_err).
#
set -uo pipefail set -uo pipefail
AGENT_DIR=$(cd "$(dirname "$0")" && pwd) AGENT_DIR=$(cd "$(dirname "$0")" && pwd)
export AGENT_LABEL="${AGENT_LABEL:-surface-host-agent}" export AGENT_LABEL="${AGENT_LABEL:-surface-host-agent}"
export STATE_NAME="${STATE_NAME:-taler-surface-monitoring}" export STATE_NAME="${STATE_NAME:-taler-surface-monitoring}"
export TALER_DOMAIN="${TALER_DOMAIN:-hacktivism.ch}" export TALER_DOMAIN="${TALER_DOMAIN:-hacktivism.ch}"
# surface is remote-only — force flags (ignore shared env) # surface is primarily remote; versions may use host podman when available
export INSIDE_PODMAN=0 export INSIDE_PODMAN="${INSIDE_PODMAN:-1}"
export LOCAL_STACK=0 export LOCAL_STACK="${LOCAL_STACK:-0}"
export SKIP_SSH=1 export SKIP_SSH="${SKIP_SSH:-1}"
export INSIDE_MODE="${INSIDE_MODE:-none}" export INSIDE_MODE="${INSIDE_MODE:-local-podman}"
export CONTINUE_ON_ERROR="${CONTINUE_ON_ERROR:-1}" export CONTINUE_ON_ERROR="${CONTINUE_ON_ERROR:-1}"
# many hosts; allow up to 45 min wall (phase also has RUN_TIMEOUT)
export RUN_TIMEOUT="${RUN_TIMEOUT:-2400}" export RUN_TIMEOUT="${RUN_TIMEOUT:-2400}"
# dedicated job: always surface only (never inherit PHASES from shared env)
export PHASES="${PHASES:-surface monpages}" # All ecosystem checks → one surface HTML report
# Only merchant public front — not bank/exchange export PHASES="${PHASES:-surface mattermost mail versions monpages}"
export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}" export MON_HOSTS="${MON_HOSTS:-taler.hacktivism.ch}"
export HTML_OUT="${HTML_OUT:-$HOME/monitoring-sites-staging}" export HTML_OUT="${HTML_OUT:-$HOME/monitoring-sites-staging}"
export DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" export DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}"
@ -31,11 +38,12 @@ export HTML_URL_OK="/taler-monitoring-surface/"
export HTML_URL_ERR="/taler-monitoring-surface_err/" export HTML_URL_ERR="/taler-monitoring-surface_err/"
export PAGE_LABEL="taler-monitoring-surface" export PAGE_LABEL="taler-monitoring-surface"
# ecosystem catalog by default (not domain-only)
export SURFACE_SCOPE="${SURFACE_SCOPE:-ecosystem}" export SURFACE_SCOPE="${SURFACE_SCOPE:-ecosystem}"
export TALER_DOMAIN_FROM_CLI=0 export TALER_DOMAIN_FROM_CLI=0
# Do not run apt-deploy ensure for surface-only jobs
export APT_DEPLOY_ENSURE=0 export APT_DEPLOY_ENSURE=0
# monpages job-only for this path (surface HTML); not the 9 landings
export MONPAGES_INVENTORY="${MONPAGES_INVENTORY:-job}"
# package behind → ERROR (v1.8.0)
export TALER_PKG_BEHIND="${TALER_PKG_BEHIND:-error}"
exec bash "$AGENT_DIR/run-host-report.sh" "$@" exec bash "$AGENT_DIR/run-host-report.sh" "$@"

View file

@ -1,22 +1,18 @@
# mail-catalog.conf — domains and mail hosts for phase `mail` # mail-catalog.conf — domains and mail hosts for phase `mail` (v1.8.0+)
# #
# Format (whitespace-separated; # comments): # Format (whitespace-separated; # comments):
# domain expected_mx (comma) mail_hosts (comma) smtp_ports imap_ports label # domain expected_mx (comma) mail_hosts (comma) smtp_ports imap_ports label
# #
# - expected_mx: MX exchange hostnames that should appear (any match = OK if multiple) # Only these mail planes (no hacktivism / ad-hoc MX):
# - mail_hosts: servers to probe for SMTP/IMAP (A/AAAA + ports + optional banner) # • firefly.gnunet.org — taler.net + gnunet.org
# - ports: comma-separated; empty = skip that protocol family # • anastasis.taler-systems.com — Anastasis / TSA mail
# #
# Override path: MAIL_CATALOG=/path/to/file # Override path: MAIL_CATALOG=/path/to/file
#
# GNU Taler / GNUnet mail (firefly) + TSA (pixel / mail.anastasis.lu)
# --- firefly (primary for taler.net + gnunet.org) --- # --- firefly.gnunet.org ---
taler.net firefly.gnunet.org firefly.gnunet.org 25,465,587 143,993 taler-net taler.net firefly.gnunet.org firefly.gnunet.org 25,465,587 143,993 firefly-taler
gnunet.org firefly.gnunet.org firefly.gnunet.org 25,465,587 143,993 gnunet gnunet.org firefly.gnunet.org firefly.gnunet.org 25,465,587 143,993 firefly-gnunet
# --- taler-systems.com / pixel (MX mail.anastasis.lu → pixel) --- # --- anastasis.taler-systems.com ---
taler-systems.com mail.anastasis.lu,pixel.taler-systems.com pixel.taler-systems.com,mail.taler-systems.com,mail.anastasis.lu 25,465 143,993 tsa-pixel anastasis.taler-systems.com anastasis.taler-systems.com anastasis.taler-systems.com 25,465,587 143,993 anastasis-tsa
taler-systems.com anastasis.taler-systems.com anastasis.taler-systems.com 25,465,587 143,993 tsa-via-anastasis
# Optional related (same pixel path; keep expected MX loose)
# anastasis.lu mail.anastasis.lu mail.anastasis.lu,pixel.taler-systems.com 25,465 143,993 anastasis

View file

@ -46,6 +46,10 @@ bugs.gnunet.org 443 https gnunet-bugs
# --- taler-systems.com --- # --- taler-systems.com ---
www.taler-systems.com 443 https tsa-www www.taler-systems.com 443 https tsa-www
taler-systems.com 443 https tsa-apex taler-systems.com 443 https tsa-apex
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
# --- common infra hostnames (remote only; may 404/redirect) --- # --- common infra hostnames (remote only; may 404/redirect) ---
deb.taler.net 443 https deb-taler deb.taler.net 443 https deb-taler