espo-deploy/rmm-tasks/ESPO-20-Inventar.sh
Gordon Zimm 86bc5d9204 Version aus den Vorgabewerten des Images lesen
Gemessen: Auf einer frisch installierten Instanz steht 'version' weder in
data/config.php noch in data/config-internal.php - EspoCRM schreibt nur, was
vom Vorgabewert abweicht. Beide Dateien luden einwandfrei, der Schluessel fehlt
schlicht.

Gelesen werden jetzt alle drei Dateien in der Reihenfolge, in der EspoCRM sie
selbst zusammenfuehrt: defaults, config, config-internal - der spaetere Wert
gewinnt. Nach einem Upgrade sticht damit data/config.php den Vorgabewert.

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

64 lines
4.0 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 'foreach (["/var/www/html/data/config-internal.php","/var/www/html/data/config.php"] as $f) { $a = @include $f; if (is_array($a) && !empty($a["version"])) { echo $a["version"]; exit; } }' 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"