90736253b1
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
85 lines
2.8 KiB
HTML
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 %} |