diff --git a/npbackup/core/runner.py b/npbackup/core/runner.py index 14f0d6f..97fde40 100644 --- a/npbackup/core/runner.py +++ b/npbackup/core/runner.py @@ -466,9 +466,9 @@ class NPBackupRunner: with pidfile.PIDFile(pid_file): # pylint: disable=E1102 (not-callable) result = fn(self, *args, **kwargs) - except pidfile.AlreadyRunningError: + except pidfile.AlreadyRunningError as exc: self.write_logs( - f"There is already an {operation} operation running by NPBackup. Will not continue", + f"There is already an {operation} operation running by NPBackup: {exc}. Will not continue", level="critical", ) return False @@ -827,8 +827,11 @@ class NPBackupRunner: ) # Temporarily disable verbose and enable json result self.restic_runner.verbose = False + # Temporarily disable CLI live output which we don't really need here + self.restic_runner.live_output = False data = self.restic_runner.has_recent_snapshot(self.minimum_backup_age) self.restic_runner.verbose = self.verbose + self.restic_runner.live_output = self.live_output if self.json_output: return data diff --git a/npbackup/restic_wrapper/__init__.py b/npbackup/restic_wrapper/__init__.py index e99eaac..e070ce3 100644 --- a/npbackup/restic_wrapper/__init__.py +++ b/npbackup/restic_wrapper/__init__.py @@ -543,9 +543,14 @@ class ResticRunner: We'll just check if snapshots can be read """ cmd = "snapshots" + + # Disable live output for this check + live_output = self.live_output + self.live_output = False self._is_init, output = self.executor( cmd, timeout=FAST_COMMANDS_TIMEOUT, errors_allowed=True ) + self.live_output = live_output if not self._is_init: self.write_logs(output, level="error") return self._is_init diff --git a/npbackup/runner_interface.py b/npbackup/runner_interface.py index dbfb3eb..0acf6e7 100644 --- a/npbackup/runner_interface.py +++ b/npbackup/runner_interface.py @@ -34,7 +34,7 @@ def serialize_datetime(obj): def entrypoint(*args, **kwargs): json_output = kwargs.pop("json_output") - + npbackup_runner = NPBackupRunner() npbackup_runner.repo_config = kwargs.pop("repo_config") npbackup_runner.dry_run = kwargs.pop("dry_run") @@ -46,7 +46,16 @@ def entrypoint(*args, **kwargs): ) if not json_output: if not isinstance(result, bool): - logger.info(f"{result}") + + # We need to temprarily remove the stdout handler + # Since we already get live output from the runner + # But we still need to log the result to our logfile + for handler in logger.handlers: + if handler.stream == sys.stdout: + logger.removeHandler(handler) + break + logger.info(f"\n{result}") + logger.addHandler(handler) logger.info(f"Operation finished with {'success' if result else 'failure'}") else: print(json.dumps(result, default=serialize_datetime))