yadyn/server/DnsHandler.py
2007-11-13 11:44:47 +01:00

74 lines
2.3 KiB
Python

import dns
import dns.query
import dns.update
import dns.rdataclass
import dns.rdatatype
import dns.rdtypes.IN.A
import dns.tsigkeyring
import threading
from logger import Logger
class DnsHandler(threading.Thread):
def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap):
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)
def run(self):
while(True):
msg = self.msgQueue.get()
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(name, zone, self.statusMap[fullName])
self.insertARR(name, zone, address)
self.statusMap[fullName] = address
else:
self.insertARR(name, zone, address)
self.statusMap[fullName] = address
def insertARR(self, name, zone, address):
# send A-RR insertion for ip to DNS server
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)
r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0:
# failure
Logger.log("failure when inserting A-RR %s -> %s into %s" % (name, address, zone))
else:
# success
Logger.log("insert ARR %s -> %s into %s" % (name, address, zone))
def deleteARR(self, name, zone, address):
# send A-RR deletion for ip to DNS server
rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, address)
u = dns.update.Update(zone, keyring=self.keyring)
u.delete(name, rr)
r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0:
# failure
Logger.log("failure when deleting A-RR %s -> %s from %s" % (name, address, zone))
else:
# success
Logger.log("delete ARR %s -> %s from %s" % (name, address, zone))