ESPO-13 legt Secrets unter /srv/espo/secrets ab (vorerst
gitea_package_token). Je Secret ein Parameter; leer oder woertlicher
Platzhalter laesst den Bestand. Erst Format und Funktion aller Werte
pruefen (Probeabruf der Registry), dann atomar schreiben - ein falscher
Token ersetzt keinen funktionierenden. Getestet: gesetzt, unveraendert,
falsches Format, abgelehnter Token.
ESPO-30 holt <extension> <version> aus der Package Registry
EspoCRM_Packages: SHA-256 gegen die Registry, Name und Version gegen das
Manifest, kein Rueckschritt, Snapshot srv-vor-update vor dem Download,
Installation per command.php als www-data, Neustart und Warten auf
healthy, Nachweis ueber --list. Danach liegt keine ZIP mehr auf der VM -
auch EspoCRMs eigene Archive in data/upload/extensions werden entfernt;
Update und Deinstallation brauchen sie nicht (Quelle 10.0.8).
ESPO-20 misst espo_extensions ("Name Version; ...", "none" wenn leer) und
beschreibt den Leseweg der Version wieder richtig. Ring 0 sperrt den
Extension-Upload in der Oberflaeche. README: Nummernkreise nachgezogen,
verrutschte Zeilen der Verzeichnistabelle zurueckgeholt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
4.1 KiB
Bash
Executable File
68 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-30"
|
|
|
|
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 kommt von EspoCRM selbst (command.php version). Sie steht seit v10 in data/state.php;
|
|
# die Vorgabewerte des Images wuerden nach einem gescheiterten Update die falsche Version melden.
|
|
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 -u www-data espocrm php /var/www/html/command.php version 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+' | tail -n 1)"
|
|
[ -n "$ESPO_VERSION" ] || fehler "EspoCRM-Version nicht ermittelbar"
|
|
|
|
# 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. Extensions: installierte Namen und Versionen, so wie EspoCRM sie fuehrt, alphabetisch - damit sich das
|
|
# Feld nur aendert, wenn sich wirklich etwas aendert. "none", wenn keine installiert ist; ein leeres Feld
|
|
# hiesse sonst "nicht gemessen". Das Custom Field fasst 300 Zeichen.
|
|
EXT_ROH="$(docker exec -u www-data espocrm php /var/www/html/command.php extension --list 2>/dev/null)"
|
|
printf '%s\n' "$EXT_ROH" | grep -qE '^(Extensions:|No extensions\.)$' || fehler "Extension-Liste nicht ermittelbar"
|
|
EXTENSIONS="$(printf '%s\n' "$EXT_ROH" \
|
|
| awk '/^ Name: /{n=substr($0,8)} /^ Version: /{v=substr($0,11)} /^ Installed: yes/{print n " " v}' \
|
|
| sort | paste -sd ';' | sed 's/;/; /g')"
|
|
[ -n "$EXTENSIONS" ] || EXTENSIONS="none"
|
|
[ "${#EXTENSIONS}" -le 300 ] || fehler "Extension-Liste laenger als 300 Zeichen - passt nicht in espo_extensions"
|
|
|
|
# 5. 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"
|
|
printf '%s' "$EXTENSIONS" > "$ZIEL/espo_extensions"
|
|
|
|
# 6. 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 "espo_extensions: $EXTENSIONS"
|
|
echo "ESPO20_ERGEBNIS: OK"
|