Add latest changes
Dieser Commit ist enthalten in:
@@ -384,7 +384,7 @@
|
||||
`<div class="d-flex justify-content-between border-bottom py-2">
|
||||
<span>
|
||||
<code>${v.license_key}</code> |
|
||||
<span class="text-muted">${v.hardware_id}</span>
|
||||
<span class="text-muted">${v.hardware_fingerprint}</span>
|
||||
</span>
|
||||
<span>
|
||||
<span class="badge bg-secondary">${v.ip_address}</span>
|
||||
|
||||
127
v2_adminpanel/templates/monitoring/device_limits.html
Normale Datei
127
v2_adminpanel/templates/monitoring/device_limits.html
Normale Datei
@@ -0,0 +1,127 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Device Limit Monitoring{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container-fluid py-4">
|
||||
<h1 class="h3 mb-4">Device Limit Monitoring</h1>
|
||||
|
||||
<!-- Overall Stats -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Total Devices</h5>
|
||||
<p class="card-text display-6">{{ stats.total_devices }}</p>
|
||||
<small class="text-muted">of {{ stats.total_device_limit }} allowed</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Overall Usage</h5>
|
||||
<p class="card-text display-6">{{ stats.usage_percent }}%</p>
|
||||
<div class="progress">
|
||||
<div class="progress-bar {% if stats.usage_percent > 90 %}bg-danger{% elif stats.usage_percent > 70 %}bg-warning{% else %}bg-success{% endif %}"
|
||||
role="progressbar" style="width: {{ stats.usage_percent }}%"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Active (24h)</h5>
|
||||
<p class="card-text display-6">{{ stats.active_24h }}</p>
|
||||
<small class="text-muted">devices seen today</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Active (7d)</h5>
|
||||
<p class="card-text display-6">{{ stats.active_7d }}</p>
|
||||
<small class="text-muted">devices seen this week</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Warnings -->
|
||||
{% if warnings %}
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Device Limit Warnings</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>License Key</th>
|
||||
<th>Customer</th>
|
||||
<th>Devices</th>
|
||||
<th>Limit</th>
|
||||
<th>Usage</th>
|
||||
<th>Status</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for warning in warnings %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('license_bp.license_detail', license_id=warning.license_id) }}">
|
||||
{{ warning.license_key }}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{{ warning.customer_name }}<br>
|
||||
<small class="text-muted">{{ warning.customer_email }}</small>
|
||||
</td>
|
||||
<td>{{ warning.device_count }}</td>
|
||||
<td>{{ warning.device_limit }}</td>
|
||||
<td>
|
||||
<div class="progress" style="width: 100px;">
|
||||
<div class="progress-bar {% if warning.status == 'exceeded' %}bg-danger{% else %}bg-warning{% endif %}"
|
||||
role="progressbar" style="width: {{ warning.usage_percent }}%">
|
||||
{{ warning.usage_percent }}%
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
{% if warning.status == 'exceeded' %}
|
||||
<span class="badge bg-danger">Exceeded</span>
|
||||
{% else %}
|
||||
<span class="badge bg-warning">Warning</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('license_bp.license_detail', license_id=warning.license_id) }}#devices"
|
||||
class="btn btn-sm btn-primary">
|
||||
View Devices
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-success">
|
||||
<i class="fas fa-check-circle"></i> All licenses are within their device limits.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Auto-refresh every 30 seconds
|
||||
setTimeout(function() {
|
||||
location.reload();
|
||||
}, 30000);
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -327,7 +327,7 @@
|
||||
<div class="col-md-3">
|
||||
<div class="geo-info">
|
||||
<i class="bi bi-geo-alt"></i> {{ session.ip_address }}
|
||||
<div><small>Hardware: {{ session.hardware_id[:12] }}...</small></div>
|
||||
<div><small>Hardware: {{ session.hardware_fingerprint[:12] }}...</small></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2 text-end">
|
||||
@@ -591,7 +591,7 @@
|
||||
<div class="col-md-3">
|
||||
<div class="geo-info">
|
||||
<i class="bi bi-geo-alt"></i> ${session.ip_address}
|
||||
<div><small>Hardware: ${session.hardware_id.substring(0, 12)}...</small></div>
|
||||
<div><small>Hardware: ${session.hardware_fingerprint.substring(0, 12)}...</small></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2 text-end">
|
||||
@@ -619,7 +619,7 @@
|
||||
`<div class="d-flex justify-content-between border-bottom py-2">
|
||||
<span>
|
||||
<code>${v.license_key}</code> |
|
||||
<span class="text-muted">${v.hardware_id}</span>
|
||||
<span class="text-muted">${v.hardware_fingerprint}</span>
|
||||
</span>
|
||||
<span>
|
||||
<span class="badge bg-secondary">${v.ip_address}</span>
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
</span>
|
||||
{{ event.description }}
|
||||
{% else %}
|
||||
Validierung von {{ event.ip_address }} • Gerät: {{ event.hardware_id[:8] }}...
|
||||
Validierung von {{ event.ip_address }} • Gerät: {{ event.hardware_fingerprint[:8] }}...
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren