From e4356cb5167e4daca917ad13d4f8095f82cfd704 Mon Sep 17 00:00:00 2001 From: Edwin Eefting Date: Wed, 23 Feb 2022 18:36:03 +0100 Subject: [PATCH] Added -F (--force) to allow 1:1 replication. --- zfs_autobackup/ZfsAutobackup.py | 6 ++++-- zfs_autobackup/ZfsDataset.py | 15 ++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/zfs_autobackup/ZfsAutobackup.py b/zfs_autobackup/ZfsAutobackup.py index 061f42a..3eea16d 100644 --- a/zfs_autobackup/ZfsAutobackup.py +++ b/zfs_autobackup/ZfsAutobackup.py @@ -14,7 +14,7 @@ import os.path class ZfsAutobackup: """main class""" - VERSION = "3.1.2-rc1" + VERSION = "3.1.2-rc2" HEADER = "zfs-autobackup v{} - (c)2021 E.H.Eefting (edwin@datux.nl)".format(VERSION) def __init__(self, argv, print_arguments=True): @@ -87,6 +87,8 @@ class ZfsAutobackup: parser.add_argument('--rollback', action='store_true', help='Rollback changes to the latest target snapshot before starting. (normally you can ' 'prevent changes by setting the readonly property on the target_path to on)') + parser.add_argument('--force', '-F', action='store_true', + help='Use zfs -F option to force overwrite/rollback. (Usefull with --strip-path=1, but use with care)') parser.add_argument('--destroy-incompatible', action='store_true', help='Destroy incompatible snapshots on target. Use with care! (implies --rollback)') parser.add_argument('--destroy-missing', metavar="SCHEDULE", type=str, default=None, @@ -438,7 +440,7 @@ class ZfsAutobackup: destroy_incompatible=self.args.destroy_incompatible, send_pipes=send_pipes, recv_pipes=recv_pipes, decrypt=self.args.decrypt, encrypt=self.args.encrypt, - zfs_compressed=self.args.zfs_compressed) + zfs_compressed=self.args.zfs_compressed, force=self.args.force) except Exception as e: fail_count = fail_count + 1 source_dataset.error("FAILED: " + str(e)) diff --git a/zfs_autobackup/ZfsDataset.py b/zfs_autobackup/ZfsDataset.py index 394fcfa..a08fa9f 100644 --- a/zfs_autobackup/ZfsDataset.py +++ b/zfs_autobackup/ZfsDataset.py @@ -585,7 +585,7 @@ class ZfsDataset: return output_pipe - def recv_pipe(self, pipe, features, recv_pipes, filter_properties=None, set_properties=None, ignore_exit_code=False): + def recv_pipe(self, pipe, features, recv_pipes, filter_properties=None, set_properties=None, ignore_exit_code=False, force=False): """starts a zfs recv for this snapshot and uses pipe as input note: you can it both on a snapshot or filesystem object. The @@ -626,6 +626,9 @@ class ZfsDataset: # verbose output cmd.append("-v") + if force: + cmd.append("-F") + if 'extensible_dataset' in features and "-s" in self.zfs_node.supported_recv_options: # support resuming self.debug("Enabled resume support") @@ -656,7 +659,7 @@ class ZfsDataset: def transfer_snapshot(self, target_snapshot, features, prev_snapshot, show_progress, filter_properties, set_properties, ignore_recv_exit_code, resume_token, - raw, send_properties, write_embedded, send_pipes, recv_pipes, zfs_compressed): + raw, send_properties, write_embedded, send_pipes, recv_pipes, zfs_compressed, force): """transfer this snapshot to target_snapshot. specify prev_snapshot for incremental transfer @@ -697,7 +700,7 @@ class ZfsDataset: pipe = self.send_pipe(features=features, show_progress=show_progress, prev_snapshot=prev_snapshot, resume_token=resume_token, raw=raw, send_properties=send_properties, write_embedded=write_embedded, send_pipes=send_pipes, zfs_compressed=zfs_compressed) target_snapshot.recv_pipe(pipe, features=features, filter_properties=filter_properties, - set_properties=set_properties, ignore_exit_code=ignore_recv_exit_code, recv_pipes=recv_pipes) + set_properties=set_properties, ignore_exit_code=ignore_recv_exit_code, recv_pipes=recv_pipes, force=force) def abort_resume(self): """abort current resume state""" @@ -994,7 +997,7 @@ class ZfsDataset: def sync_snapshots(self, target_dataset, features, show_progress, filter_properties, set_properties, ignore_recv_exit_code, holds, rollback, decrypt, encrypt, also_other_snapshots, - no_send, destroy_incompatible, send_pipes, recv_pipes, zfs_compressed): + no_send, destroy_incompatible, send_pipes, recv_pipes, zfs_compressed, force): """sync this dataset's snapshots to target_dataset, while also thinning out old snapshots along the way. @@ -1079,7 +1082,9 @@ class ZfsDataset: filter_properties=active_filter_properties, set_properties=active_set_properties, ignore_recv_exit_code=ignore_recv_exit_code, - resume_token=resume_token, write_embedded=write_embedded, raw=raw, send_properties=send_properties, send_pipes=send_pipes, recv_pipes=recv_pipes, zfs_compressed=zfs_compressed) + resume_token=resume_token, write_embedded=write_embedded, raw=raw, + send_properties=send_properties, send_pipes=send_pipes, + recv_pipes=recv_pipes, zfs_compressed=zfs_compressed, force=force) resume_token = None