From c0e010e2cdb0419f2a44d822d13219469032e38b Mon Sep 17 00:00:00 2001 From: Mathieu Pasquet Date: Wed, 4 Dec 2013 01:14:28 +0100 Subject: [PATCH] Write the config to a tmp file before a final copy (should prevent some conditions leading to config corruption happenning when poezio cannot write anymore) --- src/config.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/config.py b/src/config.py index 5eed4c09..5f07cc80 100644 --- a/src/config.py +++ b/src/config.py @@ -14,12 +14,13 @@ DEFSECTION = "Poezio" from gettext import gettext as _ import sys +import tempfile +import os import logging -log = logging.getLogger(__name__) from configparser import RawConfigParser, NoOptionError, NoSectionError -from os import environ, makedirs, path +from os import environ, makedirs, path, remove from shutil import copy2 from args import parse_args @@ -178,12 +179,22 @@ class Config(RawConfigParser): elif not written: result_lines.append('%s = %s' % (option, value)) try: - df = open(self.file_name, 'w', encoding='utf-8') + prefix, file = path.split(self.file_name) + filename = path.join(prefix, '.%s.tmp' % file) + fd = os.fdopen( + os.open( + filename, + os.O_WRONLY | os.O_CREAT, + 0o600), + 'w') for line in result_lines: - df.write('%s\n' % line) - df.close() + fd.write('%s\n' % line) + fd.close() + copy2(filename, self.file_name) + remove(filename) except: success = False + log.error('Unable to save the config file.', exc_info=True) else: success = True return success @@ -333,3 +344,5 @@ else: # it needs to be after logger configuration from common import safeJID +log = logging.getLogger(__name__) +