#!/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(__file__).parent / "page_counts.json" INTERVAL = 15 * 60 # 15 Minuten app = Flask(__name__) HTML = """ JonasSearch – Pages

JonasSearch

Indexed Pages – Live Statistics
–Pages
Loading…
Loading… Interval: – First measurement: – Measurements: – Last update: –
Growth / hour
–
Average over full history
Growth / day
–
Average over full history
Last 5 min
–
Latest interval change
Last hour
–
vs. measurement ~1 h ago
Last 24 h
–
vs. measurement ~24 h ago
Forecast next hour
–
Linear trend extrapolation
Indexed pages over time
X-axis shows the real measurement timestamps · dashed line = linear-regression trend & 24 h forecast
Change per 5 minutes
Computed from the raw measurements: each change is normalized to a 5-minute interval
""" 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 )