From 3c0a26eaa814d2b82c18ea13a76973bc97cdada0 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 16 Feb 2021 17:17:09 +0100 Subject: [PATCH] prevent file corruption during json.dump --- owrx/bookmarks.py | 4 +++- owrx/config/dynamic.py | 4 +++- owrx/users.py | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/owrx/bookmarks.py b/owrx/bookmarks.py index d8a9a2b..e2a56cb 100644 --- a/owrx/bookmarks.py +++ b/owrx/bookmarks.py @@ -93,8 +93,10 @@ class Bookmarks(object): return "{data_directory}/bookmarks.json".format(data_directory=coreConfig.get_data_directory()) def store(self): + # don't write directly to file to avoid corruption on exceptions + jsonContent = json.dumps([b.__dict__() for b in self.bookmarks], indent=4) with open(Bookmarks._getBookmarksFile(), "w") as file: - json.dump([b.__dict__() for b in self.bookmarks], file, indent=4) + file.write(jsonContent) self.file_modified = self._getFileModifiedTimestamp() def addBookmark(self, bookmark: Bookmark): diff --git a/owrx/config/dynamic.py b/owrx/config/dynamic.py index 72f73fd..30deae8 100644 --- a/owrx/config/dynamic.py +++ b/owrx/config/dynamic.py @@ -21,5 +21,7 @@ class DynamicConfig(PropertyLayer): return "{data_directory}/settings.json".format(data_directory=coreConfig.get_data_directory()) def store(self): + # don't write directly to file to avoid corruption on exceptions + jsonContent = json.dumps(self.__dict__(), indent=4) with open(DynamicConfig._getSettingsFile(), "w") as file: - json.dump(self.__dict__(), file, indent=4) + file.write(jsonContent) diff --git a/owrx/users.py b/owrx/users.py index 2f2e88d..0fc5c0c 100644 --- a/owrx/users.py +++ b/owrx/users.py @@ -185,8 +185,10 @@ class UserList(object): usersFile = self._getUsersFile() users = [u.toJson() for u in self.values()] try: + # don't write directly to file to avoid corruption on exceptions + jsonContent = json.dumps(users, indent=4) with open(usersFile, "w") as f: - json.dump(users, f, indent=4) + f.write(jsonContent) except Exception: logger.exception("error while writing users file %s", usersFile) self.refresh()