Skip to content
Snippets Groups Projects
test_dns_records.py 3.29 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017, Florent Thiery
'''
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'

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

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 }\'')
Nicolas KAROLAK's avatar
Nicolas KAROLAK committed
        servers.extend(output.split('\n'))
    return servers

resolvers = get_dns_servers()

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

def get_result(output):
    for line in output.split('\n'):
Stéphane Diemer's avatar
Stéphane Diemer committed
        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:
Stéphane Diemer's avatar
Stéphane Diemer committed
        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":
            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
Stéphane Diemer's avatar
Stéphane Diemer 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__))
Stéphane Diemer's avatar
Stéphane Diemer committed
if not os.path.isfile('../utils.py'):
Stéphane Diemer's avatar
Stéphane Diemer committed
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:
Stéphane Diemer's avatar
Stéphane Diemer committed
        print('Resolver %s not configured on the system.' % conf_resolver)
Stéphane Diemer's avatar
Stéphane Diemer committed
        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)
Stéphane Diemer's avatar
Stéphane Diemer committed
    print('No IP set in configuration file, unable to test DNS.')
Stéphane Diemer's avatar
Stéphane Diemer committed
    sys.exit(2)

services_info = (
    ('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)
    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)