#! /usr/bin/python

import os
import sys
import re
import socket

ips={}
fd=os.popen("/sbin/ifconfig",'r');
for line in fd:
    m = re.search("(\d+\.\d+\.\d+\.\d+)", line)
    if m:
        ip=m.group(1)
        ips[ip]=[ip]
fd.close()

# print ips

localdomains={}
fd=open("/etc/localdomains",'r')
for line in fd:
    domain=line.strip()
    localdomains[domain]=domain
fd.close()

# print localdomains

def mailhere(dns):
    global ips
    dig=os.popen("dig mail.%s" % (dns),'r')
    try:
        answer_section=False
        for line in dig:
            if line.find(";; ANSWER SECTION")>=0: answer_section = True
            if line.strip()=="": answer_section=False
            if not answer_section: continue
            m = re.search("(\d+\.\d+\.\d+\.\d+)", line)
            if m:
                ip=m.group(1)
                if ips.has_key(ip):
                    return 1
        return 0
    finally:
        dig.close()

def ip_lookup_in_list(dns):
    global ips
    # MX is me
    dig=os.popen("dig a %s" % (dns),'r')
    try:
        answer_section=False
        has_answer_section=False
        for line in dig:
            if line.find(";; ANSWER SECTION")>=0:
                has_answer_section = True
                answer_section = True
            if line.find(";; ADDITIONAL SECTION")>=0: answer_section = True
            if line.strip()=="": answer_section=False
            if not answer_section: continue
            m = re.search("(\d+\.\d+\.\d+\.\d+)", line)
            if m:
                ip=m.group(1)
                if ips.has_key(ip):
                    return True

        if answer_section:
            return False
        else:
            #sys.stderr.write("# No MX record for %s]\n" % dns)
            return None
    finally:
        dig.close()


def domain_delivers_here(dns):
    # MX is me
    dig=os.popen("dig mx %s" % (dns),'r')
    try:
        answer_section=False
        has_answer_section=False
        for line in dig:
            if line.find(";; ANSWER SECTION")>=0:
                has_answer_section = True
                answer_section = True
            if line.find(";; ADDITIONAL SECTION")>=0: answer_section = True
            if line.strip()=="": answer_section=False
            if not answer_section: continue
            m = re.search("spambox.co.za|196\.33\.227\.30", line)
            if m:
                return mailhere(dns)
            m = re.search("(\d+\.\d+\.\d+\.\d+)", line)
            if m:
                ip=m.group(1)
                if ips.has_key(ip): return True
  
            m = re.search("\sIN\s+MX\s+\d+(.*)", line)
            if m:
                if ip_lookup_in_list(m.group(1)):
                    return True

        if answer_section:
            return False
        else:
            #sys.stderr.write("# No MX record for %s]\n" % dns)
            return None
    finally:
        dig.close()

def checkdomain(dns):
    if localdomains.has_key(dns):
        # We take mail for this domain, but just maybe it goes elsewhere
        if domain_delivers_here(dns) == False:
            sys.stderr.write("# %s not expected in localdomains\n" % dns)
        return 0 
    if domain_delivers_here(dns):
        print dns
        return 1
    return 0

sys.stderr.write("# Checking for domains where mail.domain or mx points here\n")
fd=os.popen("cat /var/cpanel/users/* | grep DNS=",'r')
n=0
for line in fd:
    bits=line.strip().split('=')
    if len(bits)<>2: continue
    dns=bits[1]
    n+=checkdomain(dns)

sys.stderr.write("# %d domains missing from /etc/localdomains\n" % n)
