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
|
2007-11-16 17:45:39 +01:00
|
|
|
import time
|
2007-11-13 11:44:47 +01:00
|
|
|
from logger import Logger
|
|
|
|
|
2007-11-16 13:06:07 +01:00
|
|
|
class LocalDnsHandlerException(Exception):
|
|
|
|
def __init__(self, msg):
|
2008-08-12 16:18:57 +02:00
|
|
|
Exception.__init__(self, msg)
|
2007-11-12 11:17:25 +01:00
|
|
|
|
|
|
|
class DnsHandler(threading.Thread):
|
2007-11-16 17:45:39 +01:00
|
|
|
def __init__(self, msgQueue, dnsDummy, tsigKey, nsAddress, ttl, actionlogDir):
|
2007-11-12 11:17:25 +01:00
|
|
|
threading.Thread.__init__(self)
|
|
|
|
self.msgQueue = msgQueue
|
2008-08-12 16:18:57 +02:00
|
|
|
self.dnsDummy = dnsDummy
|
2007-11-12 11:17:25 +01:00
|
|
|
self.nsAddress = nsAddress
|
|
|
|
self.ttl = ttl
|
|
|
|
self.keyring = dns.tsigkeyring.from_text(tsigKey)
|
2008-08-12 16:18:57 +02:00
|
|
|
self.actionlogDir = actionlogDir
|
|
|
|
self.setDaemon(True)
|
2007-11-13 11:44:47 +01:00
|
|
|
|
2007-11-16 17:45:39 +01:00
|
|
|
def writeActionlog(self, dynid, name, zone, oldAddr, newAddr):
|
2008-08-12 16:18:57 +02:00
|
|
|
f = open("%s/%s" % (self.actionlogDir, dynid), 'a')
|
|
|
|
f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr))
|
|
|
|
f.close()
|
2007-11-12 11:17:25 +01:00
|
|
|
|
|
|
|
def run(self):
|
|
|
|
while(True):
|
|
|
|
msg = self.msgQueue.get()
|
|
|
|
|
2008-08-12 16:18:57 +02:00
|
|
|
if msg.address != msg.addressInDns:
|
|
|
|
try:
|
|
|
|
self.deleteARR(msg.dynid, msg.name, msg.zone)
|
|
|
|
self.insertARR(msg.dynid, msg.name, msg.zone, msg.address)
|
|
|
|
self.writeActionlog(msg.dynid, msg.name, msg.zone, msg.addressInDns, 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):
|
2008-08-12 16:18:57 +02:00
|
|
|
if self.dnsDummy:
|
|
|
|
return
|
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)
|
|
|
|
|
2008-08-12 16:18:57 +02:00
|
|
|
rc = r.rcode()
|
2007-11-16 13:06:07 +01:00
|
|
|
if rc != 0:
|
2008-08-12 16:18:57 +02:00
|
|
|
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):
|
2008-08-12 16:18:57 +02:00
|
|
|
if self.dnsDummy:
|
|
|
|
return
|
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)
|
|
|
|
|
2008-08-12 16:18:57 +02:00
|
|
|
rc = r.rcode()
|
2007-11-16 13:06:07 +01:00
|
|
|
if rc != 0:
|
2008-08-12 16:18:57 +02:00
|
|
|
raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))
|
2007-11-12 11:17:25 +01:00
|
|
|
|