bundlewrap/bundles/backup-server/files/check_backup_for_node
Franziska Kunsmann 5b2e5fc838
Some checks failed
kunsi/bundlewrap/pipeline/head There was a failure building this commit
bundles/backup-server: do not alert for one missing day of backups
2022-01-09 08:26:08 +01:00

56 lines
1.4 KiB
Python

#!/usr/bin/env python3
from datetime import datetime
from json import load
from subprocess import check_output
from sys import argv, exit
from time import time
NODE = argv[1]
NOW = int(time())
DAY_SECONDS = 60 * 60 * 24
snaps = set()
try:
with open(f'/etc/backup-server/config.json', 'r') as f:
server_settings = load(f)
# get all existing snapshots for NODE
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'], NODE)):
_, snapname = line.split('@', 1)
if 'zfs-auto-snap' in snapname:
# migration from auto-snapshots, ignore
continue
ts, bucket = snapname.split('-', 1)
snaps.add(int(ts))
if not snaps:
print('No backups found!')
exit(2)
last_snap = sorted(snaps)[-1]
delta = NOW - last_snap
print('Last backup was on {} UTC'.format(
datetime.fromtimestamp(last_snap).strftime('%Y-%m-%d %H:%M:%S'),
))
# One day without backups is still okay. There may be fluctuations
# because of transfer speed, amount of data, changes in backup
# schedule etc.
if delta > (DAY_SECONDS * 3):
exit(2)
elif delta > (DAY_SECONDS * 2):
exit(1)
else:
exit(0)
except Exception as e:
print(repr(e))
exit(3)