def handle(self, zonename, dirname, checkzone, verbosity, force_write, nameserver, *args, **options): if not zonename and not dirname: print "Must supply valid zonename. If you wish to export all zones, provide a dirname" exit(-1) #if not filename and if not dirname: # print "Must supply valid filename or directory name." # exit(-1) if not dirname: dirname = './' if dirname[-1] != '/': dirname += '/' if (verbosity > '1'): print 'zonename: %s' % zonename print 'dirname: %s' % dirname print 'checkzone: %s' % checkzone print 'force_write: %s' % force_write #We get our list of DNSRecord objects, all if there is no zonename specified if zonename: if zonename[-1] != '.': zonename += '.' dnsz_list = DNSZone.objects.filter(zonename=zonename) else: dnsz_list = dnsz = DNSZone.objects.all() if verbosity > '1': print dnsz_list for dnsz in dnsz_list: #This could be made to the datestamp #TODO zonename needs to be set here ... #dnsz.serial = datetime.datetime.now().strftime("%Y%m%d%H") dnsz.serial += 1 dnsz.save() if nameserver == None: nsservers = dnsz.dnsrecord_set.filter(type="NS") else: nsservers = [] # There is probably a better way to do this .... nsservers_ = dnsz.dnsrecord_set.filter(type="NS") for nsserver_ in nsservers_: if len(nsserver_.dnsrecord.filter(fqdn=nameserver)) > 0: if verbosity > '0': print len(nsserver_.dnsrecord.filter(fqdn=nameserver)) print nsserver_ nsservers.append( nsserver_) for nsserver in nsservers: filename = "%s%s%szone" %(dirname, nsserver.record, dnsz.zonename ) filename_tmp = filename + '.tmp' if verbosity > '1': print 'filename: %s' % filename print 'filename_tmp: %s' % filename_tmp exported = self.exportZone(filename_tmp , dnsz, nsserver, dnsz.zonename, force_write, verbosity) if verbosity > '1': print 'exported: %s' % exported #now we need to check the zone if exported: check = ZoneCheck(checkzone=checkzone) res = check.isValid(dnsz.zonename, filename_tmp ) if verbosity > '1': print 'check result: %s' % res if res: #zone is valid, move it into place os.rename(filename_tmp, filename) else: print 'ERROR: invalid zone %s' % dnsz.zonename print 'This is either a broken zone, or bad path to checkzone' print 'Please check the zone at %s' % filename_tmp dnsz.last_exported = datetime.datetime.now() dnsz.save()
def handle(self, filename, zonename, keyfile, checkzone, *args, **options): if not filename: print "Must supply valid filename" exit(-1) if not zonename: print "Must supply valid zonename" exit(-1) if zonename[-1] != '.': zonename += '.' # Check the zone c = ZoneCheck(checkzone=checkzone) if not c.isValid(zonename, filename): print "Invalid zone" exit(-1) z = easyzone.zone_from_file(zonename, filename) if len(DNSZone.objects.filter(zonename=zonename)) == 0: dnsz = DNSZone() dnsz.zonename = zonename dnsz.ttl = z.root.soa.minttl dnsz.rndckey = keyfile #fk email to a user? dnsz.email = '*****@*****.**' dnsz.serial = z.root.soa.serial dnsz.refresh = z.root.soa.refresh dnsz.retry = z.root.soa.retry dnsz.expire = z.root.soa.expire dnsz.minimum = z.root.soa.minttl dnsz.save() else: dnsz = DNSZone.objects.get(zonename=zonename) #We want to populate the A and AAAA records first, else we wont have integrity for the other records. for rtype in ('A', 'AAAA', 'MX', 'PTR', 'TXT', 'SRV', 'CNAME', 'NS', 'HINFO'): for r in z.names: try: for rec in z.names[r].records(rtype).items: #Check if the record exists or not if len(DNSRecord.objects.filter(type=rtype,record=rec,fqdn=r)) == 0: dr = DNSRecord() dr.zone = dnsz dr.type = rtype if rtype == 'MX': rec = '%s %s' % rec if rtype not in ('A', 'AAAA'): dr.record = rec dr.active= True dr.ttl = dnsz.ttl dr.fqdn = r if rtype in ('A', 'AAAA'): try: a = Address.objects.get(address=rec) except Address.DoesNotExist: a = Address() a.host = None a.type = 6 if rtype == 'A': a.type = 4 a.vlan = 0 a.hwid = None a.address = rec a.save() dr.address = a dr.save() print dr # TODO We should check if a DNAME to relate to a different zone .... ? if rtype in ('MX', 'CNAME', 'NS', 'PTR', 'TXT', 'SRV'): test = rec.split(' ')[-1] #We should also split the rec if possible - last field is our related name in SRV / MX related = DNSRecord.objects.filter(Q(fqdn=test) , Q(type='A') | Q(type='AAAA')) for x in related: dr.dnsrecord.add(x) dr.save() #Check if this object exists in our model (host, address and type) #If we find a host by this FQDN, tie the address to it. Else skip and add address / record. except ValueError as e: # #pass print 'EXCEPTION ON:' + r + ':' + rtype + ' ;;ValueError; ' + e.message except AttributeError as e: pass except TypeError as e: print 'EXCEPTION ON:' + r + ':' + rtype + ' ;;TypeError; ' + e.message print traceback.print_tb(sys.exc_info()[2] )
try: recordtype = str(fqdna[0]) zonename = str(CurrentDomainName[1]) print zonename filename = "/var/cache/bind/%s" % zonename f = easyzone.zone_from_file(zonename, filename) f.names[fqdn].records(recordtype).delete(arecord) test = f.names[fqdn].records(recordtype).items print '<br>' print test except: if recordtype == 'TXT': print 'TXT record deletion currently unavailable, ask a admin, sorry' # Cause : " added somewhere, don't know if in lib or not ATM else: print 'Couille dans le potage' result = 'NOK' else: print 'Error' #The destination directory (example : /var/cache/bind) must be owned by www-data:bind tempfilesuffix = '.tmp' tempfile = filename + tempfilesuffix f.save (tempfile, autoserial=True) dnscheck = ZoneCheck(checkzone='/usr/sbin/named-checkzone') valid = dnscheck.isValid(zonename, tempfile) if valid is True and result is not 'NOK': #If we don't check for NOK, easyzone write anyways with # the old valid info, procing the error message from #the failed f function then the ok one because the old zone is still valid when #rewrited print 'ok!' f.save (filename, autoserial=True) os.remove(tempfile)