Beispiel #1
0
	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()
Beispiel #2
0
	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)