{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import pill, empty_state, alert, search_box %} {% block page_title %}Wartung{% endblock %} {% block page_sub %} {{ devices | length }} Geraete mit Zugangsdaten der Kategorie „Linux-Client“ oder „Windows-Client“ {% endblock %} {% block topbar_extra %}{{ search_box('maintenance-table', 'Geraet suchen ...') }}{% endblock %} {% block content %} {% if devices | rejectattr('host_key_ready') | list %} {{ alert('Fuer mindestens ein Geraet ist der SSH-Host-Schluessel noch nicht freigegeben. Die Wartung bricht dort mit "Schluessel unbekannt" ab. Die Freigabe erfolgt auf der Detailseite des Geraets -- erst auslesen, Fingerprint pruefen, dann freigeben.', 'warning', 'Host-Schluessel offen') }} {% endif %} {% if windows_tool_missing %} {# Die Meldung im Auftrag nennt das fehlende Paket -- ohne diesen Knopf waere sie eine Sackgasse. #}
{{ icon('alert', size=18) }}
Windows-Neustart nicht moeglich Auf diesem Server fehlt das Paket {{ windows_package }}. Es bringt net mit, ueber das der Neustart eines Windows-Geraetes laeuft.
{% endif %} {{ alert('Welche Geraete hier erscheinen und was mit ihnen moeglich ist, entscheidet die Kategorie ihrer Zugangsdaten. Linux-Clients werden ueber SSH aktualisiert und neu gestartet. Windows-Clients werden nur neu gestartet, und zwar ueber RPC (wie "shutdown /m") -- sie brauchen dafuer weder SSH noch einen Host-Schluessel, sondern die offene Datei- und Druckerfreigabe. Der PoE-Neustart ist davon getrennt: er schaltet den Switch-Port.', 'info') }}
{% if current_user.has('maintenance.execute') %} {% endif %}
{% for device in devices %} {% endfor %}
Geraet IP Zustand Zugangsdaten Host-Schluessel
{{ device.name }} {{ device.ip }} {% if device.state == 'online' %}{{ pill('online', 'online') }} {% elif device.state == 'offline' %}{{ pill('offline', 'offline') }} {% else %}{{ pill('unbekannt', 'warning') }}{% endif %} {{ device.credential_name }}
{{ category_labels.get(device.category, device.category) }}
{% if not device.ssh_managed %} nicht noetig {% elif device.host_key_ready %}{{ pill('freigegeben', 'online') }} {% else %} {{ pill('offen', 'danger') }} {% endif %} {% if terminal_enabled and device.ssh_managed and current_user.has('maintenance.execute') %} {{ icon('terminal', size=14) }} Konsole {% endif %}
{% if not devices %} {{ empty_state('Keine passenden Geraete', 'Setzen Sie bei den Zugangsdaten die Kategorie "Linux-Client" und ordnen Sie sie einem Geraet zu.', 'wrench') }} {% endif %}
{# Kein data-refresh-url: die Schleife in app.js schreibt die Antwort in innerHTML. Hier zeigte sie auf die Seite selbst -- die komplette Wartungsseite landete damit in dieser Karte, mitsamt Seitenleiste und Suchfeld. Aktualisiert wird ueber die Abfrage unten, die bei laufenden Auftraegen die ganze Seite neu laedt. #}
{{ icon('clock', size=17) }} Auftraege
Zustand liegt in der Datenbank -- ein Dienst-Neustart verliert ihn nicht mehr
{% if jobs %}
{% for job in jobs %} {% endfor %}
GestartetGeraetArtZustandFortschrittMeldung
{{ job.created_at | dt }} {{ job.subject }} {{ 'Aktualisierung' if job.kind.endswith('update') else 'Neustart' }} {% if job.state == 'succeeded' %}{{ pill('erfolgreich', 'online') }} {% elif job.state == 'failed' %}{{ pill('fehlgeschlagen', 'danger') }} {% elif job.state == 'running' %}{{ pill('laeuft', 'info') }} {% elif job.state == 'unknown' %}{{ pill('unklar', 'warning') }} {% else %}{{ pill('wartet', '') }}{% endif %}
{{ job.message }}
{% else %} {{ empty_state('Keine Auftraege', 'Es wurde noch keine Wartung gestartet.', 'clock') }} {% endif %}
{% endblock %} {% block scripts %} {% endblock %}