{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import field, checkbox, alert, pill, empty_state %} {% block page_title %}Lizenz{% endblock %} {% block page_sub %} {% if state and state.valid and state.activated %}aktiv {% elif state and state.valid %}gueltig, noch nicht aktiviert {% elif state and state.present %}ungueltig {% else %}keine Lizenz installiert{% endif %} {% endblock %} {% block content %} {% if state and state.error %}{{ alert(state.error, 'danger') }}{% endif %} {% for warning in (state.warnings if state else []) %}{{ alert(warning, 'warning') }}{% endfor %}
{% if state and state.valid and state.status %}
{{ icon('key', size=17) }} Installierte Lizenz {% if state.activated %}{{ pill('aktiviert', 'online') }} {% else %}{{ pill('nicht aktiviert', 'warning') }}{% endif %} {% if state.issuer_pinned %}{{ pill('Aussteller gepinnt', 'info') }}{% endif %}
{{ type_labels.get(state.status.type, state.status.type) }} · {{ role_labels.get(state.role, state.role) }}

Kunde
  {{ state.customer_name or '–' | safe }}
Lizenz-ID
  {{ state.status.license_id }}
Revision
  {{ state.status.seq }}
Ausgestellt
  {{ state.status.issued_at | dt }}
Laeuft ab
  {% if state.status.lifetime %}{{ pill('unbefristet', 'online') }} {% else %} {{ state.status.expires_at | dt }} {% if state.status.expired %} {{ pill('abgelaufen seit ' ~ state.status.days_since_expiry ~ ' Tagen', 'danger') }} {% if state.status.grace_active %}
  Kulanzfrist laeuft ({{ grace_days }} Tage) – Funktionen bleiben vorerst nutzbar.
  {% endif %} {% elif state.status.expiring_soon %} {{ pill('in ' ~ state.status.days_left ~ ' Tagen', 'warning') }} {% else %} {{ pill('in ' ~ state.status.days_left ~ ' Tagen', 'online') }} {% endif %} {% endif %}
Module
  {% if state.modules %} {% for module in modules %} {% if module in state.modules %}{{ pill(module_labels[module], 'online') }} {% else %}{{ pill(module_labels[module], '') }}{% endif %} {% endfor %} {% else %}keine Zusatzmodule{% endif %}
Lizenzserver
  {{ state.status.master_endpoint or 'nicht hinterlegt (nur Offline-Weg)' }}
Letzter Heartbeat
  {{ state.last_heartbeat_at | dt }} {% if state.heartbeat_error %}
  {{ state.heartbeat_error }}
  {% endif %}

{% if current_user.has('settings_license.edit') %}
{% endif %}
{% endif %} {% if pending %}
{{ icon('transfer', size=17) }} Offene Anfrage (Offline-Weg)
Aktion: {{ pending.action }} · erzeugt {{ pending.created_at | dt }}
{% if pending.reason %} {{ alert(pending.reason, 'warning', 'Warum der Online-Weg nicht ging') }} {% endif %} {{ alert('Beide Codes sind signiert -- sie lassen sich unterwegs nicht veraendern. Der Anfragecode gehoert zu genau dieser Maschine und genau dieser Anfrage; eine Antwort auf einen anderen Code wird abgelehnt.', 'info') }} {% if pending.code %}
Anfragecode -- an den Anbieter uebermitteln

    {{ pending.code }}

{% else %} {{ alert('Zu dieser Anfrage liegt kein Code vor -- sie stammt aus einer aelteren Fassung. Loesen Sie die Aktion erneut aus, dann entsteht ein neuer Code.', 'warning') }} {% endif %} Antwortcode des Lizenzservers
{% endif %} {% if current_user.has('settings_license.edit') %}
{{ icon('shield', size=17) }} Zertifikat des Lizenzservers
Nur noetig, wenn der Lizenzserver ein eigenes Zertifikat benutzt
{{ alert('Ein Lizenzserver im eigenen Netz hat meist ein selbstsigniertes Zertifikat. Ohne Anker scheitert die Pruefung, und jeder Versuch faellt auf den Offline-Weg zurueck. Die Pruefung abzuschalten waere der falsche Weg -- hinterlegen Sie stattdessen das Zertifikat, dann wird gegen genau dieses geprueft.', 'info') }} Zertifikat (PEM) {{ server_certificate }} Leer lassen, um wieder gegen die Systemanker zu pruefen. Auf dem Lizenzserver liegt es unter /etc/tesm/certs/<name>/fullchain.pem.
{% endif %} {% if current_user.has('settings_license.edit') %}
{{ icon('upload', size=17) }} Lizenzdatei einspielen
Die Datei enthaelt das Lizenzdokument und den zugehoerigen Client-Schluessel
{% if trusted_keys and current_user.is_admin %} {{ checkbox('allow_new_issuer', 'Wechsel des Ausstellers ausdruecklich zulassen', hint_text='Nur ankreuzen, wenn die neue Lizenz bewusst von einem anderen Lizenzserver kommt.') }} {% endif %}
{% endif %}
{{ icon('hard-drive', size=17) }} Diese Maschine
Wird zur Bindung der Lizenz verwendet

Hostname
  {{ hostname }}
Fingerprint
  {{ fingerprint }}

Der Fingerprint stammt aus der stabilen Maschinenidentitaet. Eine Umbenennung des Hosts aendert ihn nicht mehr -- im Vorgaenger fuehrte genau das zu „bereits anderweitig gebunden“.

{{ icon('shield', size=17) }} Vertrauenswuerdige Aussteller
{{ trusted_keys | length }} gepinnte Schluessel
{% if trusted_keys %}

Schluessel-ID | Bezeichnung | Quelle |
--- | --- | --- | ---
{% for key in trusted_keys %}
{{ key.key_id }} | {{ key.label }} {{ key.added_at | dt }} | {{ key.source }} | {% if current_user.is_admin %} {% endif %}
{% endfor %}

{% else %} {{ empty_state('Kein Aussteller gepinnt', 'Beim ersten Import wird der Schluessel des Lizenzservers uebernommen und danach erwartet.', 'shield') }} {% endif %}
{{ icon('puzzle', size=17) }} Was die Lizenz freischaltet

{% for key, label in features.items() %}
- {% if feature_allowed(key) %} {{ icon('check', size=14) }} {% else %} {{ icon('lock', size=14) }} {% endif %} {{ label }}
{% endfor %}

Diese Liste ist die einzige Wahrheit: was hier steht, wird serverseitig durchgesetzt -- nicht nur in der Oberflaeche ausgegraut.

{% endblock %}