duplicity started creating signature files with invalid filenames, fixes #1431
This commit is contained in:
parent
3dbd6c994a
commit
f739662392
|
@ -20,20 +20,17 @@ rsync_ssh_options = [
|
||||||
]
|
]
|
||||||
|
|
||||||
def backup_status(env):
|
def backup_status(env):
|
||||||
# Root folder
|
# If backups are dissbled, return no status.
|
||||||
backup_root = os.path.join(env["STORAGE_ROOT"], 'backup')
|
|
||||||
|
|
||||||
# What is the current status of backups?
|
|
||||||
# Query duplicity to get a list of all backups.
|
|
||||||
# Use the number of volumes to estimate the size.
|
|
||||||
config = get_backup_config(env)
|
config = get_backup_config(env)
|
||||||
now = datetime.datetime.now(dateutil.tz.tzlocal())
|
|
||||||
|
|
||||||
# Are backups dissbled?
|
|
||||||
if config["target"] == "off":
|
if config["target"] == "off":
|
||||||
return { }
|
return { }
|
||||||
|
|
||||||
|
# Query duplicity to get a list of all full and incremental
|
||||||
|
# backups available.
|
||||||
|
|
||||||
backups = { }
|
backups = { }
|
||||||
|
now = datetime.datetime.now(dateutil.tz.tzlocal())
|
||||||
|
backup_root = os.path.join(env["STORAGE_ROOT"], 'backup')
|
||||||
backup_cache_dir = os.path.join(backup_root, 'cache')
|
backup_cache_dir = os.path.join(backup_root, 'cache')
|
||||||
|
|
||||||
def reldate(date, ref, clip):
|
def reldate(date, ref, clip):
|
||||||
|
@ -58,7 +55,7 @@ def backup_status(env):
|
||||||
"date_delta": reldate(date, now, "the future?"),
|
"date_delta": reldate(date, now, "the future?"),
|
||||||
"full": keys[0] == "full",
|
"full": keys[0] == "full",
|
||||||
"size": 0, # collection-status doesn't give us the size
|
"size": 0, # collection-status doesn't give us the size
|
||||||
"volumes": keys[2], # number of archive volumes for this backup (not really helpful)
|
"volumes": int(keys[2]), # number of archive volumes for this backup (not really helpful)
|
||||||
}
|
}
|
||||||
|
|
||||||
code, collection_status = shell('check_output', [
|
code, collection_status = shell('check_output', [
|
||||||
|
@ -80,12 +77,20 @@ def backup_status(env):
|
||||||
backup = parse_line(line)
|
backup = parse_line(line)
|
||||||
backups[backup["date"]] = backup
|
backups[backup["date"]] = backup
|
||||||
|
|
||||||
# Look at the target to get the sizes of each of the backups. There is more than one file per backup.
|
# Look at the target directly to get the sizes of each of the backups. There is more than one file per backup.
|
||||||
|
# Starting with duplicity in Ubuntu 18.04, "signatures" files have dates in their
|
||||||
|
# filenames that are a few seconds off the backup date and so don't line up
|
||||||
|
# with the list of backups we have. Track unmatched files so we know how much other
|
||||||
|
# space is used for those.
|
||||||
|
unmatched_file_size = 0
|
||||||
for fn, size in list_target_files(config):
|
for fn, size in list_target_files(config):
|
||||||
m = re.match(r"duplicity-(full|full-signatures|(inc|new-signatures)\.(?P<incbase>\d+T\d+Z)\.to)\.(?P<date>\d+T\d+Z)\.", fn)
|
m = re.match(r"duplicity-(full|full-signatures|(inc|new-signatures)\.(?P<incbase>\d+T\d+Z)\.to)\.(?P<date>\d+T\d+Z)\.", fn)
|
||||||
if not m: continue # not a part of a current backup chain
|
if not m: continue # not a part of a current backup chain
|
||||||
key = m.group("date")
|
key = m.group("date")
|
||||||
|
if key in backups:
|
||||||
backups[key]["size"] += size
|
backups[key]["size"] += size
|
||||||
|
else:
|
||||||
|
unmatched_file_size += size
|
||||||
|
|
||||||
# Ensure the rows are sorted reverse chronologically.
|
# Ensure the rows are sorted reverse chronologically.
|
||||||
# This is relied on by should_force_full() and the next step.
|
# This is relied on by should_force_full() and the next step.
|
||||||
|
@ -148,6 +153,7 @@ def backup_status(env):
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"backups": backups,
|
"backups": backups,
|
||||||
|
"unmatched_file_size": unmatched_file_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
def should_force_full(config, env):
|
def should_force_full(config, env):
|
||||||
|
@ -556,8 +562,7 @@ if __name__ == "__main__":
|
||||||
run_duplicity_verification()
|
run_duplicity_verification()
|
||||||
|
|
||||||
elif sys.argv[-1] == "--list":
|
elif sys.argv[-1] == "--list":
|
||||||
# Run duplicity's verification command to check a) the backup files
|
# List the saved backup files.
|
||||||
# are readable, and b) report if they are up to date.
|
|
||||||
for fn, size in list_target_files(get_backup_config(load_environment())):
|
for fn, size in list_target_files(get_backup_config(load_environment())):
|
||||||
print("{}\t{}".format(fn, size))
|
print("{}\t{}".format(fn, size))
|
||||||
|
|
||||||
|
@ -565,6 +570,7 @@ if __name__ == "__main__":
|
||||||
# Show backup status.
|
# Show backup status.
|
||||||
ret = backup_status(load_environment())
|
ret = backup_status(load_environment())
|
||||||
print(rtyaml.dump(ret["backups"]))
|
print(rtyaml.dump(ret["backups"]))
|
||||||
|
print("Storage for unmatched files:", ret["unmatched_file_size"])
|
||||||
|
|
||||||
elif len(sys.argv) >= 2 and sys.argv[1] == "--restore":
|
elif len(sys.argv) >= 2 and sys.argv[1] == "--restore":
|
||||||
# Run duplicity restore. Rest of command line passed as arguments
|
# Run duplicity restore. Rest of command line passed as arguments
|
||||||
|
|
|
@ -200,6 +200,7 @@ function show_system_backup() {
|
||||||
total_disk_size += b.size;
|
total_disk_size += b.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
total_disk_size += r.unmatched_file_size;
|
||||||
$('#backup-total-size').text(nice_size(total_disk_size));
|
$('#backup-total-size').text(nice_size(total_disk_size));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue