82 lines
2.8 KiB
Bash
Executable File
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"
|