This commit is contained in:
Wolfgang Hottgenroth 2007-11-12 09:47:41 +01:00
parent 8f6c07eca2
commit fbb070c940

View File

@ -5,6 +5,8 @@ import Queue
import threading
import md5
import time
import dns
class Entry(object):
def __init__(self, dynid, sharedSecret, name):
@ -101,6 +103,90 @@ class Expirer(threading.Thread):
entry.address = NULL_ADDRESS
print "Set in DNS: %s -> %s" % (entry.name, entry.address)
time.sleep(10)
class DnsManipulator(threading.Thread):
def __init__(self, msgQueue, notifyQueue, tsigKey, nsAddress, zone, name, ttl, exitServerIp):
threading.Thread.__init__(self)
self.msgQueue = msgQueue
self.notifyQueue = notifyQueue
self.exitServerIp = exitServerIp
self.statusMap = {}
self.exitServerFlag = True
self.nsAddress = nsAddress
self.zone = zone
self.name = name
self.ttl = ttl
self.keyring = dns.tsigkeyring.from_text(tsigKey)
def run(self):
while(True):
msg = self.msgQueue.get()
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))
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
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):
# 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)
r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0:
# failure
Logger.log("failure when inserting A-RR for %s" % ip)
else:
# success
pass
def deleteARR(self, ip):
# 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)
r = dns.query.tcp(u, self.nsAddress)
if r.rcode() != 0:
# failure
Logger.log("failure when deleting A-RR for %s" % ip)
else:
# success
pass
ENTRIES = {
@ -109,6 +195,25 @@ ENTRIES = {
MSG_TIME_CORRIDOR = 5
EVENT_LIFE_TIME = 10
NULL_ADDRESS = '0.0.0.0'
ZONE = 'contextmatters.de'
NAME = 'serve'
TTL = 120
NAMESERVER = '127.0.0.1'
TSIGKEY = { "monitoring." : "HYHN8l/dg1+q6QLOURp2qw==" }
EXITSERVER = '87.230.59.51'
FAILURE_THRESHOLD = 3
PERIOD = 10
FROM = "root@hottis.de"
TO = "dns-alarm@adinside.de"
SMTPHOST = "submission.hottis.de"
SMTPPORT = 25
SMTPLOGIN = "admon-adinside"
SMTPPASSWD = "test123"
DEBUG = False
PIDFILE = "/tmp/monitor.pid"
q = Queue.Queue()