{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import field, select_field, textarea_field, checkbox, pill, search_box, modal, empty_state, alert %} {# Neustart-Bedienelement. Ein einziger möglicher Weg: ein Knopf, der ihn benennt. Mehrere: ein Knopf für den bevorzugten Weg (PoE, weil er auch bei hängendem Betriebssystem wirkt) und daneben die Auswahl. Kein Weg: gar nichts -- ein Knopf, der verlässlich nichts bewirkt, ist schlimmer als kein Knopf. #} {% macro restart_control(device, methods, compact=False) %} {% if methods %} {% set first = methods[0] %}
{% if methods | length > 1 %} {% for other in methods[1:] %}
{% endfor %} {% endif %} {% endif %} {% endmacro %} {% macro device_form(device=None, scope='neu') %}
{{ field('name', 'Name', value=device.name if device else '', required=True) }} {{ field('mac', 'MAC-Adresse', value=device.mac if device else '', required=True, placeholder='aa:bb:cc:dd:ee:ff', extra_class='') }} {{ field('ip', 'IP-Adresse', value=device.ip if device else '', required=True, placeholder='192.168.1.50') }} {{ field('port', 'Port am Switch', value=device.port if device else '', placeholder='1 oder 1/1/3', hint_text='Pflicht, sobald ein Switch zugeordnet ist.') }} {% if current_user.has('credentials.create') %} {% endif %} {{ field('ssh_port', 'SSH-Port des Geräts', value=device.ssh_port if device else 22, type='number') }} {{ field('location', 'Standort', value=device.location if device else '') }} {{ textarea_field('notes', 'Notizen', value=device.notes if device else '', rows=2, extra_class='field--full') }}
{{ checkbox('is_active', 'Gerät wird überwacht', checked=device.is_active if device else True) }} {{ checkbox('auto_restart', 'Automatischer PoE-Neustart bei Ausfall', checked=device.auto_restart if device else True, hint_text='Greift nur mit gültiger Lizenz und zugeordnetem Switch-Port.') }}
{% endmacro %} {% block page_title %}Clients{% endblock %} {% block page_sub %} {{ devices | length }} Geräte · {{ counts.online }} erreichbar, {{ counts.offline }} nicht erreichbar {% endblock %} {% block topbar_extra %} {{ search_box('devices-table', 'Name, IP, MAC, Switch ...', count_id='devices-visible') }} {% if current_user.has('devices.create') %} {% endif %} {% endblock %} {% block content %}
{{ devices | length }} sichtbar {{ icon('power', size=15) }} Neustarts
{% for device in devices %} {% endfor %}
Name Zustand IP MAC Zugangsdaten Switch / Port Letzte Prüfung Host-Schlüssel Aktion
{{ device.name }} {% if not device.is_active %}{{ pill('deaktiviert', '') }}{% endif %} {% if not device.auto_restart %} ! {% endif %} {% if device.location %}
{{ device.location }}
{% endif %}
{% if not device.is_active %}{{ pill('aus', '') }} {% elif device.state == 'online' %}{{ pill('online', 'online') }} {% elif device.state == 'restarting' %}{{ pill('startet neu', 'warning') }} {% elif device.state == 'offline' %}{{ pill('offline', 'offline') }} {% else %}{{ pill('unbekannt', 'warning') }}{% endif %} {% if device.fail_count %}({{ device.fail_count }}×){% endif %} {{ device.ip }} {{ device.mac }} {% if device.credential_name %} {{ device.credential_name }}
{{ category_labels.get(device.credential_category, device.credential_category) }}
{% else %}keine{% endif %}
{% if device.switch_hostname %} {{ device.switch_hostname }} / {{ device.port }} {% else %}nicht zugeordnet{% endif %} {% if device.last_check_at %} {{ device.last_check_at | dt }} {% else %}nie{% endif %} {% if device.credential_category == 'windows' %} nicht nötig {% elif device.host_key_known %}{{ pill('freigegeben', 'online') }} {% else %} {{ pill('offen', 'warning') }} {% endif %} {% if current_user.has('devices.execute') %} {{ restart_control(device, restart_methods.get(device.id, []), compact=True) }} {% endif %} {% if current_user.has('devices.edit') %} {% endif %} {% if current_user.has('devices.delete') %}
{% endif %}
{% if not devices %} {{ empty_state('Keine Geräte', 'Legen Sie das erste überwachte Gerät an.', 'cpu') }} {% endif %}
{{ alert('Ein PoE-Neustart setzt Switch und Port voraus, ein Neustart über SSH oder RPC setzt passende Zugangsdaten voraus. Ist keine Methode möglich, erscheint der Knopf nicht -- damit kein Neustart vorgetäuscht wird, der nichts bewirkt.', 'info') }} {% endblock %} {% block dialogs %} {% if current_user.has('devices.create') %} {% call modal('device-new', 'Gerät anlegen', 'MAC und IP sind Pflicht', 'wide') %}
{% endcall %} {% endif %} {% if current_user.has('devices.edit') %} {% for device in devices %} {% call modal('device-edit-' ~ device.id, device.name, device.mac, 'wide') %}
{% endcall %} {% endfor %} {% endif %} {% endblock %}