diff --git a/web/app.py b/web/app.py new file mode 100644 index 0000000..68f9bae --- /dev/null +++ b/web/app.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python3 + +import subprocess +import json +import time +import threading +from datetime import datetime +from pathlib import Path + +from flask import Flask, jsonify, render_template_string + +DB_DATA = Path("page_counts.json") +INTERVAL = 15 * 60 # 15 Minuten + +app = Flask(__name__) + +HTML = """ + + + + + + JonasSearch – Pages + + + + + + + +
+

JonasSearch

+
Indexed Pages
+ +
+ – Pages +
+ +
+ +
+
+ + + + + +""" + + +def load_data(): + if not DB_DATA.exists(): + return [] + + try: + with DB_DATA.open("r", encoding="utf-8") as f: + return json.load(f) + except Exception: + return [] + + +def save_data(data): + tmp = DB_DATA.with_suffix(".tmp") + + with tmp.open("w", encoding="utf-8") as f: + json.dump(data, f, indent=2) + + tmp.replace(DB_DATA) + + +def get_page_count(): + command = [ + "sudo", + "-u", + "postgres", + "psql", + "-p", + "25432", + "-d", + "jonassearch", + "-t", + "-A", + "-c", + "SELECT COUNT(*) FROM pages;" + ] + + result = subprocess.run( + command, + capture_output=True, + text=True, + check=True + ) + + return int(result.stdout.strip()) + + +def collect(): + while True: + try: + count = get_page_count() + + entry = { + "timestamp": datetime.now().isoformat(), + "count": count + } + + data = load_data() + data.append(entry) + + save_data(data) + + print( + f"[{entry['timestamp']}] " + f"Pages: {count}" + ) + + except Exception as e: + print(f"Fehler beim Abrufen der Seitenzahl: {e}") + + time.sleep(INTERVAL) + + +@app.route("/") +def index(): + return render_template_string(HTML) + + +@app.route("/api/data") +def api_data(): + return jsonify({ + "values": load_data() + }) + + +if __name__ == "__main__": + # Collector im Hintergrund starten + thread = threading.Thread(target=collect, daemon=True) + thread.start() + + # Webserver + app.run( + host="0.0.0.0", + port=8081, + threaded=True + )