#!/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] ONE_BACKUP_EVERY_HOURS = int(argv[2]) NOW = int(time()) HOUR_SECONDS = 60 * 60 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 > ((HOUR_SECONDS * (ONE_BACKUP_EVERY_HOURS + 1)) + (HOUR_SECONDS*24)): exit(2) elif delta > (HOUR_SECONDS * (ONE_BACKUP_EVERY_HOURS + 1)): exit(1) else: exit(0) except Exception as e: print(repr(e)) exit(3)