changes
This commit is contained in:
@ -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))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user