From e19e7c359846c6b5900546ef7ee8852785e27615 Mon Sep 17 00:00:00 2001 From: William Grzybowski Date: Mon, 11 Mar 2019 10:47:47 -0300 Subject: [PATCH] feat(middleware): common method write_if_changed --- .../middlewared/etc_files/loader.py | 13 +++--------- .../middlewared/etc_files/rc.conf.py | 15 +++---------- src/middlewared/middlewared/plugins/etc.py | 21 ++----------------- src/middlewared/middlewared/utils/io.py | 21 +++++++++++++++++++ 4 files changed, 29 insertions(+), 41 deletions(-) create mode 100644 src/middlewared/middlewared/utils/io.py diff --git a/src/middlewared/middlewared/etc_files/loader.py b/src/middlewared/middlewared/etc_files/loader.py index 176403d055d6..723147d13f99 100644 --- a/src/middlewared/middlewared/etc_files/loader.py +++ b/src/middlewared/middlewared/etc_files/loader.py @@ -1,22 +1,15 @@ import logging -import os import subprocess import sysctl +from middlewared.utils.io import write_if_changed + logger = logging.getLogger(__name__) def loader_config(middleware): config = generate_loader_config(middleware) - - with open(os.open("/boot/loader.conf.local", os.O_CREAT | os.O_RDWR), "w+") as f: - f.seek(0) - data = f.read() - new = "\n".join(config) + "\n" - if data != new: - f.seek(0) - f.write(new) - f.truncate() + write_if_changed("/boot/loader.conf.local", "\n".join(config) + "\n") def generate_loader_config(middleware): diff --git a/src/middlewared/middlewared/etc_files/rc.conf.py b/src/middlewared/middlewared/etc_files/rc.conf.py index 3a4203ee8796..2b57ff1b6608 100644 --- a/src/middlewared/middlewared/etc_files/rc.conf.py +++ b/src/middlewared/middlewared/etc_files/rc.conf.py @@ -6,6 +6,8 @@ import subprocess import sysctl +from middlewared.utils.io import write_if_changed + NFS_BINDIP_NOTFOUND = '/tmp/.nfsbindip_notfound' RE_FIRMWARE_VERSION = re.compile(r'Firmware Revision\s*:\s*(\S+)', re.M) @@ -444,16 +446,5 @@ def render(service, middleware): except Exception: middleware.logger.error('Failed to generate %s', i.__name__, exc_info=True) - with open(os.open('/etc/rc.conf.freenas', os.O_CREAT | os.O_RDWR), 'w+') as f: - f.seek(0) - current = f.read() - new = '\n'.join(rcs) + '\n' - if current != new: - f.seek(0) - f.write('\n'.join(rcs) + '\n') - f.truncate() - os.fsync(f) - - # Signal init later to make sure the file is synced to filesystem - if current != new: + if write_if_changed('/etc/rc.conf.freenas', '\n'.join(rcs) + '\n'): os.kill(1, signal.SIGALRM) diff --git a/src/middlewared/middlewared/plugins/etc.py b/src/middlewared/middlewared/plugins/etc.py index 9da4c92cbb2f..13270fb3a061 100644 --- a/src/middlewared/middlewared/plugins/etc.py +++ b/src/middlewared/middlewared/plugins/etc.py @@ -1,10 +1,10 @@ from mako import exceptions from mako.lookup import TemplateLookup from middlewared.service import Service +from middlewared.utils.io import write_if_changed import asyncio import grp -import hashlib import imp import os import pwd @@ -249,24 +249,7 @@ async def generate(self, name): continue outfile = '/etc/{0}'.format(entry['path']) - changes = False - - # Check hash of generated and existing file - # Do not rewrite if they are the same - if os.path.exists(outfile): - with open(outfile, 'rb') as f: - existing_hash = hashlib.sha256(f.read()).hexdigest() - - new_hash = hashlib.sha256(rendered.encode('utf-8')).hexdigest() - if existing_hash != new_hash: - with open(outfile, 'w') as f: - f.write(rendered) - changes = True - - if not os.path.exists(outfile): - with open(outfile, 'w') as f: - f.write(rendered) - changes = True + changes = write_if_changed(outfile, rendered) # If ownership or permissions are specified, see if # they need to be changed. diff --git a/src/middlewared/middlewared/utils/io.py b/src/middlewared/middlewared/utils/io.py new file mode 100644 index 000000000000..f922a4570869 --- /dev/null +++ b/src/middlewared/middlewared/utils/io.py @@ -0,0 +1,21 @@ +import os + + +def write_if_changed(path, data): + + if isinstance(data, str): + data = data.encode() + + changed = False + + with open(os.open(path, os.O_CREAT | os.O_RDWR), 'wb+') as f: + f.seek(0) + current = f.read() + if current != data: + changed = True + f.seek(0) + f.write(data) + f.truncate() + os.fsync(f) + + return changed