mirror of
https://github.com/netinvent/npbackup.git
synced 2025-12-17 13:41:02 +08:00
GUI: Add --no-lock when running viewer, see #155
This commit is contained in:
parent
2aae9d179a
commit
004423fb30
6 changed files with 49 additions and 2 deletions
|
|
@ -282,6 +282,11 @@ This is free software, and you are welcome to redistribute it under certain cond
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="Run operations without cache",
|
help="Run operations without cache",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--no-lock",
|
||||||
|
action="store_true",
|
||||||
|
help="Run operations without lock",
|
||||||
|
)
|
||||||
parser.add_argument("--license", action="store_true", help="Show license")
|
parser.add_argument("--license", action="store_true", help="Show license")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--auto-upgrade", action="store_true", help="Auto upgrade NPBackup"
|
"--auto-upgrade", action="store_true", help="Auto upgrade NPBackup"
|
||||||
|
|
@ -605,6 +610,7 @@ This is free software, and you are welcome to redistribute it under certain cond
|
||||||
"json_output": args.json,
|
"json_output": args.json,
|
||||||
"backend_binary": backend_binary,
|
"backend_binary": backend_binary,
|
||||||
"no_cache": args.no_cache,
|
"no_cache": args.no_cache,
|
||||||
|
"no_lock": args.no_lock,
|
||||||
"operation": None,
|
"operation": None,
|
||||||
"op_args": {},
|
"op_args": {},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -271,6 +271,7 @@ class NPBackupRunner:
|
||||||
self._struct_output = False
|
self._struct_output = False
|
||||||
self._binary = None
|
self._binary = None
|
||||||
self._no_cache = False
|
self._no_cache = False
|
||||||
|
self._no_lock = False
|
||||||
self.restic_runner = None
|
self.restic_runner = None
|
||||||
self.minimum_backup_age = None
|
self.minimum_backup_age = None
|
||||||
self._exec_time = None
|
self._exec_time = None
|
||||||
|
|
@ -324,6 +325,17 @@ class NPBackupRunner:
|
||||||
self.write_logs(msg, level="critical", raise_error="ValueError")
|
self.write_logs(msg, level="critical", raise_error="ValueError")
|
||||||
self._no_cache = value
|
self._no_cache = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def no_lock(self) -> bool:
|
||||||
|
return self._no_lock
|
||||||
|
|
||||||
|
@no_lock.setter
|
||||||
|
def no_lock(self, value: bool):
|
||||||
|
if not isinstance(value, bool):
|
||||||
|
msg = f"Bogus no_lock parameter given: {value}"
|
||||||
|
self.write_logs(msg, level="critical", raise_error="ValueError")
|
||||||
|
self._no_lock = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def verbose(self):
|
def verbose(self):
|
||||||
return self._verbose
|
return self._verbose
|
||||||
|
|
@ -957,6 +969,7 @@ class NPBackupRunner:
|
||||||
self.restic_runner.verbose = self.verbose
|
self.restic_runner.verbose = self.verbose
|
||||||
self.restic_runner.dry_run = self.dry_run
|
self.restic_runner.dry_run = self.dry_run
|
||||||
self.restic_runner.no_cache = self.no_cache
|
self.restic_runner.no_cache = self.no_cache
|
||||||
|
self.restic_runner.no_lock = self.no_lock
|
||||||
self.restic_runner.live_output = self.live_output
|
self.restic_runner.live_output = self.live_output
|
||||||
self.restic_runner.json_output = self.json_output
|
self.restic_runner.json_output = self.json_output
|
||||||
self.restic_runner.struct_output = self.struct_output
|
self.restic_runner.struct_output = self.struct_output
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ from npbackup.restic_wrapper import schema
|
||||||
|
|
||||||
logger = getLogger()
|
logger = getLogger()
|
||||||
backend_binary = None
|
backend_binary = None
|
||||||
|
__no_lock = False
|
||||||
|
|
||||||
# This bool allows to not show errors on freshly configured repos or first runs, when repo isn't initialized yet
|
# This bool allows to not show errors on freshly configured repos or first runs, when repo isn't initialized yet
|
||||||
# Also prevents showing errors when config was just changed
|
# Also prevents showing errors when config was just changed
|
||||||
|
|
@ -334,6 +335,7 @@ def ls_window(parent_window: sg.Window, repo_config: dict, snapshot_id: str) ->
|
||||||
__autoclose=True,
|
__autoclose=True,
|
||||||
__compact=True,
|
__compact=True,
|
||||||
__backend_binary=backend_binary,
|
__backend_binary=backend_binary,
|
||||||
|
__no_lock=__no_lock,
|
||||||
)
|
)
|
||||||
if not result or not result["result"]:
|
if not result or not result["result"]:
|
||||||
sg.Popup(_t("main_gui.snapshot_is_empty"))
|
sg.Popup(_t("main_gui.snapshot_is_empty"))
|
||||||
|
|
@ -463,6 +465,7 @@ def restore_window(
|
||||||
restore_includes=restore_includes,
|
restore_includes=restore_includes,
|
||||||
__backend_binary=backend_binary,
|
__backend_binary=backend_binary,
|
||||||
__autoclose=True,
|
__autoclose=True,
|
||||||
|
__no_lock=__no_lock,
|
||||||
)
|
)
|
||||||
return result["result"]
|
return result["result"]
|
||||||
|
|
||||||
|
|
@ -515,6 +518,7 @@ def backup(repo_config: dict) -> bool:
|
||||||
__compact=False,
|
__compact=False,
|
||||||
__gui_msg=gui_msg,
|
__gui_msg=gui_msg,
|
||||||
__backend_binary=backend_binary,
|
__backend_binary=backend_binary,
|
||||||
|
__no_lock=__no_lock,
|
||||||
)
|
)
|
||||||
return result["result"]
|
return result["result"]
|
||||||
|
|
||||||
|
|
@ -530,6 +534,7 @@ def forget_snapshot(repo_config: dict, snapshot_ids: List[str]) -> bool:
|
||||||
__gui_msg=gui_msg,
|
__gui_msg=gui_msg,
|
||||||
__autoclose=True,
|
__autoclose=True,
|
||||||
__backend_binary=backend_binary,
|
__backend_binary=backend_binary,
|
||||||
|
__no_lock=__no_lock,
|
||||||
)
|
)
|
||||||
return result["result"]
|
return result["result"]
|
||||||
|
|
||||||
|
|
@ -537,6 +542,7 @@ def forget_snapshot(repo_config: dict, snapshot_ids: List[str]) -> bool:
|
||||||
def _main_gui(viewer_mode: bool):
|
def _main_gui(viewer_mode: bool):
|
||||||
global logger
|
global logger
|
||||||
global backend_binary
|
global backend_binary
|
||||||
|
global __no_lock
|
||||||
global GUI_STATUS_IGNORE_ERRORS
|
global GUI_STATUS_IGNORE_ERRORS
|
||||||
|
|
||||||
def check_for_auto_upgrade(config_file: str, full_config: dict) -> bool:
|
def check_for_auto_upgrade(config_file: str, full_config: dict) -> bool:
|
||||||
|
|
@ -645,6 +651,7 @@ def _main_gui(viewer_mode: bool):
|
||||||
__compact=True,
|
__compact=True,
|
||||||
__backend_binary=backend_binary,
|
__backend_binary=backend_binary,
|
||||||
__ignore_errors=GUI_STATUS_IGNORE_ERRORS,
|
__ignore_errors=GUI_STATUS_IGNORE_ERRORS,
|
||||||
|
__no_lock=__no_lock,
|
||||||
)
|
)
|
||||||
GUI_STATUS_IGNORE_ERRORS = False
|
GUI_STATUS_IGNORE_ERRORS = False
|
||||||
try:
|
try:
|
||||||
|
|
@ -879,6 +886,9 @@ def _main_gui(viewer_mode: bool):
|
||||||
sg.PopupError(msg, keep_on_top=True)
|
sg.PopupError(msg, keep_on_top=True)
|
||||||
sys.exit(73)
|
sys.exit(73)
|
||||||
|
|
||||||
|
if viewer_mode:
|
||||||
|
__no_lock = True
|
||||||
|
|
||||||
# Let's try to read standard restic repository env variables
|
# Let's try to read standard restic repository env variables
|
||||||
viewer_repo_uri = os.environ.get("RESTIC_REPOSITORY", None)
|
viewer_repo_uri = os.environ.get("RESTIC_REPOSITORY", None)
|
||||||
viewer_repo_password = os.environ.get("RESTIC_PASSWORD", None)
|
viewer_repo_password = os.environ.get("RESTIC_PASSWORD", None)
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ def gui_thread_runner(
|
||||||
__stdout: bool = True,
|
__stdout: bool = True,
|
||||||
__backend_binary: str = None,
|
__backend_binary: str = None,
|
||||||
__ignore_errors: bool = False,
|
__ignore_errors: bool = False,
|
||||||
|
__no_lock: bool = False,
|
||||||
*args,
|
*args,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
) -> Union[dict, str]:
|
) -> Union[dict, str]:
|
||||||
|
|
@ -126,6 +127,8 @@ def gui_thread_runner(
|
||||||
if __ignore_errors:
|
if __ignore_errors:
|
||||||
runner.produce_metrics = False
|
runner.produce_metrics = False
|
||||||
|
|
||||||
|
runner.no_lock = __no_lock
|
||||||
|
|
||||||
# We'll always use json output in GUI mode
|
# We'll always use json output in GUI mode
|
||||||
runner.json_output = True
|
runner.json_output = True
|
||||||
# in GUI mode, we'll use struct output instead of json whenever it's possible
|
# in GUI mode, we'll use struct output instead of json whenever it's possible
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ __intname__ = "npbackup.restic_wrapper"
|
||||||
__author__ = "Orsiris de Jong"
|
__author__ = "Orsiris de Jong"
|
||||||
__copyright__ = "Copyright (C) 2022-2025 NetInvent"
|
__copyright__ = "Copyright (C) 2022-2025 NetInvent"
|
||||||
__license__ = "GPL-3.0-only"
|
__license__ = "GPL-3.0-only"
|
||||||
__build__ = "2025041001"
|
__build__ = "2025041601"
|
||||||
__version__ = "2.6.0"
|
__version__ = "2.6.1"
|
||||||
|
|
||||||
|
|
||||||
from typing import Tuple, List, Optional, Callable, Union
|
from typing import Tuple, List, Optional, Callable, Union
|
||||||
|
|
@ -75,6 +75,7 @@ class ResticRunner:
|
||||||
self._live_output = False
|
self._live_output = False
|
||||||
self._dry_run = False
|
self._dry_run = False
|
||||||
self._no_cache = False
|
self._no_cache = False
|
||||||
|
self._no_lock = False
|
||||||
self._json_output = False
|
self._json_output = False
|
||||||
self._struct_output = False
|
self._struct_output = False
|
||||||
|
|
||||||
|
|
@ -251,6 +252,17 @@ class ResticRunner:
|
||||||
else:
|
else:
|
||||||
raise ValueError("Bogus no_cache value given")
|
raise ValueError("Bogus no_cache value given")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def no_lock(self) -> bool:
|
||||||
|
return self._no_lock
|
||||||
|
|
||||||
|
@no_lock.setter
|
||||||
|
def no_lock(self, value: bool):
|
||||||
|
if isinstance(value, bool):
|
||||||
|
self._no_lock = value
|
||||||
|
else:
|
||||||
|
raise ValueError("Bogus no_lock value given")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def json_output(self) -> bool:
|
def json_output(self) -> bool:
|
||||||
return self._json_output
|
return self._json_output
|
||||||
|
|
@ -653,6 +665,8 @@ class ResticRunner:
|
||||||
args += " --json"
|
args += " --json"
|
||||||
if self.no_cache:
|
if self.no_cache:
|
||||||
args += " --no-cache"
|
args += " --no-cache"
|
||||||
|
if self.no_lock:
|
||||||
|
args += " --no-lock"
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def init(
|
def init(
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ def entrypoint(*args, **kwargs):
|
||||||
npbackup_runner.live_output = not json_output
|
npbackup_runner.live_output = not json_output
|
||||||
npbackup_runner.json_output = json_output
|
npbackup_runner.json_output = json_output
|
||||||
npbackup_runner.no_cache = kwargs.pop("no_cache", False)
|
npbackup_runner.no_cache = kwargs.pop("no_cache", False)
|
||||||
|
npbackup_runner.no_lock = kwargs.pop("no_lock", False)
|
||||||
if backend_binary:
|
if backend_binary:
|
||||||
npbackup_runner.binary = backend_binary
|
npbackup_runner.binary = backend_binary
|
||||||
result = npbackup_runner.__getattribute__(operation)(
|
result = npbackup_runner.__getattribute__(operation)(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue