Files
dhcp-service/templates/dashboard.html
T
DHCP Service Bot 90736253b1 Initial commit: DHCP Web Manager
Flask-based web UI for managing ISC DHCP server (dhcpd).

Features:
- subnet / static host binding CRUD via web
- listen interface configuration (INTERFACESv4)
- active lease query + pool utilization stats
- service status, reload/restart, syntax check
- user auth + operation logs
- automatic backup before each config change
- safe change pipeline: write file → dhcpd -t → systemctl restart + is-active verify
- error messages include journalctl tail for diagnosis
2026-07-09 17:09:23 +08:00

85 lines
2.8 KiB
HTML

{% extends "base.html" %}
{% block title %}总览 · DHCP 管理{% endblock %}
{% block content %}
<div class="stat-grid">
<div class="stat-card">
<div class="stat-num">{{ subnets|length }}</div>
<div class="stat-label">子网数</div>
</div>
<div class="stat-card">
<div class="stat-num">{{ hosts|length }}</div>
<div class="stat-label">静态绑定</div>
</div>
<div class="stat-card">
<div class="stat-num">{{ lease_total }}</div>
<div class="stat-label">活跃租约</div>
</div>
<div class="stat-card {% if svc.active %}stat-ok{% else %}stat-warn{% endif %}">
<div class="stat-num">{% if svc.active %}● 运行{% else %}○ 停止{% endif %}</div>
<div class="stat-label">dhcpd 状态</div>
</div>
</div>
<div class="card">
<h2>接口绑定</h2>
{% if svc.interfaces %}
<p>当前监听: <code>{{ svc.interfaces|join(', ') }}</code></p>
{% else %}
<p class="warn-text">⚠ 当前未配置监听接口(dhcpd 将不会响应任何请求)</p>
{% endif %}
<a href="{{ url_for('config_view') }}" class="btn">前往配置</a>
</div>
<div class="card">
<h2>地址池使用情况</h2>
{% if pool_stats %}
<table class="data-table">
<thead>
<tr><th>子网</th><th>地址池范围</th><th>总数</th><th>已用</th><th>静态</th><th>可用</th><th>利用率</th></tr>
</thead>
<tbody>
{% for p in pool_stats %}
<tr>
<td>{{ p.subnet }}</td>
<td><code>{{ p.range }}</code></td>
<td>{{ p.total }}</td>
<td>{{ p.used }}</td>
<td>{{ p.static }}</td>
<td>{{ p.available }}</td>
<td>
<div class="bar"><div class="bar-fill" style="width: {{ p.util_pct }}%"></div></div>
<span class="small">{{ p.util_pct }}%</span>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p class="muted">尚未配置任何子网。 <a href="{{ url_for('subnet_new') }}">新增子网</a></p>
{% endif %}
</div>
<div class="card">
<h2>最近活跃租约</h2>
{% if leases %}
<table class="data-table">
<thead>
<tr><th>IP</th><th>MAC</th><th>主机名</th><th>剩余</th></tr>
</thead>
<tbody>
{% for l in leases %}
<tr>
<td>{{ l.ip }}</td>
<td><code>{{ l.mac or '—' }}</code></td>
<td>{{ l.client_hostname or '—' }}</td>
<td>{{ l.remaining_seconds()|format_duration }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p><a href="{{ url_for('lease_list') }}">查看全部租约 →</a></p>
{% else %}
<p class="muted">暂无活跃租约</p>
{% endif %}
</div>
{% endblock %}