From fbb070c94022ee8feb202b8d6a19e9348bbbfbb1 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 12 Nov 2007 09:47:41 +0100 Subject: [PATCH] changes --- server/yadyn | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/server/yadyn b/server/yadyn index dccea0e..c547621 100755 --- a/server/yadyn +++ b/server/yadyn @@ -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()