import dns import dns.query import dns.update import dns.rdataclass import dns.rdatatype import dns.rdtypes.IN.A import dns.tsigkeyring import dns.rcode import threading import time from logger import Logger class LocalDnsHandlerException(Exception): def __init__(self, msg): Exception.__init__(self, msg) class DnsHandler(threading.Thread): def __init__(self, msgQueue, dnsDummy, tsigKey, nsAddress, nsPort, ttl, actionlogDir): threading.Thread.__init__(self) self.msgQueue = msgQueue self.dnsDummy = dnsDummy self.nsAddress = nsAddress self.nsPort = nsPort self.ttl = ttl self.keyring = dns.tsigkeyring.from_text(tsigKey) self.actionlogDir = actionlogDir self.setDaemon(True) def writeActionlog(self, dynid, name, zone, oldAddr, newAddr): f = open("%s/%s" % (self.actionlogDir, dynid), 'a') f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr)) f.close() def run(self): while(True): msg = self.msgQueue.get() if msg.address != msg.addressInDns: try: self.deleteARR(msg.dynid, msg.name, msg.zone) self.insertARR(msg.dynid, msg.name, msg.zone, msg.address) self.writeActionlog(msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address) Logger.log("Update: %s, %s.%s, %s -> %s" % (msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address)) msg.addressInDns = msg.address except Exception, e: Logger.log("Failure for %s when updating DNS: %s" % (str(msg), str(e))) def insertARR(self, dynid, name, zone, address): if self.dnsDummy: return # 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, port=self.nsPort) rc = r.rcode() if rc != 0: raise LocalDnsHandlerException("failure when inserting: %d, %s" % (rc, dns.rcode.to_text(rc))) def deleteARR(self, dynid, name, zone): if self.dnsDummy: return # send A-RR deletion for ip to DNS server u = dns.update.Update(zone, keyring=self.keyring) u.delete(name) r = dns.query.tcp(u, self.nsAddress, port=self.nsPort) rc = r.rcode() if rc != 0: raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))