diff --git a/README.md b/README.md index 4be83c0..417689d 100644 --- a/README.md +++ b/README.md @@ -1830,15 +1830,46 @@ Damit es auch auf der Gegenseite passt: Wer die Sitzung dauerhaft so haben möchte, speichert sie in PuTTY unter *Session → Saved Sessions*. -> Hilft beides nicht – etwa weil auf dem Server keine UTF-8-Locale -> installiert werden darf – lässt sich die Oberfläche mit einfachen -> ASCII-Rahmen zeichnen: +#### Wenn es trotzdem nicht passt: nachsehen statt raten + +```bash +./scripts/cmk-manage.sh tui-check +``` + +Das gibt zwei Testzeilen aus: + +* **Zeile A** – echte UTF-8-Rahmenzeichen (`┌──┐`) +* **Zeile B** – die alte VT100-Umschaltung `ESC(0` mit den Buchstaben `lqk` + +Daran lässt sich die Ursache ablesen: + +| Beobachtung | Bedeutung | +|---|---| +| A Linien, B Linien | alles in Ordnung | +| A Linien, **B zeigt `lqqqk`** | das Terminal macht die VT100-Umschaltung nicht mit – **der PuTTY-Fall**, siehe Einstellungen oben | +| A zeigt Kauderwelsch | das Terminal läuft nicht im UTF-8-Modus | +| beide zeigen Buchstaben | die Schrift hat keine Rahmenzeichen | + +Das Kommando nennt zu jeder Beobachtung gleich die passende Abhilfe. + +> **`dialog` statt `whiptail` installieren** ist auf dieser Seite der wirksamste +> Griff – es geht mit dem Zeichensatz zuverlässiger um und kann als einziges +> auch einfache ASCII-Rahmen: +> +> ```bash +> sudo dnf install -y dialog # RHEL/Rocky/Alma +> sudo apt-get install -y dialog # Debian/Ubuntu +> ``` +> +> Das Skript bevorzugt `dialog`, sobald es vorhanden ist. Danach lassen sich +> notfalls einfache Rahmen erzwingen: > > ```bash > CMK_TUI_ASCII=1 ./scripts/cmk-manage.sh gui > ``` > -> Das wirkt allerdings nur mit `dialog`; `whiptail` kennt keine solche Option. +> Ohne `dialog` sagt das Skript das ausdrücklich – `whiptail` kennt keine +> solche Option. ### 14.5 Selbstprüfung diff --git a/README_en.md b/README_en.md index 1c60cac..767ea48 100644 --- a/README_en.md +++ b/README_en.md @@ -1830,14 +1830,46 @@ So that the other end matches: Save the session under *Session → Saved Sessions* to keep these settings. -> If neither helps – for instance because no UTF-8 locale may be installed on -> the server – the interface can be drawn with plain ASCII borders: +#### If it still looks wrong: look instead of guessing + +```bash +./scripts/cmk-manage.sh tui-check +``` + +This prints two test lines: + +* **Line A** – real UTF-8 box-drawing characters (`┌──┐`) +* **Line B** – the old VT100 switch `ESC(0` with the letters `lqk` + +The cause can be read off them: + +| Observation | Meaning | +|---|---| +| A lines, B lines | everything is fine | +| A lines, **B shows `lqqqk`** | the terminal ignores the VT100 switch – **the PuTTY case**, see the settings above | +| A shows gibberish | the terminal is not in UTF-8 mode | +| both show letters | the font has no box-drawing glyphs | + +The command names the matching remedy for each observation. + +> **Installing `dialog` instead of `whiptail`** is the most effective move on +> this side – it handles the character set more reliably and is the only one +> that can draw plain ASCII borders: +> +> ```bash +> sudo dnf install -y dialog # RHEL/Rocky/Alma +> sudo apt-get install -y dialog # Debian/Ubuntu +> ``` +> +> The script prefers `dialog` as soon as it is present. After that, plain +> borders can be forced if needed: > > ```bash > CMK_TUI_ASCII=1 ./scripts/cmk-manage.sh gui > ``` > -> This only works with `dialog`; `whiptail` has no such option. +> Without `dialog` the script says so explicitly – `whiptail` has no such +> option. ### 14.5 Self-check diff --git a/scripts/cmk-manage.sh b/scripts/cmk-manage.sh index 7082999..2434dff 100755 --- a/scripts/cmk-manage.sh +++ b/scripts/cmk-manage.sh @@ -50,6 +50,8 @@ KOMMANDOS - Stack status Status von Containern und Sites anzeigen logs [-f] [DIENST] Logs anzeigen selftest Skripte auf bekannte Fallstricke pruefen + tui-check Testzeilen fuer die Rahmendarstellung ausgeben + (hilft bei q/x/l/m statt Linien, etwa in PuTTY) shell Root-Shell im Checkmk-Container omd ARG... beliebiges omd-Kommando im Container ausfuehren @@ -4669,6 +4671,69 @@ Backups : $BACKUP_DIR" \ ok "Beendet." } +# ===================================================================== +# Terminal pruefen +# +# Zeigt zwei Testzeilen. Woran es liegt, laesst sich an ihnen ablesen - +# ohne Raten: +# Zeile A sind echte UTF-8-Rahmenzeichen (U+2500 ff.) +# Zeile B ist die alte VT100-Umschaltung ESC(0 mit den Buchstaben lqk +# Genau diese Buchstaben erscheinen, wenn das Terminal die Umschaltung +# nicht mitmacht - der Fall bei PuTTY im UTF-8-Modus. +# ===================================================================== +cmd_tui_check() { + ui_fix_locale || true + ui_init + + printf '\n%sWas dieses Terminal meldet%s\n' "$C_BLD" "$C_RST" + printf ' TERM : %s\n' "${TERM:-}" + printf ' LANG : %s\n' "${LANG:-}" + printf ' LC_ALL : %s\n' "${LC_ALL:-}" + printf ' LC_CTYPE : %s\n' "${LC_CTYPE:-}" + printf ' Zeichensatz : %s\n' "$(locale charmap 2>/dev/null || echo unbekannt)" + printf ' Programm : %s\n' "${UI_BIN:-keines (dialog/whiptail fehlt)}" + [ -n "${UI_LOCALE_NOTE:-}" ] && printf ' Angepasst : %s\n' "$UI_LOCALE_NOTE" + + printf '\n%sZeile A - echte UTF-8-Rahmenzeichen%s\n' "$C_BLD" "$C_RST" + printf ' ┌────────┐\n' + printf ' │ Rahmen │\n' + printf ' └────────┘\n' + + printf '\n%sZeile B - alte VT100-Umschaltung (ESC(0)%s\n' "$C_BLD" "$C_RST" + printf ' \033(0lqqqqqqqqk\033(B\n' + printf ' \033(0x\033(B Rahmen \033(0x\033(B\n' + printf ' \033(0mqqqqqqqqj\033(B\n' + + cat < Translation -> Remote character set: UTF-8 + Window -> Translation -> Handling of line drawing characters: + "Use Unicode line drawing code points" + Connection -> Data -> Terminal-type string: xterm-256color + Auf dieser Seite hilft zusaetzlich 'dialog' statt 'whiptail': + dnf install -y dialog bzw. apt-get install -y dialog + Oder einfache Rahmen erzwingen: + CMK_TUI_ASCII=1 $SELF gui + + A zeigt Kaese wie a-- oder Fragezeichen + Das Terminal laeuft NICHT im UTF-8-Modus. + In PuTTY: Window -> Translation -> Remote character set: UTF-8 + + Beide Zeilen zeigen Buchstaben + Schrift ohne Rahmenzeichen. In PuTTY unter + Window -> Appearance eine andere waehlen, z.B. Consolas + oder DejaVu Sans Mono. + +EOF +} + # ===================================================================== # Selbstpruefung # @@ -4831,6 +4896,7 @@ main() { proxy) cmd_proxy "$@" ;; config) cmd_config "$@" || true ;; selftest) cmd_selftest ;; + tui-check) cmd_tui_check ;; help|-h|--help) usage ;; *) err "Unbekanntes Kommando: $cmd"; echo; usage; exit 1 ;; esac diff --git a/scripts/lib/common.sh b/scripts/lib/common.sh index 7550cc7..54b6ea2 100644 --- a/scripts/lib/common.sh +++ b/scripts/lib/common.sh @@ -338,24 +338,38 @@ ui_ascii_args() { case "${CMK_TUI_ASCII:-}${UI_ASCII:-}" in '') return 0 ;; esac - # Nur dialog kann das; whiptail kennt die Option nicht. if [ "${UI_BIN:-}" = dialog ] && dialog --ascii-lines --print-version >/dev/null 2>&1; then UI_EXTRA=(--ascii-lines) + elif [ -z "${UI_ASCII_WARNED:-}" ]; then + UI_ASCII_WARNED=1 + warn "Einfache Rahmen kann nur 'dialog' zeichnen - 'whiptail' kennt + die Option nicht. Installieren mit: + dnf install -y dialog (RHEL/Rocky/Alma) + apt-get install -y dialog (Debian/Ubuntu)" fi return 0 } ui_init() { ui_fix_locale || true - ui_ascii_args + # Geometrie IMMER setzen - sonst laeuft das Skript unter "set -u" auf # eine unbound variable, wenn UI_BIN von aussen vorgegeben wurde. UI_H="${UI_H:-22}"; UI_W="${UI_W:-78}"; UI_MH="${UI_MH:-13}" - [ -n "${UI_BIN:-}" ] && return 0 - if command -v dialog >/dev/null 2>&1; then UI_BIN=dialog - elif command -v whiptail >/dev/null 2>&1; then UI_BIN=whiptail - else UI_BIN=""; fi - export DIALOGRC="${DIALOGRC:-}" + + if [ -z "${UI_BIN:-}" ]; then + if command -v dialog >/dev/null 2>&1; then UI_BIN=dialog + elif command -v whiptail >/dev/null 2>&1; then UI_BIN=whiptail + else UI_BIN=""; fi + export DIALOGRC="${DIALOGRC:-}" + fi + + # Einfache Rahmen koennen nur mit dialog gezeichnet werden. Ist das + # gewuenscht und dialog vorhanden, wird es dafuer vorgezogen. + if [ -n "${CMK_TUI_ASCII:-}${UI_ASCII:-}" ] && command -v dialog >/dev/null 2>&1; then + UI_BIN=dialog + fi + ui_ascii_args } ui_available() { ui_init; [ -n "$UI_BIN" ]; }