Skip to content
Snippets Groups Projects
test_dns_records.py 3.39 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017, Florent Thiery
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
"""
Checks that DNS records are provided by the customer servers are correctly set
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
"""
import subprocess
import os
import sys
import imp

Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
GREEN = "\033[92m"
RED = "\033[91m"
DEF = "\033[0m"
Stéphane Diemer's avatar
Stéphane Diemer committed

def get_dns_servers():
    servers = list()
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    with open("/etc/resolv.conf", "r") as f:
        d = f.read().strip()
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
        for l in d.split("\n"):
            if l.startswith("nameserver "):
                servers.append(l.split("nameserver ")[1])
    if servers == ["127.0.1.1"]:
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
        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()

Stéphane Diemer's avatar
Stéphane Diemer committed

def get_result(output):
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    for line in output.split("\n"):
        if "has address " in line:
            return line.split("has address ")[1]
Stéphane Diemer's avatar
Stéphane Diemer committed

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

os.chdir(os.path.dirname(__file__))
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
if not os.path.isfile("../utils.py"):
    print("conf.sh not found")
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
es_utils = imp.load_source("es_utils", "../utils.py")
Stéphane Diemer's avatar
Stéphane Diemer committed
conf = es_utils.load_conf()

all_ok = True
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
conf_resolvers_keys = ("NETWORK_DNS1", "NETWORK_DNS2")
Stéphane Diemer's avatar
Stéphane Diemer committed
for conf_resolver_key in conf_resolvers_keys:
    conf_resolver = conf.get(conf_resolver_key)
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    if conf_resolver and conf_resolver != "0" and conf_resolver not in resolvers:
        print("Resolver %s not configured on the system." % conf_resolver)
Stéphane Diemer's avatar
Stéphane Diemer committed
        all_ok = False

Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
ip = conf.get("NETWORK_IP_NAT")
if not ip or ip == "0":
    ip = conf.get("NETWORK_IP")
if not ip or ip == "0":
Stéphane Diemer's avatar
Stéphane Diemer committed
    if not all_ok:
        sys.exit(1)
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    print("No IP set in configuration file, unable to test DNS.")
Stéphane Diemer's avatar
Stéphane Diemer committed
    sys.exit(2)

Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    ("MS_SERVER_NAME", "mediaserver", "python3-mediaserver"),
    ("MONITOR_SERVER_NAME", "monitor", "python3-mediaserver-monitor"),
    ("CM_SERVER_NAME", "mirismanager", "skyreach"),
Stéphane Diemer's avatar
Stéphane Diemer committed
)
for conf_name, default_domain, package in services_info:
    domain = conf.get(conf_name)
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
    if domain and domain not in ("localhost", default_domain):
        # check that the service is installed on this system
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
        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:
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
            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)