diff --git a/README.md b/README.md index 1bafeb6..44970b5 100644 --- a/README.md +++ b/README.md @@ -818,6 +818,16 @@ abgetippt werden – dort erscheint eine Auswahlliste. ### 8.6 Image holen – drei Wege +> **In der Oberfläche geht das als Assistent:** **image → „Image beschaffen"** +> führt in einem Durchgang durch Edition, Version und Bezugsweg, setzt danach +> `CMK_EDITION`, `CMK_VERSION` **und** `CMK_IMAGE` und fragt **nicht** erneut +> nach Zugangsdaten, die schon in der `.env` stehen. Nur wenn sie für den +> gewählten Weg fehlen, werden sie erfragt – auf Wunsch gleich gespeichert. +> Derselbe Assistent liegt auch unter **Einstellungen → Checkmk-Image und +> Zugangsdaten → „>> Image beschaffen"**. + +Auf der Kommandozeile bleiben die Einzelschritte: + **a) Aus einer Registry (empfohlen)** Für die Enterprise-Edition entspricht das genau diesen beiden Schritten – das @@ -898,7 +908,17 @@ localhost/checkmk/check-mk-enterprise:2.3.0p9 (aus Tarball geladen Deshalb hält `CMK_IMAGE` fest, was **wirklich vorhanden ist**, und wird von `image pull`, `image download`, `image load` und `image use` gesetzt – von Hand -muss man dort normalerweise nichts eintragen. +muss man dort normalerweise nichts eintragen. In der Oberfläche sind die drei +Werte deshalb gar nicht einzeln editierbar: sie werden vom Assistenten +gemeinsam gesetzt, damit sie nicht auseinanderlaufen. Auf der Kommandozeile +bleiben sie einzeln setzbar (`config set …`). + +Auf der Kommandozeile übernehmen `image pull` und `image download` mit +`--remember` die Edition und Version gleich mit in die `.env`: + +```bash +./scripts/cmk-manage.sh image pull --edition enterprise --version 2.3.0p9 --remember +``` > **Daraus folgt:** Edition oder Version zu ändern, startet **keine** andere > Ausgabe. Erst `image pull` (bzw. `download`/`load`) schreibt das Ergebnis diff --git a/README_en.md b/README_en.md index ee6c0ed..5d5e06e 100644 --- a/README_en.md +++ b/README_en.md @@ -824,6 +824,15 @@ selection list appears instead. ### 8.6 Fetching the image – three ways +> **In the interface this is a wizard:** **image → "Image beschaffen"** walks +> through edition, version and source in one go, then sets `CMK_EDITION`, +> `CMK_VERSION` **and** `CMK_IMAGE`, and does **not** ask again for credentials +> already stored in `.env`. It only asks if they are missing for the chosen +> route – and offers to save them. The same wizard is also available under +> **Einstellungen → Checkmk-Image und Zugangsdaten → ">> Image beschaffen"**. + +On the command line the individual steps remain: + **a) From a registry (recommended)** For the Enterprise edition this is exactly the following two steps – the script @@ -904,7 +913,17 @@ localhost/checkmk/check-mk-enterprise:2.3.0p9 (loaded from a tarba So `CMK_IMAGE` records what is **actually there**, and it is written by `image pull`, `image download`, `image load` and `image use` – you normally -never have to type anything there by hand. +never have to type anything there by hand. In the interface the three values +are therefore not editable individually: the wizard sets them together so they +cannot drift apart. On the command line they remain individually settable +(`config set …`). + +On the command line, `image pull` and `image download` take `--remember` to +store the edition and version in `.env` as well: + +```bash +./scripts/cmk-manage.sh image pull --edition enterprise --version 2.3.0p9 --remember +``` > **Consequence:** changing the edition or version does **not** start a > different release. Only `image pull` (or `download`/`load`) writes the result diff --git a/scripts/cmk-manage.sh b/scripts/cmk-manage.sh index 6b269c8..9f3c5da 100755 --- a/scripts/cmk-manage.sh +++ b/scripts/cmk-manage.sh @@ -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:-}" + + 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:-} + +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:-} + +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:-}")$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)"