150 lines
7.0 KiB
HTML
150 lines
7.0 KiB
HTML
{{define "content"}}
|
|
{{$s := .Data.S}}
|
|
|
|
<h1 class="page-title mb-1">Settings</h1>
|
|
<p class="text-body-secondary mb-4">Server configuration, stored in the database.</p>
|
|
|
|
{{template "settingsnav" .}}
|
|
|
|
<form method="post" action="/settings/logging">
|
|
<input type="hidden" name="_csrf" value="{{.CSRF}}">
|
|
|
|
<div class="row g-3">
|
|
<div class="col-12 col-xl-8">
|
|
<div class="card">
|
|
<div class="card-header">Query logging</div>
|
|
<div class="card-body">
|
|
|
|
<div class="form-section">
|
|
<div class="form-check form-switch mb-2">
|
|
<input type="hidden" name="querylog_enabled" value="false">
|
|
<input class="form-check-input" type="checkbox" role="switch" id="qlEnabled"
|
|
name="querylog_enabled" value="true" {{if $s.QueryLog.Enabled}}checked{{end}}>
|
|
<label class="form-check-label" for="qlEnabled">Record DNS queries in the database</label>
|
|
</div>
|
|
<div class="form-text">
|
|
Records are buffered in memory and written in batches, so logging never delays
|
|
a DNS response. Under sustained overload entries are dropped rather than queued.
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-section">
|
|
<div class="form-section-title">Retention</div>
|
|
<div class="alert alert-info small">
|
|
<i class="bi bi-info-circle me-1"></i>
|
|
Both limits are applied on every cleanup pass: rows older than the retention
|
|
period go first, then the table is trimmed to the row cap. Set a value to 0 to
|
|
disable that limit — but leaving both at 0 lets the database grow without bound.
|
|
</div>
|
|
<div class="row g-3">
|
|
<div class="col-6 col-md-4">
|
|
<label class="form-label" for="retentionDays">Retention</label>
|
|
<div class="input-group">
|
|
<input type="number" class="form-control" id="retentionDays" name="retention_days"
|
|
value="{{$s.QueryLog.RetentionDays}}" min="0" max="3650">
|
|
<span class="input-group-text">days</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-6 col-md-4">
|
|
<label class="form-label" for="maxRows">Maximum rows</label>
|
|
<input type="number" class="form-control" id="maxRows" name="max_rows"
|
|
value="{{$s.QueryLog.MaxRows}}" min="0" max="100000000">
|
|
<div class="form-text">Currently {{num .Data.QueryLogRows}} stored</div>
|
|
</div>
|
|
<div class="col-12 col-md-4">
|
|
<label class="form-label" for="cleanupMinutes">Cleanup interval</label>
|
|
<div class="input-group">
|
|
<input type="number" class="form-control" id="cleanupMinutes" name="cleanup_minutes"
|
|
value="{{$s.QueryLog.CleanupMinutes}}" min="1" max="1440">
|
|
<span class="input-group-text">min</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-section">
|
|
<div class="form-section-title">Exclusions</div>
|
|
<div class="row g-3">
|
|
<div class="col-12 col-md-6">
|
|
<label class="form-label" for="ignoreNetworks">Ignore these networks</label>
|
|
<textarea class="form-control list-input" id="ignoreNetworks" name="ignore_networks" rows="4"
|
|
placeholder="127.0.0.0/8">{{joinLines $s.QueryLog.IgnoreNetworks}}</textarea>
|
|
<div class="form-text">Queries from these clients are not logged.</div>
|
|
</div>
|
|
<div class="col-12 col-md-6">
|
|
<label class="form-label" for="ignoreDomains">Ignore these domains</label>
|
|
<textarea class="form-control list-input" id="ignoreDomains" name="ignore_domains" rows="4"
|
|
placeholder="internal.example.com">{{joinLines $s.QueryLog.IgnoreDomains}}</textarea>
|
|
<div class="form-text">Subdomains are excluded too. Useful for chatty monitoring checks.</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-actions">
|
|
<button type="submit" class="btn btn-primary">
|
|
<i class="bi bi-check-lg me-1"></i>Save logging settings
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-12 col-xl-4">
|
|
<div class="card mb-3">
|
|
<div class="card-header">Application log</div>
|
|
<div class="card-body">
|
|
<div class="mb-3">
|
|
<label class="form-label" for="logLevel">Log level</label>
|
|
<select class="form-select" id="logLevel" name="log_level">
|
|
{{range list "debug" "info" "warn" "error"}}
|
|
<option value="{{.}}" {{if eq . $s.Logging.Level}}selected{{end}}>{{title .}}</option>
|
|
{{end}}
|
|
</select>
|
|
<div class="form-text">
|
|
Debug logs every request and resolution failure; useful when diagnosing, noisy
|
|
otherwise.
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label" for="logFormat">Format</label>
|
|
<select class="form-select" id="logFormat" name="log_format">
|
|
<option value="text" {{if eq $s.Logging.Format "text"}}selected{{end}}>Text — readable in a terminal</option>
|
|
<option value="json" {{if eq $s.Logging.Format "json"}}selected{{end}}>JSON — for log shippers</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<label class="form-label" for="auditMaxRows">Audit log maximum rows</label>
|
|
<input type="number" class="form-control" id="auditMaxRows" name="audit_max_rows"
|
|
value="{{$s.Logging.AuditMaxRows}}" min="100" max="10000000">
|
|
<div class="form-text">Oldest entries are trimmed past this count.</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header">Query log writer</div>
|
|
<div class="card-body">
|
|
<dl class="row small mb-0">
|
|
<dt class="col-7 text-body-secondary">State</dt>
|
|
<dd class="col-5 text-end">
|
|
{{if .Data.Stats.Enabled}}<span class="badge text-bg-success">on</span>
|
|
{{else}}<span class="badge text-bg-secondary">off</span>{{end}}
|
|
</dd>
|
|
<dt class="col-7 text-body-secondary">Rows written</dt>
|
|
<dd class="col-5 text-end">{{num .Data.Stats.Written}}</dd>
|
|
<dt class="col-7 text-body-secondary">Buffered</dt>
|
|
<dd class="col-5 text-end">{{num .Data.Stats.Buffered}}</dd>
|
|
<dt class="col-7 text-body-secondary">Dropped</dt>
|
|
<dd class="col-5 text-end {{if gt .Data.Stats.Dropped 0}}text-warning fw-semibold{{end}}">
|
|
{{num .Data.Stats.Dropped}}
|
|
</dd>
|
|
<dt class="col-7 text-body-secondary">Pruned</dt>
|
|
<dd class="col-5 text-end">{{num .Data.Stats.Pruned}}</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
{{end}}
|