#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017, Florent Thiery
"""
Criticality: Normal
Checks that DNS records are provided by the customer servers are correctly set
"""
import subprocess
import os
import sys
import imp

GREEN = "\033[92m"
RED = "\033[91m"
DEF = "\033[0m"


def get_dns_servers():
    servers = list()
    with open("/etc/resolv.conf", "r") as f:
        d = f.read().strip()
        for l in d.split("\n"):
            if l.startswith("nameserver "):
                servers.append(l.split("nameserver ")[1])
    if servers == ["127.0.1.1"]:
        # NetworkManager
        status, output = subprocess.getstatusoutput(
            "nmcli -f all device show | grep IP4.DNS | awk '{ print $2 }'"
        )
        servers.extend(output.split("\n"))
    return servers


resolvers = get_dns_servers()


def get_result(output):
    for line in output.split("\n"):
        if "has address " in line:
            return line.split("has address ")[1]


def check_dns(hostname, expected_ip):
    all_ok = True
    for resolver in resolvers:
        status, output = subprocess.getstatusoutput(
            'host "%s" "%s"' % (hostname, resolver)
        )
        if status == 0:
            color = GREEN
            address = get_result(output)
            if address == "127.0.0.1" and resolver == "127.0.0.53":
                pass
            elif address != expected_ip:
                print('Expected ip was: "%s", got "%s".' % (expected_ip, address))
                color = RED
                all_ok = False
        else:
            color = RED
            all_ok = False
            address = "FAIL"
        print(
            '%sDNS resolution of "%s" on server "%s" returned "%s".%s'
            % (color, hostname, resolver, address, DEF)
        )
    return all_ok


os.chdir(os.path.dirname(__file__))
if not os.path.isfile("../utils.py"):
    print("conf.sh not found")
    sys.exit(1)

es_utils = imp.load_source("es_utils", "../utils.py")
conf = es_utils.load_conf()

all_ok = True
conf_resolvers_keys = ("NETWORK_DNS1", "NETWORK_DNS2")
for conf_resolver_key in conf_resolvers_keys:
    conf_resolver = conf.get(conf_resolver_key)
    if conf_resolver and conf_resolver != "0" and conf_resolver not in resolvers:
        print("Resolver %s not configured on the system." % conf_resolver)
        all_ok = False

ip = conf.get("NETWORK_IP_NAT")
if not ip or ip == "0":
    ip = conf.get("NETWORK_IP")
if not ip or ip == "0":
    if not all_ok:
        sys.exit(1)
    print("No IP set in configuration file, unable to test DNS.")
    sys.exit(2)

services_info = (
    ("MS_SERVER_NAME", "mediaserver", "python3-mediaserver"),
    ("MONITOR_SERVER_NAME", "monitor", "python3-mediaserver-monitor"),
    ("CM_SERVER_NAME", "mirismanager", "skyreach"),
)

for conf_name, default_domain, package in services_info:
    domain = conf.get(conf_name)
    if domain and domain not in ("localhost", default_domain):
        # check that the service is installed on this system
        status, output = subprocess.getstatusoutput("dpkg -s %s" % package)
        if status == 0:
            print('Checking IP of "%s".' % domain)
            ok = check_dns(domain, ip)
            if not ok:
                all_ok = False
        else:
            print(
                'Package %s is not installed, IP of "%s" will not be checked.'
                % (package, domain)
            )

if not all_ok:
    sys.exit(1)
else:
    sys.exit(0)