From fcf75892a49fe35c36cad10c6597c6192f0d04b8 Mon Sep 17 00:00:00 2001
From: Daniel Schadt
Date: Wed, 26 Mar 2025 19:39:55 +0100
Subject: add system stats to admin page
---
fietsboek/scripts/fietscron.py | 4 +++-
fietsboek/templates/admin_overview.jinja2 | 27 +++++++++++++++++++++-
fietsboek/views/admin.py | 38 +++++++++++++++++++++++++++++++
3 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/fietsboek/scripts/fietscron.py b/fietsboek/scripts/fietscron.py
index 7687e12..923885f 100644
--- a/fietsboek/scripts/fietscron.py
+++ b/fietsboek/scripts/fietscron.py
@@ -53,10 +53,12 @@ def cli(config):
remove_old_tokens(engine)
rebuild_cache(engine, data_manager)
+ redis = mod_redis.from_url(config.redis_url)
if config.hittekaart_autogenerate:
- redis = mod_redis.from_url(config.redis_url)
run_hittekaart(engine, data_manager, redis, config)
+ redis.set("last-cronjob", datetime.datetime.now(datetime.UTC).timestamp())
+
def remove_old_uploads(engine: Engine):
"""Removes old uploads from the database."""
diff --git a/fietsboek/templates/admin_overview.jinja2 b/fietsboek/templates/admin_overview.jinja2
index 0e1bac8..dedd57e 100644
--- a/fietsboek/templates/admin_overview.jinja2
+++ b/fietsboek/templates/admin_overview.jinja2
@@ -14,12 +14,37 @@
- … {{ (total_size / 1024 / 1024) | round(2) }} MiB bytes of data
+ … {{ (total_size / 1024 / 1024) | round(2) }} MiB of data
+
+System information
+
+
+
+ Fietsboek version |
+ {{ versions["fietsboek"] }} |
+
+
+ Python version |
+ {{ versions["python"] }} |
+
+
+ Kernel version |
+ {{ versions["linux"] }} |
+
+
+ Distribution |
+ {{ versions["distro"] }} |
+
+
+ Last cronjob {% if not cron_good %}{% endif %} |
+ {{ last_cronjob }} |
+
+
{% endblock %}
{% block latescripts %}
diff --git a/fietsboek/views/admin.py b/fietsboek/views/admin.py
index 78eec12..ca002c8 100644
--- a/fietsboek/views/admin.py
+++ b/fietsboek/views/admin.py
@@ -1,6 +1,9 @@
"""Admin views."""
+import datetime
+import platform
import stat
+import subprocess
from dataclasses import dataclass
from pathlib import Path
@@ -13,6 +16,9 @@ from sqlalchemy import func, select
from .. import models, util
+GOOD_CRON_THRESHOLD = datetime.timedelta(hours=1)
+
+
def _safe_size(path: Path) -> int:
try:
res = path.stat()
@@ -51,6 +57,14 @@ def _get_size_breakdown(data_manager):
return breakdown
+def _get_fietsboek_version():
+ modules = subprocess.check_output(["pip", "list"]).split(b"\n")
+ for module in modules:
+ if module.startswith(b"fietsboek "):
+ return module.split()[1].decode("ascii")
+ return ""
+
+
@view_config(
route_name="admin",
renderer="fietsboek:templates/admin_overview.jinja2",
@@ -70,11 +84,35 @@ def admin(request: Request):
size_total = request.data_manager.size()
size_breakdown = _get_size_breakdown(request.data_manager)
+ try:
+ distro = platform.freedesktop_os_release()["PRETTY_NAME"]
+ except OSError:
+ distro = None
+
+ try:
+ last_cronjob_timestamp = float(request.redis.get("last-cronjob"))
+ except (TypeError, ValueError):
+ last_cronjob = None
+ cron_good = False
+ else:
+ last_cronjob = datetime.datetime.fromtimestamp(last_cronjob_timestamp, datetime.UTC)
+ cron_good = (datetime.datetime.now(datetime.UTC) - last_cronjob) < GOOD_CRON_THRESHOLD
+
+ versions = {
+ "fietsboek": _get_fietsboek_version(),
+ "python": platform.python_version(),
+ "linux": platform.platform(),
+ "distro": distro,
+ }
+
return {
"user_count": user_count,
"track_count": track_count,
"total_size": size_total,
"size_breakdown": size_breakdown,
+ "versions": versions,
+ "last_cronjob": last_cronjob,
+ "cron_good": cron_good,
}
--
cgit v1.2.3