import dns import dns.query import dns.update import dns.rdataclass import dns.rdatatype import dns.rdtypes.IN.A import dns.tsigkeyring import threading from logger import Logger class DnsHandler(threading.Thread): def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap): threading.Thread.__init__(self) self.msgQueue = msgQueue self.nsAddress = nsAddress self.ttl = ttl self.keyring = dns.tsigkeyring.from_text(tsigKey) self.statusMap = statusMap self.setDaemon(True) def run(self): while(True): msg = self.msgQueue.get() dynid = msg.dynid name = msg.name zone = msg.zone address = msg.address fullName = name + '.' + zone if self.statusMap.has_key(fullName): if self.statusMap[fullName] != address: self.deleteARR(dynid, name, zone, self.statusMap[fullName]) self.insertARR(dynid, name, zone, address) self.statusMap[fullName] = address else: self.insertARR(dynid, name, zone, address) self.statusMap[fullName] = address def insertARR(self, dynid, name, zone, address): # send A-RR insertion for ip to DNS server rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, address) u = dns.update.Update(zone, keyring=self.keyring) u.add(name, self.ttl, rr) r = dns.query.tcp(u, self.nsAddress) if r.rcode() != 0: # failure Logger.log("failure for %s when inserting A-RR %s -> %s into %s" % (dynid, name, address, zone)) else: # success Logger.log("insert for %s ARR %s -> %s into %s" % (dynid, name, address, zone)) def deleteARR(self, dynid, name, zone, address): # send A-RR deletion for ip to DNS server rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, address) u = dns.update.Update(zone, keyring=self.keyring) u.delete(name, rr) r = dns.query.tcp(u, self.nsAddress) if r.rcode() != 0: # failure Logger.log("failure for %s when deleting A-RR %s -> %s from %s" % (dynid, name, address, zone)) else: # success Logger.log("delete for %s ARR %s -> %s from %s" % (dynid, name, address, zone))