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

@ -4,41 +4,38 @@ import dns.update
import dns.rdataclass 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
name = msg.name
zone = msg.zone
address = msg.address
fullName = name + '.' + zone if msg.address != msg.addressInDns:
try:
if self.statusMap.has_key(fullName): self.deleteARR(msg.dynid, msg.name, msg.zone, msg.addressInDns)
if self.statusMap[fullName] != address: self.insertARR(msg.dynid, msg.name, msg.zone, msg.address)
self.deleteARR(dynid, name, zone, self.statusMap[fullName]) Logger.log("Update: %s, %s.%s, %s -> %s" %
self.insertARR(dynid, name, zone, address) (msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address))
self.statusMap[fullName] = address msg.addressInDns = msg.address
else: except Exception, e:
self.insertARR(dynid, name, zone, address) Logger.log("Failure for %s when updating DNS: %s" % (str(msg), str(e)))
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,23 +50,18 @@ 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
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): def __str__(self):

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()