mpwhalen
10/4/2016 - 7:33 PM

Print results of DNS NAPTR records

Print results of DNS NAPTR records

#!/usr/bin/env python
#(@)dddns.py by Jan-Piet Mens, February 2012

import dns.resolver
import dns.e164
from dns.exception import DNSException
import sys, re
import optparse

def enum(aus, verbose):

    if verbose:
        print "Trying ENUM with AUS %s" % aus

    domain = dns.e164.from_e164(aus)
    if domain == dns.name.from_text('e164.arpa.'):
        print "AUS %s doesn't look like an ENUM" % aus
        sys.exit(0)

    if verbose:
        print "AUS %s is in DNS domain %s" % (aus, domain)

    try:
        answers = dns.resolver.query(domain, 'NAPTR')
    except DNSException, e:
        print "Cannot resolve %s" % domain
        print e.__class__, e
        sys.exit(0)

    for rdata in answers:
        if verbose:
            print "%3d %3d %-4s %-20s %s" % (rdata.order, rdata.preference, rdata.flags, rdata.regexp, rdata.replacement)

        if rdata.flags == 'u':      # Terminal
            regex = rdata.regexp.split('!')
            rf = regex[1] # from
            rt = regex[2] # to

            print "%s" % re.sub(rf, rt, aus)

if __name__ == '__main__':

    parser = optparse.OptionParser()
    parser.add_option('-v', '--verbose', dest='verbose', default=False, action='store_true', help='Verbose output')
    parser.add_option('-e', '--enum', dest='enumber', help='Telephone number')

    (opts, args) = parser.parse_args()

    if opts.enumber:
        enum(opts.enumber, opts.verbose)