39 lines
1,006 B
Python
39 lines
1,006 B
Python
#!/usr/bin/env python3
|
|
|
|
from json import load, dump
|
|
from subprocess import check_output
|
|
from shutil import move
|
|
from os import remove
|
|
from collections import defaultdict
|
|
|
|
with open('/etc/backup-server/config.json', 'r') as f:
|
|
server_settings = load(f)
|
|
|
|
snapshots = defaultdict(set)
|
|
|
|
for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True).splitlines():
|
|
line = line.decode('UTF-8')
|
|
|
|
if line.startswith('{}/'.format(server_settings['zfs-base'])):
|
|
dataset, snapname = line.split('@', 1)
|
|
|
|
dataset = dataset.split('/')[-1]
|
|
ts, bucket = snapname.split('-', 1)
|
|
|
|
if not ts.isdigit():
|
|
# garbage, ignore
|
|
continue
|
|
|
|
snapshots[dataset].add(int(ts))
|
|
|
|
backups = {}
|
|
for dataset, snaps in snapshots.items():
|
|
backups[dataset] = sorted(snaps)[-1]
|
|
|
|
with open('/etc/backup-server/backups.tmp.json', 'w') as f:
|
|
dump(backups, f)
|
|
|
|
move(
|
|
'/etc/backup-server/backups.tmp.json',
|
|
'/etc/backup-server/backups.json',
|
|
)
|