#!/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"