From 000220ddc7831853d8e708cc0c5b5980350f3b23 Mon Sep 17 00:00:00 2001 From: timeshifter Date: Sat, 4 Dec 2021 22:38:29 +0100 Subject: [PATCH] chg: confirm new datasets before doing anything --- zfs-backup.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/zfs-backup.py b/zfs-backup.py index 0902ffb..9b69d42 100755 --- a/zfs-backup.py +++ b/zfs-backup.py @@ -48,6 +48,8 @@ def main(): class Manager: + _map_type: dict[Dataset, Dataset | None] + def __init__(self, local_pool: Pool, external_pool: ExternalPool): self._local_pool = local_pool self._external_pool = external_pool @@ -64,18 +66,30 @@ class Manager: def _backup_all_datasets(self): print("Backing up datasets") - for local_dataset in self._datasets_to_backup: - remote_dataset = self._search_matching_dataset_in_remote_pool( + for local_dataset, remote_dataset in self._get_dataset_backup_map().items(): + if remote_dataset is None: + stream = self._send_absolute(local_dataset) + else: + stream = self._send_incremental(local_dataset, remote_dataset) + ZFS.receive(stream, self._external_pool) + + def _get_dataset_backup_map(self) -> _map_type: + return self._user_confirm_new_datasets(self._get_raw_dataset_map()) + + def _user_confirm_new_datasets(self, dataset_map: _map_type) -> _map_type: + return { + local_dataset: remote_dataset + for local_dataset, remote_dataset in dataset_map.items() + if remote_dataset is not None or self._ask_user_confirmation(local_dataset) + } + + def _get_raw_dataset_map(self) -> _map_type: + return { + local_dataset: self._search_matching_dataset_in_remote_pool( local_dataset, self._external_pool ) - if remote_dataset: - stream = self._send_incremental(local_dataset, remote_dataset) - else: - if self._ask_user_confirmation(local_dataset): - stream = self._send_absolute(local_dataset) - else: - continue - ZFS.receive(stream, self._external_pool) + for local_dataset in self._datasets_to_backup + } def _send_incremental( self, local_dataset: Dataset, remote_dataset: Dataset @@ -395,6 +409,7 @@ class ZFS(CommandInterface): @classmethod def send_absolute(cls, snapshot: Snapshot) -> Popen: + print(f" {snapshot} -> [new]") return cls._open_stream(*cls._Subcommands.Send.absolute, str(snapshot))