#!/usr/bin/env python3
#
# fetch VPs that have pinged home in the past 8 hours, and identify
# those that are not connected to the ark mux.

import argparse
import datetime
import re
import sys
from typing import Dict
import requests
from scamper import ScamperCtrl

URL = 'https://api.arkmon.caida.org/public/monitors'

def _main() -> None:
    parser = argparse.ArgumentParser(description='check for missing fireball VPs')
    parser.add_argument('--mux',
                        dest    = 'mux',
                        default = '/run/ark/mux',
                        help    = 'location of ark mux')
    parser.add_argument('--lastping',
                        dest    = 'lastping',
                        default = (8 * 60 * 60),
                        help    = 'how long ago node last pinged home')
    parser.add_argument('--activity',
                        dest    = 'activity',
                        default = 'Fireball',
                        help    = 'activity name to check')
    args = parser.parse_args()

    response = requests.get(URL, timeout=10)
    response.raise_for_status()

    now = datetime.datetime.now()

    ark_vps = {} # type: Dict[str, Dict[str, int]]
    for ark_vp in response.json():
        assert 'node' in ark_vp

        # check that the node pinged home recently
        if 'lastping' not in ark_vp:
            continue
        lastping = datetime.datetime.fromtimestamp(ark_vp['lastping'])
        if now - lastping > datetime.timedelta(seconds=args.lastping):
            continue

        name = ark_vp['node']
        ark_vps[name] = {}
        ark_vps[name]['connected'] = 0
        ark_vps[name]['activity'] = 0

        if 'activities' in ark_vp and args.activity in set(ark_vp['activities']):
            ark_vps[name]['activity'] = 1

    ctrl = ScamperCtrl(mux=args.mux) # type: ScamperCtrl[None]
    for scamper_vp in ctrl.vps():
        if scamper_vp.shortname not in ark_vps:
            print(f'{scamper_vp.shortname} is not pinging home')
            continue
        ark_vps[scamper_vp.shortname]['connected'] = 1

    for ark_vp in sorted(ark_vps):
        match = re.match(r'^([a-z]{3}\d*)-([a-z]{2})$', ark_vp)
        if match and (match.group(1) == 'xxx' or match.group(2) == 'zz'):
            continue
        if ark_vps[ark_vp]['connected'] == 0:
            line = f'{ark_vp}'
            if ark_vps[ark_vp]['activity'] == 0:
                line += ' activity not in dory'
            print(line)

if __name__ == "__main__":
    _main()
