#!/Users/rxf/Projekte/wetterstation/.venv/bin/python """ Generiert statische HTML-Dateien mit aktuellen Wetterdaten und lädt sie auf den Server hoch """ import json import os import shutil import subprocess import sys from pathlib import Path import requests from datetime import datetime # Konfiguration API_URL = "http://localhost:8000" FRONTEND_DIR = Path(__file__).parent / "frontend" DIST_DIR = FRONTEND_DIR / "dist" REMOTE_SERVER = "ssh-310927-rxf@sternwarte-welzheim.de" # SSH-Zugang zum Webserver REMOTE_PATH = "webroot/wetter/wetterstation" # Pfad auf dem Webserver def fetch_weather_data(): """Holt aktuelle Wetterdaten von der API""" try: response = requests.get(f"{API_URL}/weather/history?hours=24", timeout=10) response.raise_for_status() return response.json() except Exception as e: print(f"Fehler beim Laden der Daten: {e}") sys.exit(1) def build_frontend(): """Baut das Frontend""" print("Baue Frontend...") try: subprocess.run( ["npm", "run", "build"], cwd=FRONTEND_DIR, check=True, capture_output=True ) print("✓ Frontend gebaut") except subprocess.CalledProcessError as e: print(f"Fehler beim Build: {e.stderr.decode()}") sys.exit(1) def inject_data_into_html(weather_data): """Fügt Wetterdaten in die index.html ein""" index_file = DIST_DIR / "index.html" if not index_file.exists(): print("index.html nicht gefunden!") sys.exit(1) with open(index_file, 'r', encoding='utf-8') as f: html_content = f.read() # Füge Daten als inline Script vor dem schließenden Tag ein data_script = f""" """ html_content = html_content.replace('', data_script) with open(index_file, 'w', encoding='utf-8') as f: f.write(html_content) print(f"✓ Daten in HTML eingebettet ({len(weather_data)} Datensätze)") def upload_to_server(): """Lädt die Dateien per rsync auf den Server""" print(f"Lade Dateien auf {REMOTE_SERVER}...") try: subprocess.run([ "rsync", "-avz", "--delete", f"{DIST_DIR}/", f"{REMOTE_SERVER}:{REMOTE_PATH}/" ], check=True) print(f"✓ Upload erfolgreich") except subprocess.CalledProcessError as e: print(f"Fehler beim Upload: {e}") sys.exit(1) def main(): print(f"=== Wetterstation Static Generator ===") print(f"Start: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") # 1. Daten von API holen print("Lade Wetterdaten...") weather_data = fetch_weather_data() print(f"✓ {len(weather_data)} Datensätze geladen\n") # 2. Frontend bauen build_frontend() print() # 3. Daten in HTML einbetten inject_data_into_html(weather_data) print() # 4. Auf Server hochladen upload_to_server() print(f"\n✓ Fertig: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if __name__ == "__main__": main()