Skip to content

Commit f0b9ff1

Browse files
committed
snapborg can backup snapshots to multiple repos using snapborg_id
1 parent a68191a commit f0b9ff1

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

snapborg/commands/snapborg.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,20 @@ def main():
9191
def list_snapshots(cfg, configs):
9292
print("Listing snapper snapshots:")
9393
for config in configs:
94+
borg_repo = BorgRepo.create_from_config(config)
9495
snapper_config = SnapperConfig.get(config["name"])
9596
print(f"\tConfig {snapper_config.name} for subvol {snapper_config.get_path()}:")
9697
snapshots = snapper_config.get_snapshots()
98+
repo_snapshot_ids = borg_repo.list_backup_ids()
9799
for s in snapshots:
98100
print(
99-
f"\t\tSnapshot {s.get_number()} from {s.get_date()} is backed up: {s.is_backed_up()}")
101+
"\t\tBorg repo {} has backup of snapshot {} from {}: {}".format(
102+
config["name"],
103+
s.get_number(),
104+
s.get_date(),
105+
s.get_snapborg_id() in repo_snapshot_ids,
106+
)
107+
)
100108

101109

102110
def get_configs(cfg, config_arg=None):
@@ -174,11 +182,13 @@ def backup_config(config, recreate, dryrun):
174182
repo = BorgRepo.create_from_config(config)
175183
# now determine which snapshots need to be backed up
176184
retention_config = repo.get_retention_config()
185+
backed_up_snapshot_ids = {b for b in repo.list_backup_ids()}
177186
candidates = [
178187
snapshot
179188
for snapshot in get_retained_snapshots(
180-
snapshots, lambda s: s.get_date(),
181-
**retention_config) if(not snapshot.is_backed_up() or recreate)
189+
snapshots, lambda s: s.get_date(), **retention_config
190+
)
191+
if snapshot.get_snapborg_id() not in backed_up_snapshot_ids and not recreate
182192
]
183193

184194
with snapper_config.prevent_cleanup(snapshots=candidates, dryrun=dryrun):
@@ -191,10 +201,11 @@ def backup_config(config, recreate, dryrun):
191201
if has_error and not config["fault_tolerant_mode"]:
192202
raise Exception(f"Error(s) while transferring backups for {snapper_config.name}!")
193203

204+
repo_snapshot_ids = repo.list_backup_ids()
194205
if config["last_backup_max_age"].total_seconds() > 0:
195206
# fail if the creation date of the newest snapshot successfully backed up is too old
196207
snapshots = snapper_config.get_snapshots()
197-
backed_up = [ s for s in snapshots if s.is_backed_up() ]
208+
backed_up = [ s for s in snapshots if s.get_snapborg_id() in repo_snapshot_ids ]
198209
if len(snapshots) > 0 and len(backed_up) == 0:
199210
raise Exception("No snapshots have been transferred to the borg repo!")
200211
newest_backed_up = max(
@@ -216,9 +227,15 @@ def backup_candidate(snapper_config, borg_repo, candidate, recreate,
216227
if recreate:
217228
borg_repo.delete(backup_name, dryrun=dryrun)
218229
candidate.purge_userdata(dryrun=dryrun)
219-
borg_repo.backup(backup_name, path_to_backup, timestamp=candidate.get_date(),
220-
exclude_patterns=exclude_patterns, dryrun=dryrun)
221-
candidate.set_backed_up(dryrun=dryrun)
230+
snapborg_id = candidate.generate_snapborg_id(dryrun=dryrun)
231+
borg_repo.backup(
232+
backup_name,
233+
path_to_backup,
234+
timestamp=candidate.get_date(),
235+
exclude_patterns=exclude_patterns,
236+
snapborg_id=snapborg_id,
237+
dryrun=dryrun,
238+
)
222239
return True
223240
except subprocess.CalledProcessError as e:
224241
LOG.error(f"Error backing up snapshot number {candidate.get_number()}!\n\t{e}")

0 commit comments

Comments
 (0)