Files
J621/backend/apps/core/views.py
T
JakeBreath 38e64140ed Serve /health and keep 404 scanner noise out of the log file
Something on the network polls /health (and /v1/models) every 30 seconds;
the former now answers 200 with a database check instead of a 404, and
django.request is limited to ERROR in the logging config so scanner 404s
stop filling backend/logs/j621.log. Real server errors still log, and the
dev server keeps printing every request to its console.
2026-09-17 21:50:20 -05:00

89 lines
2.9 KiB
Python

import time
from django.conf import settings
from django.db import connection
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from . import stats
from .system_info import get_os_info
def _worker_counts():
"""Active/queued background jobs (downloads and e621 match scans)."""
from apps.library.models import DownloadTask, MatchTask
active = DownloadTask.objects.filter(
status=DownloadTask.STATUS_DOWNLOADING
).count() + MatchTask.objects.filter(status=MatchTask.STATUS_RUNNING).count()
queued = DownloadTask.objects.filter(
status=DownloadTask.STATUS_PENDING
).count() + MatchTask.objects.filter(status=MatchTask.STATUS_PENDING).count()
return {"active": active, "queued": queued}
class StatusView(APIView):
"""Runtime status used by the SPA shell (storage line, status pill, footer)."""
permission_classes = [AllowAny]
def get(self, request):
started = getattr(request, "start_time", time.perf_counter())
payload = {
"app": "J621",
"env": settings.APP_ENV,
"git_hash": settings.GIT_COMMIT_HASH,
"version": settings.APP_VERSION,
"os": get_os_info(),
"watched_folder": settings.WATCHED_FOLDER,
"e621_time_ms": None, # e621 latency is measured client-side
"workers": _worker_counts(),
}
payload["server_time_ms"] = round((time.perf_counter() - started) * 1000, 1)
return Response(payload)
class StatsView(APIView):
"""Staff-only runtime statistics for the dashboard."""
permission_classes = [IsAuthenticated]
def get(self, request):
user = request.user
if not (
user.is_staff or user.is_superuser or user.role == user.ROLE_STAFF
):
raise PermissionDenied("Staff only.")
from apps.library.tools import storage_info
return Response(
{
"system": stats.system_stats(),
"gpus": stats.gpu_stats(),
"disk": storage_info(),
"jobs": stats.jobs_stats(),
"log": stats.log_tail(),
}
)
class HealthView(APIView):
"""Unauthenticated liveness probe for uptime monitors (hits /health)."""
permission_classes = [AllowAny]
authentication_classes = []
def get(self, request):
database = True
try:
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
except Exception: # noqa: BLE001 - report the failure, do not crash
database = False
return Response(
{"status": "ok" if database else "degraded", "database": database},
status=200 if database else 503,
)