40 lines
1,006 B
Text
40 lines
1,006 B
Text
|
#!/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',
|
||
|
)
|