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
|
|
|
|
import dns.tsigkeyring
|
|
|
|
import threading
|
|
|
|
from logger import Logger
|
|
|
|
|
2007-11-12 11:17:25 +01:00
|
|
|
|
|
|
|
class DnsHandler(threading.Thread):
|
2007-11-13 11:44:47 +01:00
|
|
|
def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap):
|
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-13 11:44:47 +01:00
|
|
|
self.statusMap = statusMap
|
|
|
|
self.setDaemon(True)
|
|
|
|
|
2007-11-12 11:17:25 +01:00
|
|
|
|
|
|
|
def run(self):
|
|
|
|
while(True):
|
|
|
|
msg = self.msgQueue.get()
|
|
|
|
|
2007-11-16 09:19:26 +01:00
|
|
|
dynid = msg.dynid
|
|
|
|
name = msg.name
|
2007-11-13 11:44:47 +01:00
|
|
|
zone = msg.zone
|
|
|
|
address = msg.address
|
2007-11-12 11:17:25 +01:00
|
|
|
|
2007-11-13 11:44:47 +01:00
|
|
|
fullName = name + '.' + zone
|
2007-11-12 11:17:25 +01:00
|
|
|
|
2007-11-13 11:44:47 +01:00
|
|
|
if self.statusMap.has_key(fullName):
|
|
|
|
if self.statusMap[fullName] != address:
|
2007-11-16 09:19:26 +01:00
|
|
|
self.deleteARR(dynid, name, zone, self.statusMap[fullName])
|
|
|
|
self.insertARR(dynid, name, zone, address)
|
2007-11-13 11:44:47 +01:00
|
|
|
self.statusMap[fullName] = address
|
|
|
|
else:
|
2007-11-16 09:19:26 +01:00
|
|
|
self.insertARR(dynid, name, zone, address)
|
2007-11-13 11:44:47 +01:00
|
|
|
self.statusMap[fullName] = address
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
if r.rcode() != 0:
|
|
|
|
# failure
|
2007-11-16 09:19:26 +01:00
|
|
|
Logger.log("failure for %s when inserting A-RR %s -> %s into %s" %
|
|
|
|
(dynid, name, address, zone))
|
2007-11-12 11:17:25 +01:00
|
|
|
else:
|
|
|
|
# success
|
2007-11-16 09:19:26 +01:00
|
|
|
Logger.log("insert for %s ARR %s -> %s into %s" %
|
|
|
|
(dynid, name, address, zone))
|
2007-11-12 11:17:25 +01:00
|
|
|
|
2007-11-13 11:44:47 +01:00
|
|
|
|
2007-11-16 09:19:26 +01:00
|
|
|
def deleteARR(self, dynid, name, zone, address):
|
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
|
|
|
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)
|
2007-11-12 11:17:25 +01:00
|
|
|
r = dns.query.tcp(u, self.nsAddress)
|
|
|
|
|
|
|
|
if r.rcode() != 0:
|
|
|
|
# failure
|
2007-11-16 09:19:26 +01:00
|
|
|
Logger.log("failure for %s when deleting A-RR %s -> %s from %s" %
|
|
|
|
(dynid, name, address, zone))
|
2007-11-12 11:17:25 +01:00
|
|
|
else:
|
|
|
|
# success
|
2007-11-16 09:19:26 +01:00
|
|
|
Logger.log("delete for %s ARR %s -> %s from %s" %
|
|
|
|
(dynid, name, address, zone))
|
2007-11-13 11:44:47 +01:00
|
|
|
|
2007-11-12 11:17:25 +01:00
|
|
|
|
|
|
|
|