changes
This commit is contained in:
@ -1,80 +1,73 @@
|
||||
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, nullIp):
|
||||
def __init__(self, msgQueue, tsigKey, nsAddress, ttl, statusMap):
|
||||
threading.Thread.__init__(self)
|
||||
self.msgQueue = msgQueue
|
||||
self.nullIp = nullIp
|
||||
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
|
||||
|
||||
if msg.successFlag:
|
||||
# success
|
||||
Logger.dbg("DnsManipulator: retrieved positive message")
|
||||
if not self.statusMap.has_key(msg.ip) or not self.statusMap[msg.ip]:
|
||||
self.statusMap[msg.ip] = True
|
||||
self.insertARR(msg.ip)
|
||||
|
||||
self.notifyQueue.put(NotificationMessage("Server returned", "Server %s is back" % msg.ip))
|
||||
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:
|
||||
# failure
|
||||
Logger.dbg("DnsManipulator: retrieved negative message")
|
||||
if not self.statusMap.has_key(msg.ip) or self.statusMap[msg.ip]:
|
||||
self.statusMap[msg.ip] = False
|
||||
self.deleteARR(msg.ip)
|
||||
|
||||
self.notifyQueue.put(NotificationMessage("Server unavailable", "Server %s has gone" % msg.ip))
|
||||
|
||||
failureCnt = 0
|
||||
for v in self.statusMap.values():
|
||||
if not v:
|
||||
failureCnt += 1
|
||||
|
||||
if failureCnt > 0 and not self.exitServerFlag:
|
||||
self.insertARR(self.exitServerIp)
|
||||
self.exitServerFlag = True
|
||||
self.insertARR(name, zone, address)
|
||||
self.statusMap[fullName] = address
|
||||
|
||||
if failureCnt == 0 and self.exitServerFlag:
|
||||
self.deleteARR(self.exitServerIp)
|
||||
self.exitServerFlag = False
|
||||
|
||||
self.notifyQueue.put(NotificationMessage("All clear", "All clear, exit-server removed from DNS"))
|
||||
|
||||
def insertARR(self, ip):
|
||||
def insertARR(self, name, zone, address):
|
||||
# send A-RR insertion for ip to DNS server
|
||||
Logger.log("insert ARR %s" % ip)
|
||||
|
||||
rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, ip)
|
||||
u = dns.update.Update(self.zone, keyring=self.keyring)
|
||||
u.add(self.name, self.ttl, rr)
|
||||
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 for %s" % ip)
|
||||
Logger.log("failure when inserting A-RR %s -> %s into %s" % (name, address, zone))
|
||||
else:
|
||||
# success
|
||||
pass
|
||||
Logger.log("insert ARR %s -> %s into %s" % (name, address, zone))
|
||||
|
||||
def deleteARR(self, ip):
|
||||
|
||||
def deleteARR(self, name, zone, address):
|
||||
# send A-RR deletion for ip to DNS server
|
||||
Logger.log("delete ARR %s" % ip)
|
||||
|
||||
rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, ip)
|
||||
u = dns.update.Update(self.zone, keyring=self.keyring)
|
||||
u.delete(self.name, rr)
|
||||
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 for %s" % ip)
|
||||
Logger.log("failure when deleting A-RR %s -> %s from %s" % (name, address, zone))
|
||||
else:
|
||||
# success
|
||||
pass
|
||||
Logger.log("delete ARR %s -> %s from %s" % (name, address, zone))
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user