diff --git a/.gitignore b/.gitignore index c4e7a0b..d192447 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ backups/* images/* !images/.gitkeep backup-jobs.conf +scripts/.h.sh +scripts/.harness.sh diff --git a/README.md b/README.md index 6598f72..54c33bf 100644 --- a/README.md +++ b/README.md @@ -1007,7 +1007,42 @@ vollqualifiziert, damit Podman sie nicht bei `registry.access.redhat.com` sucht. In der ncurses-Oberfläche liegt alles unter **„Terminal-Browser (Proxy Manager lokal bedienen)"**. -### 11.3 Grenze: Datei-Upload +### 11.3 Schwarzes Fenster: die Startseite antwortet nicht + +Bleibt nach `Starting Browsh …` / `Waiting for Firefox to connect…` alles +schwarz, liegt es fast immer daran, dass **auf der Startseite nichts +antwortet** – nicht am Browser. Ein Terminal-Browser zeigt in dem Fall keine +Fehlerseite, sondern gar nichts. Dass Browsh selbst läuft, merkt man daran, +dass `Strg+Q` noch ins Menü zurückführt. + +Das Skript prüft die Startseite deshalb vorher und nennt die Ursache: + +``` +[ WARN ] Auf http://127.0.0.1:81 antwortet nichts. +Ein Terminal-Browser zeigt dann nur eine schwarze Seite. + +Das ist die Oberflaeche des NGINX Proxy Managers. +Er ist abgeschaltet (NPM_ENABLED=off): + ./scripts/cmk-manage.sh npm-enable on + +Trotzdem starten? [j/N] +``` + +Unterschieden werden: + +| Lage | Meldung | +|---|---| +| Proxy Manager abgeschaltet | Hinweis auf `npm-enable on` | +| Container fehlt oder gestoppt | Hinweis auf `up` | +| Container läuft, antwortet aber nicht | Hinweis auf `logs` und `npm-port` | +| Checkmk-Oberfläche (Port 5000) tot | Hinweis auf `up` bzw. `sites` | +| externe Adresse | Hinweis auf den Netzzugang des Hosts | + +Mit `--no-check` lässt sich die Prüfung überspringen. In der Oberfläche +erscheint dieselbe Diagnose als Dialog mit der Wahl, trotzdem zu starten oder +im Menü eine andere Startseite einzugeben. + +### 11.4 Grenze: Datei-Upload Ein Terminal-Browser kann keinen Dateiauswahl-Dialog des Betriebssystems öffnen. Für **Let's Encrypt** ist das egal (dort werden nur Formularfelder @@ -1066,7 +1101,7 @@ sudo ./scripts/cmk-manage.sh browser --engine shell > E-Mail-Adresse und Kennwort. Das geht am einfachsten im Browser > (`cmk-manage.sh browser`); danach funktioniert die API mit den neuen Daten. -### 11.4 Alternative: SSH-Tunnel +### 11.5 Alternative: SSH-Tunnel Falls SSH auf die Maschine möglich ist, ist der Tunnel der bequemste Weg – dann bedient man die Oberfläche im gewohnten Browser: @@ -1833,8 +1868,9 @@ Checkmk-Werksnotizen (Werks/Release Notes) lesen. | Adminoberfläche aus dem LAN nicht erreichbar | Port 81 gesperrt. Auf einen freien Port legen: `cmk-manage.sh npm-port 10443` und in der Firewall freigeben | | Nach `npm-port` antwortet der neue Port nicht | Proxy Manager wurde nicht neu gestartet: `cmk-manage.sh restart`; Datei prüfen: `data/npm/data/nginx/custom/http.conf` | | `cmk-manage.sh` bricht mit „CMK_RUNTIME … ist nicht installiert" ab | wird nur noch gewarnt und selbst gesucht; sauber setzen mit `config set CMK_RUNTIME auto` | +| Browser bleibt schwarz, „Waiting for Firefox to connect…" | Die Startseite antwortet nicht – meist läuft der Proxy Manager nicht. Das Skript meldet das jetzt vorab, siehe [Kapitel 11.3](#113-schwarzes-fenster-die-startseite-antwortet-nicht) | | Proxy-Manager-Oberfläche im Browser leer / nur Textfragmente | Textbrowser ohne JavaScript verwendet. `cmk-manage.sh browser --engine browsh` (bzw. `carbonyl`) nehmen | -| Selbstsigniertes Zertifikat lässt sich im Terminal-Browser nicht hochladen | Datei-Dialoge gibt es dort nicht – Upload über die API, siehe [Kapitel 11.3](#113-grenze-datei-upload) | +| Selbstsigniertes Zertifikat lässt sich im Terminal-Browser nicht hochladen | Datei-Dialoge gibt es dort nicht – Upload über die API, siehe [Kapitel 11.4](#114-grenze-datei-upload) | | `browser` meldet „braucht ein echtes Terminal" | Aufruf aus Pipe/Skript. Direkt auf der Konsole oder per SSH aufrufen; nur der Bau geht headless mit `--build-only` | | Menüpunkt bricht mit einer Fehlermeldung in die Shell ab | behoben: fehlende Container, Sites oder Backups werden jetzt als Dialog gemeldet, die Oberfläche bleibt offen | | `job auto on` meldet fehlende Rechte | `/etc/cron.d/` braucht root: mit `sudo` aufrufen, oder die ausgegebenen Zeilen selbst übernehmen | diff --git a/README_en.md b/README_en.md index 5f3a5ac..318584a 100644 --- a/README_en.md +++ b/README_en.md @@ -1014,7 +1014,43 @@ so that Podman does not look for them at `registry.access.redhat.com`. In the ncurses interface everything lives under *"Terminal-Browser (Proxy Manager lokal bedienen)"*. -### 11.3 Limitation: file upload +### 11.3 Blank screen: the start page does not answer + +If everything stays black after `Starting Browsh …` / +`Waiting for Firefox to connect…`, it is almost always because **nothing +answers on the start page** – not because of the browser. A terminal browser +shows no error page in that case, just nothing. You can tell that Browsh itself +is running because `Ctrl+Q` still returns you to the menu. + +The script therefore checks the start page beforehand and names the cause: + +``` +[ WARN ] Auf http://127.0.0.1:81 antwortet nichts. +Ein Terminal-Browser zeigt dann nur eine schwarze Seite. + +Das ist die Oberflaeche des NGINX Proxy Managers. +Er ist abgeschaltet (NPM_ENABLED=off): + ./scripts/cmk-manage.sh npm-enable on + +Trotzdem starten? [j/N] +``` + +("nothing answers on …", "a terminal browser then shows only a black page", +"it is switched off", "start anyway?") The cases it distinguishes: + +| Situation | Message | +|---|---| +| Proxy Manager switched off | points to `npm-enable on` | +| container missing or stopped | points to `up` | +| container runs but does not answer | points to `logs` and `npm-port` | +| Checkmk interface (port 5000) dead | points to `up` or `sites` | +| external address | points to the host's network access | + +`--no-check` skips the check. In the interface the same diagnosis appears as a +dialog offering to start anyway or to pick a different start page from the +menu. + +### 11.4 Limitation: file upload A terminal browser cannot open the operating system's file chooser. For **Let's Encrypt** that does not matter (only form fields are filled in), but @@ -1073,7 +1109,7 @@ sudo ./scripts/cmk-manage.sh browser --engine shell > address and password. That is easiest in the browser > (`cmk-manage.sh browser`); afterwards the API works with the new credentials. -### 11.4 Alternative: SSH tunnel +### 11.5 Alternative: SSH tunnel If SSH access to the machine is possible, a tunnel is the most convenient route – you then use the interface in your usual browser: @@ -1843,8 +1879,9 @@ release notes beforehand. | Admin interface unreachable from the LAN | port 81 blocked. Move it to a free port: `cmk-manage.sh npm-port 10443` and open that in the firewall | | New port does not answer after `npm-port` | the Proxy Manager was not restarted: `cmk-manage.sh restart`; check the file `data/npm/data/nginx/custom/http.conf` | | `cmk-manage.sh` aborts with "CMK_RUNTIME … ist nicht installiert" | it now only warns and detects the runtime itself; set it cleanly with `config set CMK_RUNTIME auto` | +| Browser stays black, "Waiting for Firefox to connect…" | The start page does not answer – usually the Proxy Manager is not running. The script now reports this beforehand, see [chapter 11.3](#113-blank-screen-the-start-page-does-not-answer) | | Proxy Manager interface blank / only text fragments | a text browser without JavaScript was used. Use `cmk-manage.sh browser --engine browsh` (or `carbonyl`) | -| Self-signed certificate cannot be uploaded in the terminal browser | there are no file dialogs there – upload via the API, see [chapter 11.3](#113-limitation-file-upload) | +| Self-signed certificate cannot be uploaded in the terminal browser | there are no file dialogs there – upload via the API, see [chapter 11.4](#114-limitation-file-upload) | | `browser` reports "braucht ein echtes Terminal" (needs a real terminal) | called from a pipe/script. Call it on the console or over SSH; only the build runs headless, with `--build-only` | | A menu entry drops out to the shell with an error | fixed: missing containers, sites or backups are now reported in a dialog and the interface stays open | | `job auto on` reports missing permissions | `/etc/cron.d/` needs root: call it with `sudo`, or add the printed lines yourself | diff --git a/scripts/cmk-manage.sh b/scripts/cmk-manage.sh index 598815e..7b5840b 100755 --- a/scripts/cmk-manage.sh +++ b/scripts/cmk-manage.sh @@ -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? + + 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 }