#!/usr/bin/python """This performs simultaneous dns lookups for pairs of dns_object query_type provided on stdin.""" from __future__ import print_function import sys import pprint import argparse #try: # import adns #except ImportError: # #cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/ ; sudo ln -sf /opt/local/include/adns.h adns.h ; cd - # print("Missing adns module; perhaps 'sudo rpm -ivh adns-python-1.2.2-1.x86_64.rpm', 'sudo -H pip install https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/adns-python/adns-python-1.2.1.tar.gz' or 'sudo port install adns' ? Exiting.") # raise from async_resolver_class import AsyncResolver def debug(debug_message): """Print a debugging message.""" sys.stderr.write('___ ' + debug_message + '\n') sys.stderr.flush() def fail(debug_message): """Print a debugging message and quit.""" sys.stderr.write('xxx ' + debug_message + '\n') sys.stderr.flush() sys.exit(1) #Main slice_size = 500 #This should be a multiple of 5 to avoid having answers for a given domain should up at the end of one slice and the beginning of the next. parser = argparse.ArgumentParser(description='Lookup large numbers of dns objects, provided as dns_obj query_type pairs on stdin.') parser.add_argument('-p', '--pprint', '--prettyprint', help='Show output in a pretty printed tree', dest='prettyprint', action='store_true') parser.add_argument('-t', '--typesummary', help='Summarize which dns types are available for each object', dest='typesummary', action='store_true') parser.set_defaults(prettyprint=False) args = vars(parser.parse_args()) prettyprint = args['prettyprint'] typesummary = args['typesummary'] if not prettyprint and not typesummary: typesummary = True dom_requests = [] for one_line in sys.stdin: req_atoms = one_line.replace('\n', '').split() if len(req_atoms) == 0: pass elif len(req_atoms) == 1: dom_requests.append((req_atoms[0], 'A')) dom_requests.append((req_atoms[0], 'MX')) dom_requests.append((req_atoms[0], 'NS')) dom_requests.append((req_atoms[0], 'SOA')) dom_requests.append((req_atoms[0], 'TXT')) elif len(req_atoms) == 2: if req_atoms[1] in ('A', 'MX', 'NS', 'SOA', 'TXT'): dom_requests.append((req_atoms[0], req_atoms[1])) elif req_atoms[1] == 'ANY': dom_requests.append((req_atoms[0], 'A')) dom_requests.append((req_atoms[0], 'MX')) dom_requests.append((req_atoms[0], 'NS')) dom_requests.append((req_atoms[0], 'SOA')) dom_requests.append((req_atoms[0], 'TXT')) else: fail('Invalid dns query type for line: ' + one_line.replace('\n', '')) elif len(req_atoms) > 2: fail('Invalid format for line: ' + one_line.replace('\n', '')) if len(dom_requests) >= slice_size: dom_request_slice = dom_requests[0:slice_size] dom_requests = dom_requests[slice_size:] ar = AsyncResolver(dom_request_slice, intensity=150) all_answers = ar.resolve() if prettyprint: pp = pprint.PrettyPrinter(indent=4) pp.pprint(all_answers) if typesummary: for one_dns_obj in sorted(all_answers): live_answers = [] for one_ans_type in sorted(all_answers[one_dns_obj]): if all_answers[one_dns_obj][one_ans_type] != None: live_answers.append(one_ans_type) print(one_dns_obj + ': ' + '/'.join(live_answers)) if len(dom_requests) > 0: ar = AsyncResolver(dom_requests, intensity=150) all_answers = ar.resolve() if prettyprint: pp = pprint.PrettyPrinter(indent=4) pp.pprint(all_answers) if typesummary: for one_dns_obj in sorted(all_answers): live_answers = [] for one_ans_type in sorted(all_answers[one_dns_obj]): if all_answers[one_dns_obj][one_ans_type] != None: live_answers.append(one_ans_type) print(one_dns_obj + ': ' + '/'.join(live_answers))