diff --git a/borgmatic/commands/borgmatic.py b/borgmatic/commands/borgmatic.py index 18be8069..cc21fc11 100644 --- a/borgmatic/commands/borgmatic.py +++ b/borgmatic/commands/borgmatic.py @@ -42,56 +42,60 @@ def run_configuration(config_filename, config, arguments): * JSON output strings from successfully executing any actions that produce JSON * logging.LogRecord instances containing errors from any actions or backup hooks that fail ''' + (location, storage, retention, consistency, hooks) = ( config.get(section_name, {}) for section_name in ('location', 'storage', 'retention', 'consistency', 'hooks') ) global_arguments = arguments['global'] - if location.get("lock_client",False): - lock_f = open(config_filename) - try: - fcntl.flock(lock_f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError: - logger.critical("Failed to acquire lock for {}".format(config_filename)) - sys.exit(1) - local_path = location.get('local_path', 'borg') remote_path = location.get('remote_path') borg_environment.initialize(storage) encountered_error = None error_repository = '' - if 'create' in arguments: + if location.get("lock_client",False): + lock_f = open(config_filename) try: - dispatch.call_hooks( - 'ping_monitor', - hooks, - config_filename, - monitor.MONITOR_HOOK_NAMES, - monitor.State.START, - global_arguments.dry_run, - ) - command.execute_hook( - hooks.get('before_backup'), - hooks.get('umask'), - config_filename, - 'pre-backup', - global_arguments.dry_run, - ) - dispatch.call_hooks( - 'dump_databases', - hooks, - config_filename, - dump.DATABASE_HOOK_NAMES, - global_arguments.dry_run, - ) - except (OSError, CalledProcessError) as error: + fcntl.flock(lock_f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) + except IOError as error: encountered_error = error yield from make_error_log_records( - '{}: Error running pre-backup hook'.format(config_filename), error + '{}: Failed to acquire lock'.format(config_filename), error ) + if not encountered_error: + if 'create' in arguments: + try: + dispatch.call_hooks( + 'ping_monitor', + hooks, + config_filename, + monitor.MONITOR_HOOK_NAMES, + monitor.State.START, + global_arguments.dry_run, + ) + command.execute_hook( + hooks.get('before_backup'), + hooks.get('umask'), + config_filename, + 'pre-backup', + global_arguments.dry_run, + ) + dispatch.call_hooks( + 'dump_databases', + hooks, + config_filename, + dump.DATABASE_HOOK_NAMES, + global_arguments.dry_run, + ) + except (OSError, CalledProcessError) as error: + encountered_error = error + yield from make_error_log_records( + '{}: Error running pre-backup hook'.format(config_filename), error + ) + if not encountered_error: for repository_path in location['repositories']: try: