216 lines
4.8 KiB
HTML
216 lines
4.8 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}
|
|
CrackLab — Dashboard
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
|
|
<h1 class="page-title">
|
|
CrackLab
|
|
</h1>
|
|
|
|
<div class="page-description">
|
|
Job and cracking coverage management.
|
|
</div>
|
|
|
|
|
|
<div class="stats-grid">
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-value">
|
|
{{ methods_count }}
|
|
</div>
|
|
|
|
<div class="stat-title">
|
|
Methods
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-value">
|
|
{{ jobs_count }}
|
|
</div>
|
|
|
|
<div class="stat-title">
|
|
Jobs
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-value">
|
|
{{ active_jobs_count }}
|
|
</div>
|
|
|
|
<div class="stat-title">
|
|
Active Jobs
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-value">
|
|
{{ clients_count }}
|
|
</div>
|
|
|
|
<div class="stat-title">
|
|
Clients
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="stat-card">
|
|
<div class="stat-value">
|
|
{{ results_count }}
|
|
</div>
|
|
|
|
<div class="stat-title">
|
|
Results
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
<div class="dashboard-grid">
|
|
|
|
<section class="card">
|
|
|
|
<h2>
|
|
Job Status
|
|
</h2>
|
|
|
|
<div class="status-list">
|
|
|
|
{% for status in (
|
|
"CREATED",
|
|
"QUEUED",
|
|
"RUNNING",
|
|
"PARTIAL",
|
|
"COMPLETED",
|
|
"FAILED",
|
|
"CANCELLED"
|
|
) %}
|
|
|
|
<div class="status-row">
|
|
|
|
<span>
|
|
<span class="badge badge-{{ status|lower }}">
|
|
{{ status }}
|
|
</span>
|
|
</span>
|
|
|
|
<strong>
|
|
{{ job_statuses.get(status, 0) }}
|
|
</strong>
|
|
|
|
</div>
|
|
|
|
{% endfor %}
|
|
|
|
</div>
|
|
|
|
</section>
|
|
|
|
|
|
<section class="card">
|
|
|
|
<h2>
|
|
Recent Jobs
|
|
</h2>
|
|
|
|
{% if recent_jobs %}
|
|
|
|
<div class="table-container">
|
|
|
|
<table>
|
|
|
|
<thead>
|
|
<tr>
|
|
<th>Job</th>
|
|
<th>Method</th>
|
|
<th>Status</th>
|
|
<th>Hashes</th>
|
|
<th>Client</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
{% for job in recent_jobs %}
|
|
|
|
<tr>
|
|
|
|
<td>
|
|
<a
|
|
href="{{ url_for(
|
|
'cracklab.jobs_page'
|
|
) }}"
|
|
>
|
|
{{ job["id"] }}
|
|
</a>
|
|
</td>
|
|
|
|
<td>
|
|
{{ method_names.get(
|
|
job["method_id"],
|
|
job["method_id"]
|
|
) }}
|
|
<span class="muted">
|
|
v{{ job["method_version"] }}
|
|
</span>
|
|
</td>
|
|
|
|
<td>
|
|
<span
|
|
class="badge badge-{{
|
|
job["status"]|lower
|
|
}}"
|
|
>
|
|
{{ job["status"] }}
|
|
</span>
|
|
</td>
|
|
|
|
<td>
|
|
{{ job["hash_count"] }}
|
|
</td>
|
|
|
|
<td>
|
|
{% if job["client_id"] %}
|
|
{{ client_names.get(
|
|
job["client_id"],
|
|
job["client_id"]
|
|
) }}
|
|
{% else %}
|
|
<span class="muted">
|
|
—
|
|
</span>
|
|
{% endif %}
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
{% endfor %}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
{% else %}
|
|
|
|
<div class="empty-state">
|
|
No jobs have been issued yet.
|
|
</div>
|
|
|
|
{% endif %}
|
|
|
|
</section>
|
|
|
|
</div>
|
|
|
|
{% endblock %}
|