summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Lundberg <lundberg@nordu.net>2012-12-06 16:43:36 +0100
committerJohan Lundberg <lundberg@nordu.net>2012-12-06 16:43:36 +0100
commit0f610eb3bb275b3c6de8a2f0dc0c7011f757743b (patch)
treebf8bf665bb5cdf4d35975125ec44c95aef2e8d29
parentf9fd41190721a06ed9ce8174d5eaa3dd1fcfa244 (diff)
The user can now set timeout in seconds.
The user can now specify reference nameserver.
-rw-r--r--dnscheck_nsd.py45
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']