#!/usr/bin/env python3 """Start Spring Boot with database credentials from .env or the process environment.""" from __future__ import annotations import argparse import os from pathlib import Path import sys sys.path.insert(0, str(Path(__file__).resolve().parent)) from env_config import load_environment ROOT = Path(__file__).resolve().parents[1] def database_environment(root: Path, current: dict[str, str]) -> dict[str, str]: env = load_environment(root / ".env", current) required = ("DB_URL", "DB_USER", "DB_PASSWORD") if any(key not in env for key in required) or not env["DB_URL"] or not env["DB_USER"]: raise ValueError("DB_URL, DB_USER und DB_PASSWORD müssen konfiguriert sein.") return env def backend_jar(root: Path) -> Path: jars = sorted((root / "backend/target").glob("votian-backend-*.jar")) if len(jars) != 1 or not jars[0].is_file(): raise FileNotFoundError("Kein eindeutiges Backend-JAR. Zuerst ./build.sh ausführen.") return jars[0] def main() -> int: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--check-config", action="store_true", help="Nur Konfiguration prüfen; keine DB-Verbindung") parser.add_argument("--port", type=int, help="Port aus .env/Umgebung überschreiben (Standard 8080)") args = parser.parse_args() try: env = database_environment(ROOT, dict(os.environ)) port = args.port if args.port is not None else int(env.get("PORT", "8080")) if not 1 <= port <= 65535: raise ValueError("Ungültiger Port.") env["PORT"] = str(port) except (OSError, ValueError): print("Konfiguration nicht lesbar/ungültig. DB_URL, DB_USER und DB_PASSWORD in .env oder der Umgebung sowie PORT prüfen.", file=sys.stderr) return 2 if args.check_config: print("Datenbankkonfiguration aus .env/Umgebung geprüft. Keine Verbindung hergestellt; keine Daten verändert.") return 0 try: jar = backend_jar(ROOT) except FileNotFoundError: print("Kein eindeutiges Backend-JAR. Zuerst ./build.sh ausführen.", file=sys.stderr) return 2 os.chdir(ROOT / "backend") os.execvpe("java", ["java", "-jar", str(jar)], env) return 0 if __name__ == "__main__": raise SystemExit(main())