From ae44604334f15b9d369a69ba2be48dba0ee9b66b Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 09:52:56 +0200 Subject: [PATCH 1/7] catch corrupted influxdb_credentials.json --- linien-common/linien_common/influxdb.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/linien-common/linien_common/influxdb.py b/linien-common/linien_common/influxdb.py index 8e837dfb..4451a202 100644 --- a/linien-common/linien_common/influxdb.py +++ b/linien-common/linien_common/influxdb.py @@ -69,3 +69,20 @@ def restore_credentials() -> InfluxDBCredentials: ) except FileNotFoundError: return InfluxDBCredentials() + except json.JSONDecodeError: + # get a unice filename + i = 0 + while True: + backup_filename = ( + filename.parent / f"{CREDENTIAL_STORE_FILENAME.stem}.backup{i}" + ) + if not backup_filename.exists(): + break + i += 1 + + filename.rename(backup_filename) + logger.error( + f"{filename} was corrupted. Using default parameters. Corrupted file has " + f"been saved as {backup_filename}." + ) + return InfluxDBCredentials() From 134f5caccb5180fdc429836976ede8b69e73929a Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 09:53:34 +0200 Subject: [PATCH 2/7] fix filename creation --- linien-common/linien_common/influxdb.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/linien-common/linien_common/influxdb.py b/linien-common/linien_common/influxdb.py index 4451a202..778b00d6 100644 --- a/linien-common/linien_common/influxdb.py +++ b/linien-common/linien_common/influxdb.py @@ -73,9 +73,7 @@ def restore_credentials() -> InfluxDBCredentials: # get a unice filename i = 0 while True: - backup_filename = ( - filename.parent / f"{CREDENTIAL_STORE_FILENAME.stem}.backup{i}" - ) + backup_filename = filename.parent / f"{CREDENTIAL_STORE_FILENAME}.backup{i}" if not backup_filename.exists(): break i += 1 From 0b9224a4174f40463b1b8edc8b0c027e92f315f8 Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 10:05:34 +0200 Subject: [PATCH 3/7] move backup creation to own function --- linien-common/linien_common/config.py | 18 +++++++++++++++++- linien-common/linien_common/influxdb.py | 16 ++-------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/linien-common/linien_common/config.py b/linien-common/linien_common/config.py index 7e3fbc9a..0728aff5 100644 --- a/linien-common/linien_common/config.py +++ b/linien-common/linien_common/config.py @@ -15,11 +15,14 @@ # # You should have received a copy of the GNU General Public License # along with Linien. If not, see . - +import logging from pathlib import Path from appdirs import AppDirs +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + ACQUISITION_PORT = 19321 SERVER_PORT = 18862 DEFAULT_SWEEP_SPEED = (125 * 2048) << 6 @@ -29,3 +32,16 @@ LOG_FILE_PATH = USER_DATA_PATH / "linien.log" LOG_FILE_PATH.parent.mkdir(parents=True, exist_ok=True) + + +def create_backup_file(filename: Path) -> None: + """Rename the file to a unique filename.""" + i = 0 + while True: + backup_filename = filename.parent / f"{filename.stem}.backup{i}" + if not backup_filename.exists(): + break + i += 1 + + filename.rename(backup_filename) + logger.info(f"{filename} has been saved as {backup_filename}.") diff --git a/linien-common/linien_common/influxdb.py b/linien-common/linien_common/influxdb.py index 778b00d6..1d95a20d 100644 --- a/linien-common/linien_common/influxdb.py +++ b/linien-common/linien_common/influxdb.py @@ -19,7 +19,7 @@ import logging from dataclasses import dataclass -from .config import USER_DATA_PATH +from .config import USER_DATA_PATH, create_backup_file CREDENTIAL_STORE_FILENAME = "influxdb_credentials.json" @@ -70,17 +70,5 @@ def restore_credentials() -> InfluxDBCredentials: except FileNotFoundError: return InfluxDBCredentials() except json.JSONDecodeError: - # get a unice filename - i = 0 - while True: - backup_filename = filename.parent / f"{CREDENTIAL_STORE_FILENAME}.backup{i}" - if not backup_filename.exists(): - break - i += 1 - - filename.rename(backup_filename) - logger.error( - f"{filename} was corrupted. Using default parameters. Corrupted file has " - f"been saved as {backup_filename}." - ) + create_backup_file(filename) return InfluxDBCredentials() From fe652531896173775ada7496e32f736b13fc4ebf Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 10:14:56 +0200 Subject: [PATCH 4/7] handle corrupted settings and parameter files --- linien-common/linien_common/influxdb.py | 1 + linien-gui/linien_gui/config.py | 13 ++++++++----- linien-server/linien_server/parameters.py | 7 ++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/linien-common/linien_common/influxdb.py b/linien-common/linien_common/influxdb.py index 1d95a20d..24557af6 100644 --- a/linien-common/linien_common/influxdb.py +++ b/linien-common/linien_common/influxdb.py @@ -70,5 +70,6 @@ def restore_credentials() -> InfluxDBCredentials: except FileNotFoundError: return InfluxDBCredentials() except json.JSONDecodeError: + logger.error(f"Credentials file {filename} was corrupted.") create_backup_file(filename) return InfluxDBCredentials() diff --git a/linien-gui/linien_gui/config.py b/linien-gui/linien_gui/config.py index a620cd72..d41dd7f8 100644 --- a/linien-gui/linien_gui/config.py +++ b/linien-gui/linien_gui/config.py @@ -23,13 +23,13 @@ from pathlib import Path from typing import Callable, Iterator, Tuple -from linien_common.config import USER_DATA_PATH +from linien_common.config import USER_DATA_PATH, create_backup_file logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) UI_PATH = Path(__file__).parents[0].resolve() / "ui" - +SETTINGS_STORE_FILENAME = "settings.json" # don't plot more often than once per `DEFAULT_PLOT_RATE_LIMIT` seconds DEFAULT_PLOT_RATE_LIMIT = 0.1 @@ -118,19 +118,22 @@ def __iter__(self) -> Iterator[Tuple[str, Setting]]: def save_settings(settings: Settings) -> None: data = {name: setting.value for name, setting in settings} - with open(USER_DATA_PATH / "settings.json", "w") as f: + with open(USER_DATA_PATH / SETTINGS_STORE_FILENAME, "w") as f: json.dump(data, f, indent=0) def load_settings() -> Settings: settings = Settings() + filename = USER_DATA_PATH / SETTINGS_STORE_FILENAME try: - with open(USER_DATA_PATH / "settings.json", "r") as f: + with open(filename, "r") as f: data = json.load(f) for name, value in data.items(): if name in settings.__dict__: getattr(settings, name).value = value except FileNotFoundError: save_settings(settings) - + except json.JSONDecodeError: + logger.error(f"Settings file {filename} was corrupted.") + create_backup_file(filename) return settings diff --git a/linien-server/linien_server/parameters.py b/linien-server/linien_server/parameters.py index 063d8fad..a929fec6 100644 --- a/linien-server/linien_server/parameters.py +++ b/linien-server/linien_server/parameters.py @@ -24,7 +24,8 @@ import linien_server from linien_common.common import AutolockMode, MHz, PSDAlgorithm, Vpp -from linien_common.config import USER_DATA_PATH + +from .config import USER_DATA_PATH, create_backup_file PARAMETER_STORE_FILENAME = "parameters.json" @@ -667,6 +668,10 @@ def restore_parameters(parameters: Parameters) -> Parameters: except FileNotFoundError: logger.info(f"Couldn't find {filename}. Using default parameters.") return parameters + except json.JSONDecodeError: + logger.error(f"Parameters file {filename} was corrupted.") + create_backup_file(filename) + return parameters for name, attributes in data["parameters"].items(): try: From 24ee2a4d2a9fbb4cc8710b28f08d0d33ec488c7d Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 10:16:13 +0200 Subject: [PATCH 5/7] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1738ee24..2af394ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +* Handle corrupted json files by @bleykauf in https://github.com/linien-org/linien/pull/398 + ## [2.0.2] - 2024-05-14 ### Fixed From 92526f0c8dbda486d4a105ba917b67707165fddd Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 10:26:47 +0200 Subject: [PATCH 6/7] fix changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2af394ca..6336285a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -### Fixed -* Handle corrupted json files by @bleykauf in https://github.com/linien-org/linien/pull/398 +### Added +* Handle corrupted json files by @bleykauf in https://github.com/linien-org/linien/pull/399 ## [2.0.2] - 2024-05-14 From b6f9ec42d3bcf0fc6d420cff928dd786dcdea093 Mon Sep 17 00:00:00 2001 From: Bastian Leykauf Date: Wed, 15 May 2024 10:29:23 +0200 Subject: [PATCH 7/7] fix import --- linien-server/linien_server/parameters.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/linien-server/linien_server/parameters.py b/linien-server/linien_server/parameters.py index a929fec6..4364b54f 100644 --- a/linien-server/linien_server/parameters.py +++ b/linien-server/linien_server/parameters.py @@ -24,8 +24,7 @@ import linien_server from linien_common.common import AutolockMode, MHz, PSDAlgorithm, Vpp - -from .config import USER_DATA_PATH, create_backup_file +from linien_common.config import USER_DATA_PATH, create_backup_file PARAMETER_STORE_FILENAME = "parameters.json"