This commit is contained in:
Wolfgang Hottgenroth
2007-11-16 13:06:07 +01:00
parent b370beb829
commit 9f4a43c2e1
4 changed files with 37 additions and 56 deletions

View File

@ -5,40 +5,37 @@ import dns.rdataclass
import dns.rdatatype import dns.rdatatype
import dns.rdtypes.IN.A import dns.rdtypes.IN.A
import dns.tsigkeyring import dns.tsigkeyring
import dns.rcode
import threading import threading
from logger import Logger from logger import Logger
class LocalDnsHandlerException(Exception):
def __init__(self, msg):
Exception.__init__(self, msg)
class DnsHandler(threading.Thread): class DnsHandler(threading.Thread):
def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap): def __init__(self, msgQueue, tsigKey, nsAddress, ttl):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.msgQueue = msgQueue self.msgQueue = msgQueue
self.nsAddress = nsAddress self.nsAddress = nsAddress
self.ttl = ttl self.ttl = ttl
self.keyring = dns.tsigkeyring.from_text(tsigKey) self.keyring = dns.tsigkeyring.from_text(tsigKey)
self.statusMap = statusMap self.setDaemon(True)
self.setDaemon(True)
def run(self): def run(self):
while(True): while(True):
msg = self.msgQueue.get() msg = self.msgQueue.get()
dynid = msg.dynid if msg.address != msg.addressInDns:
name = msg.name try:
zone = msg.zone self.deleteARR(msg.dynid, msg.name, msg.zone, msg.addressInDns)
address = msg.address self.insertARR(msg.dynid, msg.name, msg.zone, msg.address)
Logger.log("Update: %s, %s.%s, %s -> %s" %
fullName = name + '.' + zone (msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address))
msg.addressInDns = msg.address
if self.statusMap.has_key(fullName): except Exception, e:
if self.statusMap[fullName] != address: Logger.log("Failure for %s when updating DNS: %s" % (str(msg), str(e)))
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): def insertARR(self, dynid, name, zone, address):
@ -48,14 +45,9 @@ class DnsHandler(threading.Thread):
u.add(name, self.ttl, rr) u.add(name, self.ttl, rr)
r = dns.query.tcp(u, self.nsAddress) r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0: rc = r.rcode()
# failure if rc != 0:
Logger.log("failure for %s when inserting A-RR %s -> %s into %s" % raise LocalDnsHandlerException("failure when inserting: %d, %s" % (rc, dns.rcode.to_text(rc)))
(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): def deleteARR(self, dynid, name, zone, address):
@ -65,14 +57,7 @@ class DnsHandler(threading.Thread):
u.delete(name, rr) u.delete(name, rr)
r = dns.query.tcp(u, self.nsAddress) r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0: rc = r.rcode()
# failure if rc != 0:
Logger.log("failure for %s when deleting A-RR %s -> %s from %s" % raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))
(dynid, name, address, zone))
else:
# success
Logger.log("delete for %s ARR %s -> %s from %s" %
(dynid, name, address, zone))

View File

@ -6,8 +6,11 @@ class Entry(object):
self.name = name self.name = name
self.zone = zone self.zone = zone
self.lastEventTime = 0 self.lastEventTime = 0
self.address = '' self.address = '0.0.0.0'
self.addressInDns = '0.0.0.0'
def __str__(self): 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)

View File

@ -50,22 +50,17 @@ class Event(object):
di = "%s %s %d" % (self.dynid, entry.sharedSecret, self.msgTime) di = "%s %s %d" % (self.dynid, entry.sharedSecret, self.msgTime)
d = md5.new(di).hexdigest() 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: if d != self.checksum:
raise IllegalEventException("wrong checksum for event %s" % str(self)) raise IllegalEventException("wrong checksum for event %s" % str(self))
entry.lastEventTime = self.msgTime
if entry.address == self.address: entry.address = self.address
entry.lastEventTime = self.msgTime Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
Logger.log("Same address, nothing to do.") try:
else: Event.dnsq.put_nowait(entry)
entry.lastEventTime = self.msgTime except Queue.Full, e:
entry.address = self.address Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
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))

View File

@ -52,8 +52,7 @@ if DEBUG:
Logger.log("yadyn starting") Logger.log("yadyn starting")
entries = shelve.open(ENTRIES_FILE, flag='c', writeback=True) entries = shelve.open(ENTRIES_FILE, flag='c', writeback=True)
statusMap = shelve.open(STATUSMAP_FILE, flag='c', writeback=True) Logger.debug("Shelve opened")
Logger.debug("Shelves opened")
try: try:
eventq = Queue.Queue() eventq = Queue.Queue()
@ -66,7 +65,7 @@ try:
dynHandler.start() dynHandler.start()
Logger.debug("DynHandler started") Logger.debug("DynHandler started")
dnsHandler = DnsHandler.DnsHandler(dnsq, TSIGKEY, NAMESERVER, TTL, statusMap) dnsHandler = DnsHandler.DnsHandler(dnsq, TSIGKEY, NAMESERVER, TTL)
dnsHandler.start() dnsHandler.start()
Logger.debug("DnsHandler started") Logger.debug("DnsHandler started")
@ -85,7 +84,6 @@ try:
Logger.log("yadyn running") Logger.log("yadyn running")
while True: while True:
entries.sync() entries.sync()
statusMap.sync()
time.sleep(10) time.sleep(10)
finally: finally:
entries.close() entries.close()