{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import pill, empty_state, alert %} {% block page_title %}Aenderungsprotokoll{% endblock %} {% block page_sub %}{{ total }} Eintraege · Hash-Kette {{ 'unversehrt' if chain.ok else 'gebrochen' }}{% endblock %} {% block topbar_extra %} {% if current_user.has('logs_audit.export') %} {{ icon('download', size=15) }} CSV {% endif %} {% endblock %} {% block content %} {% if not chain.ok %} {{ alert(chain.reason ~ ' Erster Bruch bei Eintrag ' ~ chain.broken_at ~ '.', 'danger', 'Das Protokoll wurde veraendert') }} {% else %} {{ alert('Jeder Eintrag bindet den Hash seines Vorgaengers ein. Eine nachtraeglich entfernte oder geaenderte Zeile faellt bei der Pruefung auf -- ' ~ chain.checked ~ ' Zeilen geprueft.', 'success') }} {% endif %}
{{ icon('search', size=15) }} Zuruecksetzen
{% for row in rows %} {% endfor %}
Zeit Benutzer Aktion Ziel Detail Stufe Herkunft
{{ row.ts | dt }} {{ row.actor }} {{ row.action }} {{ row.target }} {{ row.detail }} {% if row.severity == 'critical' %}{{ pill('kritisch', 'danger') }} {% elif row.severity == 'warning' %}{{ pill('Warnung', 'warning') }} {% elif row.severity == 'notice' %}{{ pill('Hinweis', 'info') }} {% else %}{{ pill('Info', '') }}{% endif %} {{ row.ip or '–' | safe }}
{% if not rows %}{{ empty_state('Keine Eintraege', 'Zu diesem Filter gibt es nichts.', 'history') }}{% endif %}
{% endblock %}