yadyn/server/DnsHandler.py

63 lines
2.0 KiB
Python
Raw Normal View History

2007-11-12 11:17:25 +01:00
import dns
2007-11-13 11:44:47 +01:00
import dns.query
import dns.update
import dns.rdataclass
import dns.rdatatype
import dns.rdtypes.IN.A
2007-11-16 13:06:07 +01:00
import dns.tsigkeyring
import dns.rcode
2007-11-13 11:44:47 +01:00
import threading
from logger import Logger
2007-11-16 13:06:07 +01:00
class LocalDnsHandlerException(Exception):
def __init__(self, msg):
Exception.__init__(self, msg)
2007-11-12 11:17:25 +01:00
class DnsHandler(threading.Thread):
2007-11-16 13:06:07 +01:00
def __init__(self, msgQueue, tsigKey, nsAddress, ttl):
2007-11-12 11:17:25 +01:00
threading.Thread.__init__(self)
self.msgQueue = msgQueue
self.nsAddress = nsAddress
self.ttl = ttl
self.keyring = dns.tsigkeyring.from_text(tsigKey)
2007-11-16 13:06:07 +01:00
self.setDaemon(True)
2007-11-13 11:44:47 +01:00
2007-11-12 11:17:25 +01:00
def run(self):
while(True):
msg = self.msgQueue.get()
2007-11-16 13:06:07 +01:00
if msg.address != msg.addressInDns:
try:
2007-11-16 15:59:59 +01:00
self.deleteARR(msg.dynid, msg.name, msg.zone)
2007-11-16 13:06:07 +01:00
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)))
2007-11-13 11:44:47 +01:00
2007-11-12 11:17:25 +01:00
2007-11-16 09:19:26 +01:00
def insertARR(self, dynid, name, zone, address):
2007-11-12 11:17:25 +01:00
# send A-RR insertion for ip to DNS server
2007-11-13 11:44:47 +01:00
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)
2007-11-12 11:17:25 +01:00
r = dns.query.tcp(u, self.nsAddress)
2007-11-16 13:06:07 +01:00
rc = r.rcode()
if rc != 0:
raise LocalDnsHandlerException("failure when inserting: %d, %s" % (rc, dns.rcode.to_text(rc)))
2007-11-12 11:17:25 +01:00
2007-11-13 11:44:47 +01:00
2007-11-16 15:59:59 +01:00
def deleteARR(self, dynid, name, zone):
2007-11-12 11:17:25 +01:00
# send A-RR deletion for ip to DNS server
2007-11-13 11:44:47 +01:00
u = dns.update.Update(zone, keyring=self.keyring)
2007-11-16 15:59:59 +01:00
u.delete(name)
2007-11-12 11:17:25 +01:00
r = dns.query.tcp(u, self.nsAddress)
2007-11-16 13:06:07 +01:00
rc = r.rcode()
if rc != 0:
raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))
2007-11-12 11:17:25 +01:00