Encrypted DNS health, comparing a zone's views, --local everywhere

jarld checks the DoT and DoH listeners every 10 minutes as a client would (page, dashboard, jarl encrypted-dns health, jarl_encrypted_dns_up). The Compare views tab and jarl zone diff show what differs between a zone's views, with Use this version. --local works on unlinked zones. A changed certificates.dir is followed by encrypted DNS's tls statements. Sharing an already shared version replaces other views' overrides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adamandClaude Opus 5.5 committed 2026-10-12 20:46:56 +01:00
1 parent 67ae0091b3
commit 13ffd8cad4
31 files changed
+1153 -18

No files matched your search

+18
View File
@@ -4,6 +4,7 @@ package server
import (
"context"
"crypto/tls"
"crypto/x509"
"errors"
"fmt"
"io/fs"
@@ -21,6 +22,7 @@ import (
"jarl/internal/api"
"jarl/internal/auth"
"jarl/internal/certs"
"jarl/internal/encdns"
"jarl/internal/engine"
"jarl/internal/nscheck"
"jarl/internal/porkbun"
@@ -90,6 +92,13 @@ type Server struct {
// state part of /metrics.
started time.Time
metricsCache metricsCache
// encHealth is the last check of encrypted DNS's listeners
// (h_encdns.go); encRoots the CAs it trusts (nil: the system's).
encHealth struct {
sync.Mutex
h *encdns.Health
}
encRoots *x509.CertPool
mu sync.Mutex
srvs []*http.Server
@@ -226,6 +235,14 @@ func (s *Server) Serve(ctx context.Context, ready func()) error {
ready()
}
go s.housekeeping(ctx)
go func() {
// Once jarld and named have settled after a start.
select {
case <-ctx.Done():
case <-time.After(30 * time.Second):
s.checkEncryptedDNS(ctx)
}
}()
select {
case <-ctx.Done():
case err := <-errc:
@@ -300,6 +317,7 @@ func (s *Server) housekeeping(ctx context.Context) {
}
s.limiter.cleanup()
s.warnExpiringTokens(ctx, time.Now())
s.checkEncryptedDNS(ctx)
if s.certs != nil {
s.certs.reloadIfChanged()
}