Files
2026-09-18 22:03:31 +02:00

82 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Preflight vor der Installation: aendert nichts am System, meldet alle
# Konflikte gesammelt und beendet sich mit 1, sobald einer vorliegt.
# preflight.sh [--upgrade] [--skip-db] [--modules dms,core] [ROOT]
# --upgrade: bestehende Installation wird aktualisiert (Ports/Units duerfen
# belegt sein, der Migrationsstand muss zu diesem Stand passen).
# Env: NEXARCH_PREFLIGHT_UNIT_DIR (Default /etc/systemd/system),
# NEXARCH_DMS_APP_TENANT_DSN (DB-Pruefung), PGOPTIONS wird an psql durchgereicht.
set -uo pipefail
upgrade=0; skip_db=0; modules=dms; root=.
while [ $# -gt 0 ]; do
case "$1" in
--upgrade) upgrade=1 ;;
--skip-db) skip_db=1 ;;
--modules) shift; modules="${1:-}" ;;
-*) echo "unbekannte option: $1" >&2; exit 2 ;;
*) root="$1" ;;
esac
shift
done
unit_dir="${NEXARCH_PREFLIGHT_UNIT_DIR:-/etc/systemd/system}"
registry="$root/deploy/ports.tsv"
[ -f "$registry" ] || { echo "register fehlt: $registry" >&2; exit 2; }
fail=0
err() { echo "FEHLER $*" >&2; fail=1; }
port_in_use() {
if command -v ss >/dev/null 2>&1; then
[ -n "$(ss -H -ltn "sport = :$1" 2>/dev/null)" ]
else
(exec 3<>"/dev/tcp/127.0.0.1/$1") 2>/dev/null
fi
}
IFS=, read -r -a mods <<< "$modules"
for mod in "${mods[@]}"; do
if [ "$mod" = core ]; then pattern="$root/cmd/*/main.go"; else pattern="$root/$mod/cmd/*/main.go"; fi
if [ "$upgrade" -eq 0 ]; then
for f in $pattern; do
[ -f "$f" ] || continue
for port in $(grep -oE '":[0-9]{2,5}"' "$f" | tr -d '":' | sort -u); do
if port_in_use "$port"; then
err "port $port ($mod, ${f#"$root"/}) ist belegt"
fi
done
done
for unit in "nexarch-$mod.service" "nexarch-$mod-worker.service"; do
[ -e "$unit_dir/$unit" ] && err "systemd-unit $unit existiert bereits in $unit_dir (--upgrade fuer Aktualisierung)"
done
fi
done
if [ "$skip_db" -eq 0 ]; then
dsn="${NEXARCH_DMS_APP_TENANT_DSN:-}"
if [ -z "$dsn" ]; then
err "NEXARCH_DMS_APP_TENANT_DSN nicht gesetzt (oder --skip-db)"
elif ! command -v psql >/dev/null 2>&1; then
err "psql nicht gefunden, datenbank kann nicht geprueft werden"
elif ! psql "$dsn" -Atqc 'SELECT 1' >/dev/null 2>&1; then
err "datenbank nicht erreichbar"
else
table=dms_schema_migrations
exists="$(psql "$dsn" -Atqc "SELECT to_regclass(current_schema() || '.$table') IS NOT NULL")"
if [ "$exists" = t ]; then
versions="$(psql "$dsn" -Atqc "SELECT version FROM $table ORDER BY version")"
if [ "$upgrade" -eq 0 ] && [ -n "$versions" ]; then
err "$table enthaelt bereits Migrationen: bestehende Installation (--upgrade verwenden)"
fi
for v in $versions; do
[ -f "$root/dms/migrations/tenant/$v.up.sql" ] || err "$table: version $v ist diesem Stand unbekannt (fremder oder neuerer Migrationsstand)"
done
fi
fi
fi
[ "$fail" -eq 0 ] && echo "preflight ok"
exit "$fail"