- webapp/: Flask web management app with:
- Dashboard showing image types and service status
- USB import page for WinPE deployment content
- Unattend.xml visual editor (driver paths, specialize commands,
OOBE settings, first logon commands, raw XML view)
- API endpoints for services and image management
- SETUP.md: Complete setup documentation for streamlined process
- build-usb.sh: Now copies webapp and optional WinPE images to USB
- playbook: Added webapp deployment (systemd service, Apache reverse
proxy), offline package verification, WinPE auto-import from USB
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
96 lines
3.0 KiB
HTML
96 lines
3.0 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Dashboard - PXE Server Manager{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2 class="mb-0">Dashboard</h2>
|
|
<button class="btn btn-outline-secondary btn-sm" onclick="location.reload()">
|
|
<i class="bi bi-arrow-clockwise"></i> Refresh
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Services -->
|
|
<div class="card mb-4">
|
|
<div class="card-header d-flex align-items-center">
|
|
<i class="bi bi-gear-wide-connected me-2"></i> PXE Services
|
|
</div>
|
|
<div class="card-body p-0">
|
|
<table class="table table-hover mb-0">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>Service</th>
|
|
<th>Status</th>
|
|
<th>State</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for svc in services %}
|
|
<tr>
|
|
<td>
|
|
<i class="bi bi-server me-1 text-muted"></i>
|
|
<strong>{{ svc.name }}</strong>
|
|
</td>
|
|
<td>
|
|
<span class="status-dot {{ 'active' if svc.active else 'inactive' }}"></span>
|
|
{{ "Running" if svc.active else "Stopped" }}
|
|
</td>
|
|
<td><code>{{ svc.state }}</code></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Images -->
|
|
<div class="card">
|
|
<div class="card-header d-flex align-items-center">
|
|
<i class="bi bi-disc me-2"></i> Deployment Images
|
|
</div>
|
|
<div class="card-body p-0">
|
|
<table class="table table-hover mb-0">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>Image</th>
|
|
<th>Deploy Content</th>
|
|
<th>unattend.xml</th>
|
|
<th>Path</th>
|
|
<th class="text-end">Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for img in images %}
|
|
<tr>
|
|
<td>
|
|
<strong>{{ img.friendly_name }}</strong><br>
|
|
<small class="text-muted">{{ img.image_type }}</small>
|
|
</td>
|
|
<td>
|
|
{% if img.has_content %}
|
|
<span class="badge bg-success"><i class="bi bi-check-circle"></i> Present</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary"><i class="bi bi-x-circle"></i> Empty</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if img.has_unattend %}
|
|
<span class="badge bg-success"><i class="bi bi-check-circle"></i> Exists</span>
|
|
{% else %}
|
|
<span class="badge bg-warning text-dark"><i class="bi bi-exclamation-triangle"></i> Missing</span>
|
|
{% endif %}
|
|
</td>
|
|
<td><code class="small">{{ img.deploy_path }}</code></td>
|
|
<td class="text-end">
|
|
<a href="{{ url_for('unattend_editor', image_type=img.image_type) }}"
|
|
class="btn btn-sm btn-outline-primary">
|
|
<i class="bi bi-pencil-square"></i> Edit Unattend
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|