unbound-dhcp-leases-bridge: Only reload if leases have actually changed

This patches changes that leases will always be written in
alphanumerical order so that we can later compare the newly generated
file with the previous version. If it has not changed, we skip reload
Unbound.

Suggested-by: Nick Howitt <nick@howitts.co.uk>
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
This commit is contained in:
Michael Tremer
2024-04-26 15:09:18 +00:00
committed by Arne Fitzenreiter
parent c3cabfa09c
commit 749bf85902

View File

@@ -22,6 +22,7 @@
import argparse
import datetime
import daemon
import filecmp
import functools
import ipaddress
import logging
@@ -516,24 +517,29 @@ class UnboundConfigWriter(object):
def update_dhcp_leases(self, leases):
# Write out all leases
self.write_dhcp_leases(leases)
if self.write_dhcp_leases(leases):
log.debug("Reloading Unbound...")
log.debug("Reloading Unbound...")
# Reload the configuration without dropping the cache
self._control("reload_keep_cache")
# Reload the configuration without dropping the cache
self._control("reload_keep_cache")
def write_dhcp_leases(self, leases):
log.debug("Writing DHCP leases...")
with tempfile.NamedTemporaryFile(mode="w") as f:
for l in leases:
for l in sorted(leases, key=lambda x: x.ipaddr):
for rr in l.rrset:
f.write("local-data: \"%s\"\n" % " ".join(rr))
# Flush the file
f.flush()
# Compare if the new leases file has changed from the previous version
if filecmp.cmp(f.name, self.path, shallow=False):
log.debug("The generated leases file has not changed")
return False
# Make file readable for everyone
os.fchmod(f.fileno(), stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IROTH)
@@ -543,6 +549,8 @@ class UnboundConfigWriter(object):
# Move the file to its destination
os.link(f.name, self.path)
return True
def _control(self, *args):
command = ["unbound-control"]
command.extend(args)