Assistent statt doppelter Abfragen beim Image-Beschaffen

Der bisherige Ablauf war umstaendlich: Version in den Einstellungen
aendern -> Warnung, dass CMK_IMAGE nicht passt -> "Image holen?" ->
und dann erneut nach Edition, Version UND Zugangsdaten fragen,
obwohl alles schon dastand.

Jetzt ein Menuepunkt "Image beschaffen" (im Image-Menue und unter
Einstellungen -> Checkmk-Image und Zugangsdaten), der in einem
Durchgang durch Edition, Version und Bezugsweg fuehrt:
  Registry holen | Tarball herunterladen | vorhandene Datei einspielen
  | nichts holen, nur eintragen
Danach stehen CMK_EDITION, CMK_VERSION und CMK_IMAGE gemeinsam richtig.

Nach Zugangsdaten wird nur noch gefragt, wenn sie fuer den gewaehlten
Weg tatsaechlich fehlen - hinterlegte werden verwendet. Wer sie neu
eingibt, kann sie gleich in der .env speichern lassen.

Die drei Werte sind in der Oberflaeche nicht mehr einzeln editierbar
(neuer Feldtyp "info"): ein Klick darauf bietet den Assistenten an.
Damit koennen sie nicht mehr auseinanderlaufen. Auf der Kommandozeile
bleibt alles wie bisher einzeln setzbar; "image pull" und
"image download" haben dafuer neu --remember, das Edition und Version
mit in die .env schreibt.

Das Image-Menue wird dadurch kuerzer: status, versions, holen, test,
use. Die frueheren Einzelpunkte pull/download/load stecken im
Assistenten.

Geprueft: mit hinterlegten Zugangsdaten vier Dialoge und keine
Nachfrage; ohne Zugangsdaten und Bezugsweg Registry wird genau einmal
nach Benutzer, Kennwort und Speichern gefragt; der Weg "nur eintragen"
fragt gar nicht. Alle Menues kehren sauber zurueck.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 16:39:26 +02:00
co-authored by Claude Opus 5
parent 7a93dd5dbf
commit 7b26042fa4
3 changed files with 192 additions and 28 deletions
+151 -26
View File
@@ -128,12 +128,14 @@ KOMMANDOS - Checkmk-Image beschaffen
--registry R abweichende Registry
--user U --password P Zugangsdaten (Enterprise: Kundenportal)
--image REF fertige Referenz statt Edition/Version
--remember CMK_EDITION und CMK_VERSION mit in die .env schreiben
--no-set .env nicht veraendern
image download [Opt.] Image-Tarball vom Downloadportal holen und einspielen
--edition/--version/--user/--password wie oben
--url URL vollstaendige URL fest vorgeben
--dir VERZ Ablage (Vorgabe: $IMAGE_DIR)
--keep Tarball nach dem Einspielen behalten
--remember CMK_EDITION und CMK_VERSION mit in die .env schreiben
image load --file F bereits heruntergeladenen Tarball einspielen
image use REF vorhandenes Image als CMK_IMAGE in die .env eintragen
@@ -569,6 +571,7 @@ image_cmd_pull() {
--password) pass="$2"; shift 2 ;;
--image) ref="$2"; shift 2 ;;
--no-set) setenv=""; shift ;;
--remember) remember=1; shift ;;
*) die "Unbekannte Option fuer 'image pull': $1" ;;
esac
done
@@ -622,6 +625,10 @@ EOF
return 1
fi
ok "Image vorhanden: $ref"
if [ -n "$remember" ]; then
env_set CMK_EDITION "$edition"; env_set CMK_VERSION "$version"
log "CMK_EDITION=$edition und CMK_VERSION=$version uebernommen."
fi
[ -n "$setenv" ] && image_set_env "$ref"
return 0
}
@@ -632,7 +639,7 @@ EOF
image_cmd_download() {
local edition="${CMK_EDITION:-raw}" version="${CMK_VERSION:-}"
local user="${CMK_DOWNLOAD_USER:-}" pass="${CMK_DOWNLOAD_PASSWORD:-}"
local url="${CMK_DOWNLOAD_URL:-}" dir="" keep="" setenv=1
local url="${CMK_DOWNLOAD_URL:-}" dir="" keep="" setenv=1 remember=""
while [ $# -gt 0 ]; do
case "$1" in
--edition) edition="$2"; shift 2 ;;
@@ -643,6 +650,7 @@ image_cmd_download() {
--dir) dir="$2"; shift 2 ;;
--keep) keep=1; shift ;;
--no-set) setenv=""; shift ;;
--remember) remember=1; shift ;;
*) die "Unbekannte Option fuer 'image download': $1" ;;
esac
done
@@ -694,6 +702,10 @@ EOF
local loaded
loaded="$(image_load_file "$target")" || return 1
ok "Image eingespielt: $loaded"
if [ -n "$remember" ]; then
env_set CMK_EDITION "$edition"; env_set CMK_VERSION "$version"
log "CMK_EDITION=$edition und CMK_VERSION=$version uebernommen."
fi
[ -z "$keep" ] && { rm -f "$target"; log "Tarball entfernt (mit --keep behalten)."; }
[ -n "$setenv" ] && image_set_env "$loaded"
return 0
@@ -2459,9 +2471,9 @@ settings_defs() {
cat <<'EOF'
runtime|CMK_RUNTIME|choice|Container-Runtime|auto:docker:podman|1
runtime|TZ|text|Zeitzone||
image|CMK_IMAGE|text|VERWENDETES Image - setzt "image pull"||
image|CMK_EDITION|choice|Edition (nur Vorgabe, wirkt ueber "image pull")|raw:community:free:cloud:managed:pro:ultimate:ultimatemt:enterprise|
image|CMK_VERSION|text|Version (nur Vorgabe, wirkt ueber "image pull")||
image|CMK_IMAGE|info|VERWENDETES Image (setzt der Assistent)||1
image|CMK_EDITION|info|Edition (setzt der Assistent)||1
image|CMK_VERSION|info|Version (setzt der Assistent)||1
image|CMK_REGISTRY|text|Registry fuer Enterprise||1
image|CMK_REGISTRY_USER|text|Registry-Benutzer||1
image|CMK_REGISTRY_PASSWORD|password|Registry-Kennwort||1
@@ -3379,23 +3391,16 @@ gui_image_menu() {
Edition/Version: ${CMK_EDITION:-raw} / ${CMK_VERSION:-?}" \
status "Status und lokale Images anzeigen" \
versions "Verfuegbare Versionen auflisten" \
holen "Image beschaffen (Assistent: Edition, Version, Bezugsweg)" \
test "Zugangsdaten pruefen (Registry und Downloadportal)" \
pull "Aus Registry holen (Docker Hub / registry.checkmk.com)" \
download "Tarball vom Downloadportal holen (mit Zugangsdaten)" \
load "Heruntergeladenen Tarball einspielen (load)" \
use "Vorhandenes Image auswaehlen" \
use "Vorhandenes lokales Image auswaehlen" \
back "zurueck")" || return 0
case "$sel" in
status) local f; f="$(mktemp)"; NO_COLOR=1 cmd_image status >"$f" 2>&1 || true
ui_text "Image-Status" "$f"; rm -f "$f" ;;
versions) gui_image_versions || true ;;
holen) gui_image_wizard || true ;;
test) gui_image_test || true ;;
pull) gui_image_pull || true ;;
download) gui_image_download || true ;;
load) local lf; lf="$(ui_pick_file "${IMAGE_DIR:-$PROJECT_DIR/images}" '*.tar.gz')" || continue
[ -n "$lf" ] || continue
ui_run "Image einspielen" bash -c "cd '$PROJECT_DIR' && '$SELF' -y image load --file '$lf'"
load_env "${ENV_FILE:-$PROJECT_DIR/.env}" ;;
use) gui_image_use || true ;;
back) return 0 ;;
esac
@@ -3458,6 +3463,121 @@ Quelle: oeffentliches Versionsarchiv von checkmk.com" "${items[@]}")" || return
fi
}
# ---------------------------------------------------------------------
# Assistent: Image beschaffen
#
# Fuehrt in einem Durchgang durch Edition, Version und Bezugsweg und
# schreibt anschliessend CMK_EDITION, CMK_VERSION und CMK_IMAGE.
# Bereits hinterlegte Zugangsdaten werden verwendet - danach wird nur
# gefragt, wenn sie fuer den gewaehlten Weg fehlen.
# ---------------------------------------------------------------------
gui_image_wizard() {
local ed ver src
local cur_img="${CMK_IMAGE:-<nicht gesetzt>}"
ed="$(ui_menu "Image beschaffen (1/3) - Edition" \
"Derzeit verwendet: $cur_img
Eingestellt : ${CMK_EDITION:-?} / ${CMK_VERSION:-?}
Links der Name, den dieses Werkzeug verwendet,
rechts der Name auf checkmk.com." \
raw "= Community auf der Website (frei, bis 2.4)" \
community "= Community (frei, ab 2.5)" \
enterprise "= Pro auf der Website (Login noetig, bis 2.4)" \
pro "= Pro (ab 2.5)" \
cloud "= Ultimate auf der Website (bis 2.4)" \
ultimate "= Ultimate (ab 2.5)" \
managed "= Ultimate MT auf der Website (bis 2.4)" \
ultimatemt "= Ultimate MT (ab 2.5)")" || return 0
ver="$(gui_image_pick_version "$ed" "${CMK_VERSION:-}")" || return 0
[ -n "$ver" ] || return 0
# --- Bezugsweg -----------------------------------------------------
local reg_state dl_state
reg_state="$([ -n "${CMK_REGISTRY_USER:-}" ] && echo "Zugangsdaten hinterlegt" || echo "ohne Anmeldung")"
dl_state="$([ -n "${CMK_DOWNLOAD_USER:-}" ] && echo "Zugangsdaten hinterlegt" || echo "ohne Anmeldung")"
src="$(ui_menu "Image beschaffen (3/3) - Bezugsweg" \
"$ed $ver
Woher soll das Image kommen?" \
registry "Registry holen ($reg_state)" \
download "Tarball herunterladen ($dl_state)" \
file "Vorhandene Tarball-Datei einspielen" \
setonly "Nichts holen, nur Edition/Version eintragen")" || return 0
# --- Zugangsdaten nur erfragen, wenn sie wirklich fehlen -----------
local -a extra=()
local need_user="" u p
case "$src" in
registry) edition_needs_login "$ed" && [ -z "${CMK_REGISTRY_USER:-}" ] && need_user=registry ;;
download) case "$ed" in raw|community|free) : ;; *) [ -z "${CMK_DOWNLOAD_USER:-}" ] && need_user=download ;; esac ;;
esac
if [ -n "$need_user" ]; then
u="$(ui_input "Zugangsdaten fehlen" \
"Fuer diesen Weg werden Zugangsdaten des Checkmk-Kundenportals
gebraucht. Sie sind noch nicht hinterlegt.
Benutzer:" "")" || return 0
[ -n "$u" ] || { ui_msg "Abgebrochen" "Ohne Benutzer geht es nicht weiter."; return 0; }
p="$(ui_password "Zugangsdaten fehlen" "Kennwort:")" || return 0
extra+=(--user "$u" --password "$p")
if ui_yesno "Merken?" "Die Zugangsdaten fuer kuenftige Aufrufe in der .env speichern?"; then
if [ "$need_user" = registry ]; then
env_set CMK_REGISTRY_USER "$u"; env_set CMK_REGISTRY_PASSWORD "$p"
else
env_set CMK_DOWNLOAD_USER "$u"; env_set CMK_DOWNLOAD_PASSWORD "$p"
fi
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
fi
fi
# --- ausfuehren ----------------------------------------------------
case "$src" in
registry)
ui_run "Image holen: $ed $ver" bash -c \
"cd '$PROJECT_DIR' && '$SELF' -y image pull --edition '$ed' --version '$ver' --remember ${extra[*]+${extra[*]}}" ;;
download)
case "$ver" in
*-latest|latest|*-daily)
ui_msg "Nicht moeglich" \
"Fuer den Tarball-Download wird eine exakte Version gebraucht,
z.B. 2.3.0p23 - '$ver' gibt es dort nicht."
return 0 ;;
esac
ui_run "Tarball holen: $ed $ver" bash -c \
"cd '$PROJECT_DIR' && '$SELF' -y image download --edition '$ed' --version '$ver' --remember ${extra[*]+${extra[*]}}" ;;
file)
local lf
lf="$(ui_pick_file "${IMAGE_DIR:-$PROJECT_DIR/images}" '*.tar.gz')" || return 0
[ -n "$lf" ] || return 0
ui_run "Image einspielen" bash -c \
"cd '$PROJECT_DIR' && '$SELF' -y image load --file '$lf'"
ui_run "Edition/Version eintragen" bash -c \
"cd '$PROJECT_DIR' && '$SELF' -y config set CMK_EDITION '$ed' && '$SELF' -y config set CMK_VERSION '$ver'" ;;
setonly)
ui_run "Eintragen" bash -c \
"cd '$PROJECT_DIR' && '$SELF' -y config set CMK_EDITION '$ed' && '$SELF' -y config set CMK_VERSION '$ver'" ;;
esac
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
# --- Ergebnis ------------------------------------------------------
local cm
if cm="$(image_consistency_check)"; then
ui_msg "Fertig" \
"Verwendet wird jetzt:
${CMK_IMAGE:-<nicht gesetzt>}
Eingestellt: ${CMK_EDITION:-?} / ${CMK_VERSION:-?}
Wirksam wird das mit 'Stack steuern -> Stack starten'
(die Container werden dabei neu erstellt)."
else
ui_msg "Hinweis" "$cm"
fi
}
gui_image_versions() {
local ed
ed="$(gui_image_pick_edition)" || return 0
@@ -3550,6 +3670,20 @@ gui_settings_edit() {
opt="$(printf '%s' "$def" | cut -d'|' -f6)"
cur="$(settings_value "$key")"
if [ "$typ" = info ]; then
if ui_yesno "$key" \
"Aktuell: ${cur:-<leer>}
Dieser Wert wird vom Assistenten gesetzt, damit Edition,
Version und das tatsaechlich verwendete Image zusammenpassen.
Assistent jetzt starten?"; then
gui_image_wizard || true
fi
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
return 0
fi
while :; do
case "$typ" in
choice)
@@ -3594,17 +3728,6 @@ gui_settings_edit() {
ui_msg "Gespeichert" "$key = $([ "$typ" = password ] && echo '********' || echo "${new:-<leer>}")$hint"
# Zugangsdaten lassen sich sofort pruefen - das erspart den Umweg
case "$key" in
CMK_EDITION|CMK_VERSION)
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
local cm
if ! cm="$(image_consistency_check)"; then
if ui_yesno "Image passt nicht" \
"$cm
Image jetzt holen?"; then
gui_image_pull || true
fi
fi ;;
CMK_REGISTRY_USER|CMK_REGISTRY_PASSWORD|CMK_DOWNLOAD_USER|CMK_DOWNLOAD_PASSWORD|CMK_REGISTRY|CMK_DOWNLOAD_BASEURL)
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
if ui_yesno "Zugangsdaten pruefen" \
@@ -3630,7 +3753,8 @@ gui_settings_category() {
done < <(settings_defs)
# Zusatzaktionen, die inhaltlich zur Kategorie gehoeren
case "$cat" in
image) items+=("__test__" ">> Zugangsdaten jetzt pruefen (Registry + Downloadportal)") ;;
image) items+=("__wizard__" ">> Image beschaffen (Edition, Version, Bezugsweg)")
items+=("__test__" ">> Zugangsdaten jetzt pruefen (Registry + Downloadportal)") ;;
npm) items+=("__npm__" ">> Proxy Manager: Stand und Admin-Port anzeigen") ;;
backup) items+=("__jobs__" ">> Backup-Jobs verwalten") ;;
esac
@@ -3639,6 +3763,7 @@ gui_settings_category() {
sel="$(ui_menu "$title" "Eintrag waehlen und mit ENTER aendern:" "${items[@]}")" || return 0
case "$sel" in
back) return 0 ;;
__wizard__) gui_image_wizard || true; continue ;;
__test__) gui_image_test || true; continue ;;
__jobs__) gui_jobs_menu || true; continue ;;
__npm__) local f; f="$(mktemp)"