113 lines
3.2 KiB
Python
Executable File
113 lines
3.2 KiB
Python
Executable File
#!/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 </body> Tag ein
|
|
data_script = f"""
|
|
<script>
|
|
// Eingebettete Wetterdaten - generiert am {datetime.now().isoformat()}
|
|
window.__WEATHER_DATA__ = {json.dumps(weather_data)};
|
|
</script>
|
|
</body>"""
|
|
|
|
html_content = html_content.replace('</body>', 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()
|