espo-deploy/rmm-tasks/ESPO-20-Inventar.sh
Gordon Zimm f1701675ef Version tatsaechlich aus den Vorgabewerten lesen (Nachtrag zu 86bc5d9)
Der vorige Commit hat nur den Kommentar geaendert, der Ersetzungsausdruck griff
nicht. Jetzt lesen alle drei Skripte defaults, config und config-internal in
dieser Reihenfolge; der spaetere Wert gewinnt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-24 16:21:55 +02:00

64 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# ESPO-20-Inventar - misst die Ist-Werte der Instanz und legt sie einzeln unter /run/espo-inventar ab.
# Aufruf: ohne Argumente.
# Die Task-Zeilen lesen die Dateien danach einzeln mit cat; erst deren Ausgabe fuellt ueber %output%
# das jeweilige Custom Field. Eine Messung fuer alle Werte hat drei Gruende: Sie stammen aus demselben
# Augenblick, die teuren Aufrufe passieren einmal, und ein cat kann keine Fehlermeldung in ein Feld tragen.
#
# Laesst sich ein Wert nicht ermitteln, bricht dieser Schritt ab - dann laufen die Folgezeilen nicht und
# kein Feld wird ueberschrieben. Eine stehende Instanz darf die Werte nicht leeren, sonst sieht eine
# Stoerung aus wie eine leere Instanz.
set -u
ZIEL=/run/espo-inventar
echo "ESPO-20-Inventar, Skriptstand 2026-09-24"
fehler() { echo "FEHLER: $*"; echo "ESPO20_ERGEBNIS: FEHLER"; exit 1; }
# 1. Vorbedingungen.
[ "$(id -u)" -eq 0 ] || fehler "nicht als root gestartet"
command -v docker >/dev/null && docker info >/dev/null 2>&1 || fehler "Docker laeuft nicht"
# 2. EspoCRM: Image, Digest, Version.
# Die Version steht auf einer frisch installierten Instanz NICHT in data/config.php, sondern nur in den
# Vorgabewerten des Images (gemessen am 24.09.2026). Deshalb werden alle drei Dateien in der Reihenfolge
# gelesen, in der EspoCRM sie selbst zusammenfuehrt - der spaetere Wert gewinnt. Nach einem Upgrade steht
# die Version in data/config.php und sticht damit den Vorgabewert.
ESPO_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm 2>/dev/null)"
[ -n "$ESPO_IMAGE" ] || fehler "Container 'espocrm' nicht gefunden - laeuft die Instanz?"
ESPO_DIGEST="$(docker image inspect --format '{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}{{.Id}}{{end}}' "$ESPO_IMAGE" 2>/dev/null)"
[ -n "$ESPO_DIGEST" ] || fehler "Digest des EspoCRM-Images nicht ermittelbar"
ESPO_VERSION="$(docker exec espocrm php -r '$v=""; foreach (["/var/www/html/application/Espo/Resources/defaults/config.php","/var/www/html/data/config.php","/var/www/html/data/config-internal.php"] as $f) { $a=@include $f; if (is_array($a) && !empty($a["version"])) { $v=$a["version"]; } } echo $v;' 2>/dev/null)"
[ -n "$ESPO_VERSION" ] || ESPO_VERSION="$(grep -hoP "['\"]version['\"]\s*=>\s*['\"]\K[^'\"]+" /srv/espo/data/config-internal.php /srv/espo/data/config.php 2>/dev/null | head -1)"
if [ -z "$ESPO_VERSION" ]; then
echo "--- Diagnose: vorhandene Konfigurationsdateien"
ls -l /srv/espo/data/config*.php 2>&1
echo "--- Diagnose: erste Schluessel je Datei"
docker exec espocrm php -r 'foreach (["/var/www/html/data/config-internal.php","/var/www/html/data/config.php"] as $f) { $a=@include $f; echo $f, ": ", is_array($a) ? implode(",", array_slice(array_keys($a),0,15)) : "kein Array", "\n"; }' 2>&1 | head -5
fehler "EspoCRM-Version nicht ermittelbar"
fi
# 3. MariaDB: Image, Digest, Version. Das Passwort wird im Container aus der Secret-Datei gelesen,
# damit es weder im Skript noch in der Prozessliste der VM auftaucht.
DB_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm-db 2>/dev/null)"
[ -n "$DB_IMAGE" ] || fehler "Container 'espocrm-db' nicht gefunden"
DB_DIGEST="$(docker image inspect --format '{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}{{.Id}}{{end}}' "$DB_IMAGE" 2>/dev/null)"
[ -n "$DB_DIGEST" ] || fehler "Digest des MariaDB-Images nicht ermittelbar"
DB_VERSION="$(docker exec espocrm-db sh -c 'mariadb -u root -p"$(cat /run/secrets/db_root_password)" -N -B -e "select version()"' 2>/dev/null | tr -d '\r')"
[ -n "$DB_VERSION" ] || fehler "MariaDB-Version nicht ermittelbar"
# 4. Ablegen - ohne abschliessenden Zeilenumbruch, damit cat genau den Wert liefert.
install -d -m 0755 "$ZIEL"
printf '%s' "$ESPO_VERSION" > "$ZIEL/espo_version"
printf '%s' "$ESPO_DIGEST" > "$ZIEL/espo_image_digest"
printf '%s' "$DB_VERSION" > "$ZIEL/espo_db_version"
printf '%s' "$DB_DIGEST" > "$ZIEL/espo_db_image_digest"
# 5. Zur Kontrolle im Protokoll - die Custom Fields fuellen die Folgezeilen des Tasks.
echo "espo_version: $ESPO_VERSION"
echo "espo_image_digest: $ESPO_DIGEST"
echo "espo_db_version: $DB_VERSION"
echo "espo_db_image_digest: $DB_DIGEST"
echo "ESPO20_ERGEBNIS: OK"