#!/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)
