#!/usr/bin/env python3
# Copyright (C) 2025 Spearhead Systems SRL


import json
import optparse
import subprocess


print("<<<domains_nameservers:sep(0)>>>")


parser = optparse.OptionParser()
parser.add_option('-d', '--domains', action="append")
parser.add_option('-n', '--nameservers', action="append")
parser.add_option('-a', '--alert', default="WARN")
opts, _ = parser.parse_args()

alert = opts.alert
assert ["OK", "WARN", "CRIT", "UNKNOWN"].count(alert)

for domain_str, nameserver_str in zip(opts.domains, opts.nameservers):
    domains = domain_str.split(",")
    nameservers = set(nameserver_str.split(","))

    for domain in domains:
        dig_result = subprocess.run(["dig", "+short", "NS", domain], capture_output=True)
        dig_ns = set(dig_result.stdout.decode("utf-8").split('.\n'))
        dig_ns.remove('')

        result = {
            "domain": domain,
            "state": "OK",
        }

        if dig_ns != nameservers:
            result["state"] = alert

            unexpected = list(dig_ns - nameservers)
            missing    = list(nameservers - dig_ns)
            
            if unexpected:
                result["unexpected"] = unexpected
            if missing:
                result["missing"] = missing

        print(json.dumps(result))
