changes
This commit is contained in:
105
server/yadyn
105
server/yadyn
@ -5,6 +5,8 @@ import Queue
|
|||||||
import threading
|
import threading
|
||||||
import md5
|
import md5
|
||||||
import time
|
import time
|
||||||
|
import dns
|
||||||
|
|
||||||
|
|
||||||
class Entry(object):
|
class Entry(object):
|
||||||
def __init__(self, dynid, sharedSecret, name):
|
def __init__(self, dynid, sharedSecret, name):
|
||||||
@ -103,12 +105,115 @@ class Expirer(threading.Thread):
|
|||||||
time.sleep(10)
|
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 = {
|
ENTRIES = {
|
||||||
'testhost': Entry('testhost,', 'test123', 'test.test.de'),
|
'testhost': Entry('testhost,', 'test123', 'test.test.de'),
|
||||||
}
|
}
|
||||||
MSG_TIME_CORRIDOR = 5
|
MSG_TIME_CORRIDOR = 5
|
||||||
EVENT_LIFE_TIME = 10
|
EVENT_LIFE_TIME = 10
|
||||||
NULL_ADDRESS = '0.0.0.0'
|
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()
|
q = Queue.Queue()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user