get_logs needs a unit from an allowlist (router-*, kea, unbound, networkd, nftables, ddclient, acme, sshd, kernel). API tokens are valid for 1, 7, 30 (default) or 90 days, or without limit. The overview and the Changes page say which token made the unapplied changes. options.json (router://options) no longer holds the options' source paths: they differ between builds of a release, so a router rebuilding itself offline had to build the file and failed (found by the update test). Web UI: panels flow into columns on wide screens and the width is no longer capped; on phones the navigation is a menu button; the Advanced page uses panels; VLAN dropdowns show their chosen names; the duplicate WireGuard heading is gone. basic: a subtest for wan -> local rules. SPECS.md is now the only document (decisions, how each part works, and what is not done yet); PLAN.md is gone. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeFqV9dZrK6nipHkPfyM4F
48 lines
2.2 KiB
HTML
48 lines
2.2 KiB
HTML
<!doctype html>
|
|
<html lang="en"{{with .Theme}} data-theme="{{.}}"{{end}}>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
{{if .Refresh}}<meta http-equiv="refresh" content="{{.Refresh}}">{{end}}
|
|
<title>{{.Title}} · router</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body{{if not .LoggedIn}} class="bare"{{end}}>
|
|
<header>
|
|
<strong>router</strong>
|
|
{{if .LoggedIn}}
|
|
<input type="checkbox" id="menu" class="menu-toggle" aria-label="Menu">
|
|
<label for="menu" class="menu-button">Menu</label>
|
|
<nav>
|
|
<a href="/"{{if eq .Title "Overview"}} aria-current="page"{{end}}>Overview</a>
|
|
<div class="group"><span>Network</span>
|
|
<a href="/network"{{if eq .Title "Network"}} aria-current="page"{{end}}>Interfaces</a>
|
|
<a href="/dhcp"{{if eq .Title "DHCP"}} aria-current="page"{{end}}>DHCP</a>
|
|
<a href="/dns"{{if eq .Title "DNS"}} aria-current="page"{{end}}>DNS</a>
|
|
<a href="/wireguard"{{if eq .Title "WireGuard"}} aria-current="page"{{end}}>WireGuard</a>
|
|
<a href="/firewall"{{if eq .Title "Firewall"}} aria-current="page"{{end}}>Firewall</a>
|
|
</div>
|
|
<div class="group"><span>Services</span>
|
|
<a href="/ddns"{{if eq .Title "Dynamic DNS"}} aria-current="page"{{end}}>Dynamic DNS</a>
|
|
<a href="/dnsproviders"{{if eq .Title "DNS providers"}} aria-current="page"{{end}}>DNS providers</a>
|
|
<a href="/certificate"{{if eq .Title "Certificate"}} aria-current="page"{{end}}>Certificate</a>
|
|
</div>
|
|
<div class="group"><span>System</span>
|
|
<a href="/update"{{if eq .Title "Update"}} aria-current="page"{{end}}>Update</a>
|
|
<a href="/tokens"{{if eq .Title "API access"}} aria-current="page"{{end}}>API access</a>
|
|
<a href="/advanced"{{if eq .Title "Advanced"}} aria-current="page"{{end}}>Advanced</a>
|
|
</div>
|
|
<form method="post" action="/logout"><input type="hidden" name="csrf" value="{{.CSRF}}"><button class="link">Log out</button></form>
|
|
</nav>
|
|
{{end}}
|
|
</header>
|
|
<main>
|
|
<h1>{{.Title}}</h1>
|
|
{{if .Flash}}<p class="flash">{{.Flash}}</p>{{end}}
|
|
{{if .Error}}<p class="error">{{.Error}}</p>{{end}}
|
|
{{template "content" .}}
|
|
</main>
|
|
<script src="/static/menu.js"></script>
|
|
</body>
|
|
</html>
|