diff --git a/dns_sync.py b/dns_sync.py index 0902255..204650d 100755 --- a/dns_sync.py +++ b/dns_sync.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # coding: utf-8 -import datetime +import datetime, os, commands, sys, shutil from django.core.management import setup_environ #from dns_mdb import settings import settings @@ -10,9 +10,109 @@ setup_environ(settings) from mdb.models import * -domains = Domain.objects.all() +to_be_updated = [] zones = {} +zone_file_temp_dir = "temp" +zone_file_dir = "/var/lib/bind" +zone_command = "/usr/sbin/named-checkzone %s %s" +if not os.path.isdir(zone_file_temp_dir): + os.mkdir(zone_file_temp_dir) + + +class Log(): + filename = None + started = False + + def startlog(self): + if self.started: + return + logfile = open(self.filename, "a") + logfile.write("\nStarting log %s\n" % str(datetime.datetime.now())) + logfile.close() + self.started = True + + def setFilename(self, filename): + self.filename = filename + + def debug(self, string): + self.startlog() + logfile = open(self.filename, "a") + logfile.write("%s\n" % string) + logfile.close() + print string + +log = Log() +log.setFilename("dns_sync.log") + +def valid_zone(zone, filename): + status, output = commands.getstatusoutput(zone_command % (zone, filename)) + if status != 0: + print "Could not validate zone:\n%s" % output + return False + else: + return True + + +# this will produce the zone files for the domains +domains = Domain.objects.all() for domain in domains: - print domain.zone_file_contents() + current_serial = 0 + if os.path.exists("%s/%s" % (zone_file_dir, domain.domain_filename)): + zonefile = open("%s/%s" % (zone_file_dir,domain.domain_filename), "r") + firstline = zonefile.readline() + current_serial = int( firstline.split(":")[1]) + + zonefile.close() + + if current_serial < domain.domain_serial: + log.debug("Updating zone %s from %d -> %d" % + (domain.domain_name, current_serial, domain.domain_serial)) + zone_contents = domain.zone_file_contents() + zonefile = open("%s/%s" % (zone_file_temp_dir, domain.domain_filename),"w") + zonefile.write(zone_contents) + zonefile.close() + if valid_zone(domain.domain_name, "%s/%s" % + (zone_file_temp_dir, domain.domain_filename)): + to_be_updated.append( [ domain.domain_name, "%s/%s" % + (zone_file_temp_dir, domain.domain_filename) ] ) + +# this will produce the zone files for the reverse lookup subnets +subnets = Ip4Subnet.objects.all() +for domain in subnets: + current_serial = 0 + if os.path.exists("%s/%s" % (zone_file_dir, domain.domain_filename)): + zonefile = open("%s/%s" % (zone_file_dir,domain.domain_filename), "r") + firstline = zonefile.readline() + current_serial = int( firstline.split(":")[1]) + + zonefile.close() + + if current_serial < domain.domain_serial: + log.debug("Updating zone %s from %d -> %d" % + (domain.domain_name, current_serial, domain.domain_serial)) + zone_contents = domain.zone_file_contents() + zonefile = open("%s/%s" % (zone_file_temp_dir, domain.domain_filename),"w") + zonefile.write(zone_contents) + zonefile.close() + if valid_zone(domain.domain_name, "%s/%s" % + (zone_file_temp_dir, domain.domain_filename)): + to_be_updated.append( [ domain.domain_name, "%s/%s" % + (zone_file_temp_dir, domain.domain_filename) ] ) + +if len(to_be_updated) == 0: + # nothing to do + sys.exit(0) + +for upd in to_be_updated: + shutil.copy(upd[1], zone_file_dir) + +status, output = commands.getstatusoutput("/etc/init.d/bind9 reload") + +if status != 0: + print output + sys.exit(1) + +sys.exit(0) +