Publish DHCP clients' names in DNS
router-webui leases-dns reads Kea's leases and publishes <name>.<domain> with reverse records in the running Unbound (router.dns.dynamicLeases). Names the configuration publishes are never taken over; a client's name is cut to its first label and kept inside the local domain; of two clients the newer lease wins. The DNS page switches it on and shows what is published and what was skipped; router-setup enables it with a domain. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeFqV9dZrK6nipHkPfyM4F
This commit is contained in:
@@ -170,6 +170,32 @@ type dnsData struct {
|
||||
Errors FormErrors
|
||||
Domain string
|
||||
Auto []string // published without a record here
|
||||
Dynamic bool // router.dns.dynamicLeases
|
||||
Dyn *dynStatus
|
||||
}
|
||||
|
||||
func (s Settings) dynamicLeases() bool {
|
||||
router, _ := s["router"].(map[string]any)
|
||||
dns, _ := router["dns"].(map[string]any)
|
||||
return boolean(dns, false, "dynamicLeases")
|
||||
}
|
||||
|
||||
func (s Settings) setDynamicLeases(on bool) {
|
||||
dns := obj(obj(s, "router"), "dns")
|
||||
if on {
|
||||
dns["dynamicLeases"] = true
|
||||
} else {
|
||||
delete(dns, "dynamicLeases")
|
||||
}
|
||||
}
|
||||
|
||||
// dnsView is the page's data for settings s.
|
||||
func (a *app) dnsView(s Settings, records, zones []DNSRecord, errs FormErrors) dnsData {
|
||||
d := dnsData{Records: records, Zones: zones, Errors: errs, Domain: s.domain(), Auto: s.dnsAuto(), Dynamic: s.dynamicLeases()}
|
||||
if st, ok := readDynStatus(a.sys.leasesDNSDir()); ok {
|
||||
d.Dyn = &st
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
func (s Settings) dnsAuto() []string {
|
||||
@@ -198,8 +224,7 @@ func (a *app) dnsPage(w http.ResponseWriter, r *http.Request, sess session) {
|
||||
a.render(w, "dns", p)
|
||||
return
|
||||
}
|
||||
p.Data = dnsData{Records: append(s.dnsRecords(), DNSRecord{}), Zones: append(s.forwardZones(), DNSRecord{}),
|
||||
Domain: s.domain(), Auto: s.dnsAuto()}
|
||||
p.Data = a.dnsView(s, append(s.dnsRecords(), DNSRecord{}), append(s.forwardZones(), DNSRecord{}), nil)
|
||||
a.render(w, "dns", p)
|
||||
}
|
||||
|
||||
@@ -222,15 +247,17 @@ func (a *app) dns(w http.ResponseWriter, r *http.Request, sess session) {
|
||||
return
|
||||
}
|
||||
records, zones := dnsRows(r, "rec"), dnsRows(r, "zone")
|
||||
dynamic := r.PostFormValue("dynamic") == "on"
|
||||
if err := s.applyDNS(records, zones); err != nil {
|
||||
var fe FormErrors
|
||||
errors.As(err, &fe)
|
||||
p.Error = "Please correct the marked fields."
|
||||
p.Data = dnsData{Records: records, Zones: zones, Errors: fe, Domain: s.domain(), Auto: s.dnsAuto()}
|
||||
p.Data = a.dnsView(s, records, zones, fe)
|
||||
w.WriteHeader(http.StatusUnprocessableEntity)
|
||||
a.render(w, "dns", p)
|
||||
return
|
||||
}
|
||||
s.setDynamicLeases(dynamic)
|
||||
if err := s.save(a.sys.settingsPath()); err != nil {
|
||||
p.Error = "Saving: " + err.Error()
|
||||
a.render(w, "dns", p)
|
||||
|
||||
Reference in New Issue
Block a user