diff options
| author | Johan Lundberg <lundberg@nordu.net> | 2012-12-06 16:43:36 +0100 |
|---|---|---|
| committer | Johan Lundberg <lundberg@nordu.net> | 2012-12-06 16:43:36 +0100 |
| commit | 0f610eb3bb275b3c6de8a2f0dc0c7011f757743b (patch) | |
| tree | bf8bf665bb5cdf4d35975125ec44c95aef2e8d29 | |
| parent | f9fd41190721a06ed9ce8174d5eaa3dd1fcfa244 (diff) | |
The user can now set timeout in seconds.
The user can now specify reference nameserver.
| -rw-r--r-- | dnscheck_nsd.py | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/dnscheck_nsd.py b/dnscheck_nsd.py index b00600b..bd875e0 100644 --- a/dnscheck_nsd.py +++ b/dnscheck_nsd.py @@ -8,7 +8,7 @@ from socket import gethostbyname, gethostbyaddr, gaierror import dns.resolver logger = logging.getLogger('dnscheck_nsd') -logger.setLevel(logging.DEBUG) +logger.setLevel(logging.INFO) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s') @@ -16,19 +16,23 @@ ch.setFormatter(formatter) logger.addHandler(ch) VERBOSE = False -REFERENCE_NS = 'sunic.sunet.se' -def get_resolver(nameserver=None): +def get_resolver(nameserver=None, lifetime=30): + logger.debug('Resolver instance with nameserver %s.' % nameserver) if not nameserver: - return dns.resolver.Resolver() + resolver = dns.resolver.Resolver() else: resolver = dns.resolver.Resolver() try: - resolver.nameservers=[nameserver] + resolver.nameservers=[gethostbyname(nameserver)] except gaierror: - logger.error('Could not find nameserver: %s' % nameserver) - sys.exit(1) - return resolver + try: + resolver.nameservers=[nameserver] # Maybe it is an IPv6 address? + except gaierror: + logger.error('Could not find nameserver: %s' % nameserver) + sys.exit(1) + resolver.lifetime = lifetime + return resolver def compare_soa(zone, resolvers): answers = [] @@ -41,10 +45,13 @@ def compare_soa(zone, resolvers): else: logger.info('NS %s: %s' % (gethostbyaddr(resolver.nameservers[0])[0], answer)) except dns.exception.Timeout: - logger.error('%s timed out.' % gethostbyaddr(resolver.nameservers[0])[0]) + logger.error('%s timed out. SOA request for %s failed.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) + return 'timeout' + except dns.resolver.NoAnswer: + logger.error('%s returned no answer for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) return 'timeout' except dns.resolver.NXDOMAIN: - logger.error('NS %s responded NXDOMAIN for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) + logger.error('NS %s responded domain not found (NXDOMAIN) for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) return 'no match' if answer: answers.append(answer) @@ -61,9 +68,11 @@ def print_soa(zone, resolvers): else: print 'NS %s: %s' % (gethostbyaddr(resolver.nameservers[0])[0], answer) except dns.exception.Timeout: - print '%s timed out. Print SOA for %s failed.' % (gethostbyaddr(resolver.nameservers[0])[0], zone) + print '%s timed out. SOA request for %s failed.' % (gethostbyaddr(resolver.nameservers[0])[0], zone) + except dns.resolver.NoAnswer: + logger.error('%s returned no answer for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) except dns.resolver.NXDOMAIN: - logger.error('NS %s responded NXDOMAIN for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) + logger.error('NS %s responded domain not found (NXDOMAIN) for %s.' % (gethostbyaddr(resolver.nameservers[0])[0], zone)) def parse_file(f): result = [] @@ -93,7 +102,10 @@ def parse_file(f): def main(): # User friendly usage output parser = argparse.ArgumentParser() + parser.add_argument('--nameserver', '-ns', type=str, default='', help="IP address or hostname, default localhost") + parser.add_argument('--timeout', '-t', type=float, default=5, help="timeout in seconds, default 5") parser.add_argument('--verbose', '-v', action='store_true', default=False) + parser.add_argument('--debug', action='store_true', default=False) parser.add_argument( 'file', nargs='?', @@ -105,15 +117,18 @@ def main(): if args.verbose: global VERBOSE VERBOSE = True - ref_resolver = get_resolver(nameserver=gethostbyname(REFERENCE_NS)) + if args.debug: + logger.setLevel(logging.DEBUG) + ref_resolver = get_resolver(nameserver=args.nameserver, lifetime=args.timeout) for item in parse_file(args.file): - resolver = get_resolver(nameserver=item['ns_address']) + resolver = get_resolver(nameserver=item['ns_address'], lifetime=args.timeout) result = compare_soa(item['domain'], [ref_resolver, resolver]) if result == 'timeout': - print 'Check for zone %s timed out.' % item['domain'] + print 'Check for zone %s failed.\n' % item['domain'] if result == 'no match': print 'SOA did not match:' print_soa(item['domain'], [ref_resolver, resolver]) + print '' if result == 'match' and VERBOSE: print 'Check complete for zone %s.\n' % item['domain'] |
