From b666975ec292fec239aa6023dc79abf5538c9d95 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 28 Mar 2019 12:51:06 +0000 Subject: [PATCH] unbound-dhcp-leases-bridge: Replace leases file atomically When there is a large number of leases, writing the file may take a long time. When unbound is re-reading its configuration in that time, the file might syntactically incorrect. This change writes the file first and then moves it to the right place in one transaction. Signed-off-by: Michael Tremer --- config/rootfiles/core/130/filelists/files | 1 + config/unbound/unbound-dhcp-leases-bridge | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/config/rootfiles/core/130/filelists/files b/config/rootfiles/core/130/filelists/files index 28a32a7c65..ab1e82fcbc 100644 --- a/config/rootfiles/core/130/filelists/files +++ b/config/rootfiles/core/130/filelists/files @@ -18,6 +18,7 @@ usr/local/bin/ipsec-interfaces usr/local/bin/suricatactrl usr/local/bin/update-ids-ruleset usr/sbin/convert-snort +usr/sbin/unbound-dhcp-leases-bridge var/ipfire/backup/bin/backup.pl var/ipfire/backup/include var/ipfire/general-functions.pl diff --git a/config/unbound/unbound-dhcp-leases-bridge b/config/unbound/unbound-dhcp-leases-bridge index 54cd8135ba..a8cd837bbf 100644 --- a/config/unbound/unbound-dhcp-leases-bridge +++ b/config/unbound/unbound-dhcp-leases-bridge @@ -25,9 +25,11 @@ import daemon import ipaddress import logging import logging.handlers +import os import re import signal import subprocess +import tempfile import inotify.adapters @@ -519,11 +521,15 @@ class UnboundConfigWriter(object): self._cached_leases.append(l) def write_dhcp_leases(self, leases): - with open(self.path, "w") as f: + with tempfile.NamedTemporaryFile(mode="w", delete=False) as f: + filename = f.name + for l in leases: for rr in l.rrset: f.write("local-data: \"%s\"\n" % " ".join(rr)) + os.rename(filename, self.path) + def _control(self, *args): command = ["unbound-control"] command.extend(args) -- 2.39.2