diff --git a/server/DnsHandler.py b/server/DnsHandler.py index 03b50b2..8a3c818 100644 --- a/server/DnsHandler.py +++ b/server/DnsHandler.py @@ -4,41 +4,38 @@ import dns.update import dns.rdataclass import dns.rdatatype import dns.rdtypes.IN.A -import dns.tsigkeyring +import dns.tsigkeyring +import dns.rcode import threading from logger import Logger +class LocalDnsHandlerException(Exception): + def __init__(self, msg): + Exception.__init__(self, msg) class DnsHandler(threading.Thread): - def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap): + def __init__(self, msgQueue, tsigKey, nsAddress, ttl): 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) + 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 + if msg.address != msg.addressInDns: + try: + self.deleteARR(msg.dynid, msg.name, msg.zone, msg.addressInDns) + self.insertARR(msg.dynid, msg.name, msg.zone, 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): @@ -48,14 +45,9 @@ class DnsHandler(threading.Thread): 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)) + 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, address): @@ -65,14 +57,7 @@ class DnsHandler(threading.Thread): 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)) - - + rc = r.rcode() + if rc != 0: + raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc))) diff --git a/server/Entry.py b/server/Entry.py index 3b1eccc..2106221 100644 --- a/server/Entry.py +++ b/server/Entry.py @@ -6,8 +6,11 @@ class Entry(object): self.name = name self.zone = zone self.lastEventTime = 0 - self.address = '' + self.address = '0.0.0.0' + self.addressInDns = '0.0.0.0' def __str__(self): - return "dynid=%s, name=%s, zone=%s, sharedSecret=%s, address=%s, lastEventTime=%d" % (self.dynid, self.name, self.zone, self.sharedSecret, self.address, self.lastEventTime) + return "dynid=%s, name=%s, zone=%s, sharedSecret=%s, address=%s (%s), lastEventTime=%d" % (self.dynid, self.name, self.zone, self.sharedSecret, self.address, self.addressInDns, self.lastEventTime) + + diff --git a/server/Event.py b/server/Event.py index 6139ad3..7aa13a5 100644 --- a/server/Event.py +++ b/server/Event.py @@ -50,23 +50,18 @@ class Event(object): di = "%s %s %d" % (self.dynid, entry.sharedSecret, self.msgTime) d = md5.new(di).hexdigest() - Logger.log("%s, received: %s, calculated: %s" % (di, self.checksum, d)) + Logger.debug("%s, received: %s, calculated: %s" % (di, self.checksum, d)) if d != self.checksum: raise IllegalEventException("wrong checksum for event %s" % str(self)) + entry.lastEventTime = self.msgTime + entry.address = self.address + Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address)) + try: + Event.dnsq.put_nowait(entry) + except Queue.Full, e: + Logger.log("Dns Queue overrun, drop event for %s" % str(entry)) - if entry.address == self.address: - entry.lastEventTime = self.msgTime - Logger.log("Same address, nothing to do.") - else: - entry.lastEventTime = self.msgTime - entry.address = self.address - Logger.log("Set in DNS: %s -> %s" % (entry.name, entry.address)) - try: - Event.dnsq.put_nowait(entry) - except Queue.Full, e: - Logger.log("Dns Queue overrun, drop event for %s" % str(entry)) - def __str__(self): diff --git a/server/yadyn b/server/yadyn index 91c8cc0..347ba53 100755 --- a/server/yadyn +++ b/server/yadyn @@ -52,8 +52,7 @@ if DEBUG: Logger.log("yadyn starting") entries = shelve.open(ENTRIES_FILE, flag='c', writeback=True) -statusMap = shelve.open(STATUSMAP_FILE, flag='c', writeback=True) -Logger.debug("Shelves opened") +Logger.debug("Shelve opened") try: eventq = Queue.Queue() @@ -66,7 +65,7 @@ try: dynHandler.start() Logger.debug("DynHandler started") - dnsHandler = DnsHandler.DnsHandler(dnsq, TSIGKEY, NAMESERVER, TTL, statusMap) + dnsHandler = DnsHandler.DnsHandler(dnsq, TSIGKEY, NAMESERVER, TTL) dnsHandler.start() Logger.debug("DnsHandler started") @@ -85,7 +84,6 @@ try: Logger.log("yadyn running") while True: entries.sync() - statusMap.sync() time.sleep(10) finally: entries.close()