Terminal-Browser: nicht erreichbare Startseite wird vorab gemeldet

Symptom war ein scheinbar haengender Browsh: Logo, "Waiting for Firefox
to connect...", danach schwarz. Ursache ist nicht der Browser - Browsh
laeuft (Strg+Q kehrt ins Menue zurueck) - sondern die Startseite. Auf
http://127.0.0.1:81 antwortet nichts, solange der Proxy-Manager-Container
nicht laeuft, und ein Terminal-Browser zeigt dann keine Fehlerseite,
sondern gar nichts.

cmd_browser prueft die Startseite deshalb vorher und nennt die Ursache
statt stumm zu starten. Unterschieden werden: Proxy Manager
abgeschaltet (NPM_ENABLED=off), Container fehlt, Container gestoppt,
Container laeuft aber antwortet nicht, tote Checkmk-Oberflaeche auf
Port 5000 und externe Adressen. Jeweils mit dem passenden naechsten
Kommando. Ueberspringen mit --no-check; in der Oberflaeche erscheint
dieselbe Diagnose als Dialog mit der Wahl, trotzdem zu starten.

Dabei gefunden und behoben - an drei Stellen dieselbe Falle:
curl gibt mit -w '%{http_code}' im Fehlerfall selbst schon "000" aus.
Das zusaetzliche "|| echo 000" haengte einen zweiten Wert an, sodass
der Vergleich nie zutraf. Betroffen waren die neue Erreichbarkeits-
pruefung sowie http_code() und die Registry-Erreichbarkeit im
Zugangsdaten-Test ("image test") - dort waere ein nicht erreichbarer
Endpunkt als "unerwartete Antwort" statt als "nicht erreichbar"
gemeldet worden. Jetzt wird der Fehler der Zuweisung abgefangen.

Alle vier Diagnosezweige im Terminal durchgespielt, der
Zugangsdaten-Test zur Gegenprobe erneut gegen Docker Hub gelaufen.
Dokumentiert als Abschnitt 11.3 in beiden Sprachfassungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 15:32:39 +02:00
co-authored by Claude Opus 5
parent 2d645bcc0b
commit c98caaaf35
4 changed files with 169 additions and 11 deletions
+88 -5
View File
@@ -702,7 +702,9 @@ http_code() { # url [netrc] [extra-header]
local -a a=(-sS -o /dev/null -w '%{http_code}' --max-time 30)
[ -n "$netrc" ] && a+=(--netrc-file "$netrc")
[ -n "$hdr" ] && a+=(-H "$hdr")
curl "${a[@]}" "$url" 2>/dev/null || echo "000"
local code
code="$(curl "${a[@]}" "$url" 2>/dev/null)" || code=000
printf '%s\n' "${code:-000}"
}
test_result() { # status text [detail]
@@ -744,7 +746,8 @@ test_registry_login() { # reg repo user pass needs_login -> 0 = alles gut
# 1) Erreichbarkeit
local hdrf; hdrf="$(mktemp)"
local code
code="$(curl -sS -o /dev/null -D "$hdrf" -w '%{http_code}' --max-time 30 "https://$api/v2/" 2>/dev/null || echo 000)"
code="$(curl -sS -o /dev/null -D "$hdrf" -w '%{http_code}' --max-time 30 "https://$api/v2/" 2>/dev/null)" || code=000
code="${code:-000}"
if [ "$code" = "000" ]; then
test_result fail "nicht erreichbar" "Netzwerk/Proxy/DNS pruefen: https://$api/v2/"
rm -f "$hdrf"; return 1
@@ -2343,9 +2346,66 @@ browser_ensure_tools() {
image_exists_local "$img" || browser_build_tools
}
# Antwortet die Startseite ueberhaupt? Ein Terminal-Browser zeigt sonst
# nur eine schwarze Seite - ohne jede Fehlermeldung.
browser_url_reachable() {
command -v curl >/dev/null 2>&1 || return 0 # ohne curl nicht pruefbar
local code
# ACHTUNG: curl gibt bei einem Fehler selbst schon "000" aus. Ein
# zusaetzliches "|| echo 000" wuerde einen zweiten Wert anhaengen und
# jeden Vergleich verfaelschen - deshalb den Zuweisungsfehler abfangen.
code="$(curl -sS -o /dev/null -w '%{http_code}' --max-time 6 -L "$1" 2>/dev/null)" || code=000
[ -n "$code" ] && [ "$code" != "000" ]
}
# Erklaert, warum nichts antwortet, und nennt den passenden naechsten Schritt
browser_diagnose_url() { # url -> mehrzeiliger Text auf stdout
local url="$1" host port
host="$(printf '%s' "$url" | sed -E 's|^[a-z]+://([^/:]+).*|\1|')"
port="$(printf '%s' "$url" | sed -nE 's|^[a-z]+://[^/:]+:([0-9]+).*|\1|p')"
printf 'Auf %s antwortet nichts.\n' "$url"
printf 'Ein Terminal-Browser zeigt dann nur eine schwarze Seite.\n\n'
case "$host" in
127.0.0.1|localhost|::1)
if [ "${port:-81}" = "${NPM_ADMIN_PORT:-81}" ]; then
printf 'Das ist die Oberflaeche des NGINX Proxy Managers.\n'
if ! npm_enabled; then
printf 'Er ist abgeschaltet (NPM_ENABLED=off):\n'
printf ' %s npm-enable on\n' "$SELF"
elif ! container_exists "$NPM_CONTAINER_NAME"; then
printf 'Sein Container existiert nicht:\n'
printf ' %s up\n' "$SELF"
elif ! container_running "$NPM_CONTAINER_NAME"; then
printf 'Sein Container ist gestoppt:\n'
printf ' %s up\n' "$SELF"
else
printf 'Der Container laeuft, antwortet aber nicht auf Port %s.\n' "${port:-81}"
printf ' %s logs %s\n' "$SELF" "$NPM_CONTAINER_NAME"
printf ' %s npm-port (eingestellten Port pruefen)\n' "$SELF"
fi
elif [ "${port:-}" = 5000 ]; then
printf 'Das ist die Checkmk-Oberflaeche.\n'
if ! container_running "$CMK_CONTAINER_NAME"; then
printf 'Der Checkmk-Container laeuft nicht:\n %s up\n' "$SELF"
else
printf 'Der Container laeuft - Site gestartet?\n %s sites\n' "$SELF"
fi
else
printf 'Auf diesem Host lauscht nichts auf Port %s.\n' "${port:-80}"
printf ' ss -tlnp | grep %s\n' "${port:-80}"
fi ;;
*)
printf 'Externe Adressen brauchen Netzzugang vom Host aus\n'
printf '(der Container nutzt dessen Netzwerk direkt).\n'
printf ' curl -I %s\n' "$url" ;;
esac
}
cmd_browser() {
local engine="${BROWSER_ENGINE:-browsh}"
local url="" build="" build_only="" pull="" mono=""
local url="" build="" build_only="" pull="" mono="" nocheck=""
while [ $# -gt 0 ]; do
case "$1" in
-e|--engine) engine="$2"; shift 2 ;;
@@ -2354,6 +2414,7 @@ cmd_browser() {
--build-only) build=1; build_only=1; shift ;;
--pull) pull=1; shift ;;
--monochrome) mono=1; shift ;;
--no-check) nocheck=1; shift ;;
-h|--help)
cat <<'EOF'
cmk-manage.sh browser - Terminal-Browser im Container
@@ -2370,6 +2431,7 @@ cmk-manage.sh browser - Terminal-Browser im Container
--build-only Werkzeug-Image nur bauen (ohne Terminal, z.B. im Skript)
--pull Image der gewaehlten Engine neu laden
--monochrome nur bei browsh: einfarbige Darstellung
--no-check Startseite nicht vorab auf Erreichbarkeit pruefen
Bedienung browsh: Strg+L Adresszeile, Strg+T neuer Tab,
Strg+W Tab schliessen, Strg+Q beenden
@@ -2437,6 +2499,15 @@ EOF
Dafuer: $SELF browser --engine browsh" ;;
esac
# Nicht erreichbare Startseite ist die haeufigste Ursache fuer eine
# scheinbar haengende, schwarze Anzeige.
if [ -z "$nocheck" ] && ! browser_url_reachable "$url"; then
echo
warn "$(browser_diagnose_url "$url")"
echo
confirm "Trotzdem starten?" || die "Abgebrochen."
fi
log "Starte $engine im Host-Netzwerk -> $url"
[ "$engine" = browsh ] && log "Beenden mit Strg+Q, Adresszeile mit Strg+L."
@@ -3201,8 +3272,20 @@ Oberflaeche des Proxy Managers darstellen." \
[ -n "$u" ] && NPM_ADMIN_URL="$u" ;;
build) ui_run "Werkzeug-Image bauen" bash -c "cd '$PROJECT_DIR' && '$SELF' browser --build-only" || true ;;
back) return 0 ;;
*) gui_run_interactive cmd_browser --engine "$sel" \
--url "${NPM_ADMIN_URL:-http://127.0.0.1:81}" ;;
*) local burl="${NPM_ADMIN_URL:-http://127.0.0.1:81}"
if ! browser_url_reachable "$burl"; then
if ui_yesno "Startseite antwortet nicht" \
"$(browser_diagnose_url "$burl")
Trotzdem starten?
<Nein> kehrt ins Menue zurueck - dort laesst sich unter
'Andere Startseite eingeben' auch eine andere Adresse waehlen."; then
gui_run_interactive cmd_browser --engine "$sel" --url "$burl" --no-check
fi
continue
fi
gui_run_interactive cmd_browser --engine "$sel" --url "$burl" ;;
esac
done
}