(no commit message)

This commit is contained in:
wn 2008-08-12 16:18:57 +02:00
parent c45651cfe3
commit fcd8901bb9
7 changed files with 196 additions and 179 deletions

View File

@ -2,6 +2,7 @@ import SocketServer
import threading
import cmd
import sys
import time
import Entry
from logger import Logger
@ -9,109 +10,125 @@ from logger import Logger
class LocalMyCmdException(Exception):
def __init__(self, msg):
self.msg = msg
self.msg = msg
class MyCmd(cmd.Cmd):
@classmethod
def setClassParams(cls, entries, adminPwd):
cls.entries = entries
cls.adminPwd = adminPwd
cls.entries = entries
cls.adminPwd = adminPwd
def __init__(self, i, o):
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
cmd.Cmd.use_rawinput = False
self.intro = "Hello at the yadyn cli\n"
self.prompt = "yadyn> "
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
cmd.Cmd.use_rawinput = False
self.intro = "Hello at the yadyn cli\n"
self.prompt = "yadyn> "
def do_list(self, l):
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
x = parts[0]
if x == 'all':
for entry in MyCmd.entries.values():
self.stdout.write(str(entry) + "\n")
elif MyCmd.entries.has_key(x):
self.stdout.write(str(MyCmd.entries[x]) + "\n")
else:
raise LocalMyCmdException("unknown dynid")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
x = parts[0]
if x == 'all':
for entry in MyCmd.entries.values():
self.stdout.write(str(entry) + "\n")
elif MyCmd.entries.has_key(x):
self.stdout.write(str(MyCmd.entries[x]) + "\n")
else:
raise LocalMyCmdException("unknown dynid")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_reset(self, l):
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
x = parts[0]
if MyCmd.entries.has_key(x):
entries[x].address = '0.0.0.0'
entries[x].addressInDns = '0.0.0.0'
entries[x].lastEventTime = int(time.time())
self.stdout.write(str(MyCmd.entries[x]) + "\n")
else:
raise LocalMyCmdException("unknown dynid")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_add(self, l):
try:
parts = l.split(' ')
if len(parts) != 4:
raise LocalMyCmdException("illegal number of arguments")
(dynid, name, zone, sharedSecret) = parts
if MyCmd.entries.has_key(dynid):
raise LocalMyCmdException("duplicate dynid")
for entry in MyCmd.entries.values():
if entry.name == name and entry.zone == zone:
raise LocalMyCmdException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, name, zone)
MyCmd.entries[dynid] = newEntry
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
try:
parts = l.split(' ')
if len(parts) != 4:
raise LocalMyCmdException("illegal number of arguments")
(dynid, name, zone, sharedSecret) = parts
if MyCmd.entries.has_key(dynid):
raise LocalMyCmdException("duplicate dynid")
for entry in MyCmd.entries.values():
if entry.name == name and entry.zone == zone:
raise LocalMyCmdException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, name, zone)
MyCmd.entries[dynid] = newEntry
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_edit(self, l):
try:
parts = l.split(' ')
if len(parts) != 3:
raise LocalMyCmdException("illegal number of arguments")
(dynid, attr, value) = parts
if not MyCmd.entries.has_key(dynid):
raise LocalMyCmdException("unknown dynid")
if attr == 'sharedSecret':
MyCmd.entries[dynid].sharedSecret = value
elif attr == 'name':
MyCmd.entries[dynid].name = value
else:
raise LocalMyCmdException("unknown attribute to change")
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
try:
parts = l.split(' ')
if len(parts) != 3:
raise LocalMyCmdException("illegal number of arguments")
(dynid, attr, value) = parts
if not MyCmd.entries.has_key(dynid):
raise LocalMyCmdException("unknown dynid")
if attr == 'sharedSecret':
MyCmd.entries[dynid].sharedSecret = value
elif attr == 'name':
MyCmd.entries[dynid].name = value
else:
raise LocalMyCmdException("unknown attribute to change")
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_delete(self, l):
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
x = parts[0]
if not MyCmd.entries.has_key(x):
raise LocalMyCmdException("unknown dynid")
del MyCmd.entries[x]
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
x = parts[0]
if not MyCmd.entries.has_key(x):
raise LocalMyCmdException("unknown dynid")
del MyCmd.entries[x]
self.stdout.write("Done\n")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_debug(self, l):
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
if parts[0] == 'on':
Logger.debugEnable()
elif parts[0] == 'off':
Logger.debugDisable()
else:
raise LocalMyCmdException("illegal argument")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
try:
parts = l.split(' ')
if len(parts) != 1:
raise LocalMyCmdException("illegal number of arguments")
if parts[0] == 'on':
Logger.debugEnable()
elif parts[0] == 'off':
Logger.debugDisable()
else:
raise LocalMyCmdException("illegal argument")
except LocalMyCmdException, e:
self.stdout.write("Failure: %s\n" % str(e.msg))
def do_quit(self, l):
self.stdout.write("Bye\n")
return True
self.stdout.write("Bye\n")
return True
class CmdHandler(SocketServer.StreamRequestHandler):
def handle(self):
myCmd = MyCmd(self.rfile, self.wfile)
myCmd.cmdloop()
myCmd = MyCmd(self.rfile, self.wfile)
myCmd.cmdloop()
class CmdServer(SocketServer.ThreadingTCPServer):
@ -128,5 +145,5 @@ class CmdReceiver(threading.Thread):
self.setDaemon(True)
def run(self):
CmdServer(self.cmdAddr, CmdHandler).serve_forever()
CmdServer(self.cmdAddr, CmdHandler).serve_forever()

View File

@ -12,63 +12,63 @@ from logger import Logger
class LocalDnsHandlerException(Exception):
def __init__(self, msg):
Exception.__init__(self, msg)
Exception.__init__(self, msg)
class DnsHandler(threading.Thread):
def __init__(self, msgQueue, dnsDummy, tsigKey, nsAddress, ttl, actionlogDir):
threading.Thread.__init__(self)
self.msgQueue = msgQueue
self.dnsDummy = dnsDummy
self.dnsDummy = dnsDummy
self.nsAddress = nsAddress
self.ttl = ttl
self.keyring = dns.tsigkeyring.from_text(tsigKey)
self.actionlogDir = actionlogDir
self.setDaemon(True)
self.actionlogDir = actionlogDir
self.setDaemon(True)
def writeActionlog(self, dynid, name, zone, oldAddr, newAddr):
f = open("%s/%s" % (self.actionlogDir, dynid), 'a')
f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr))
f.close()
f = open("%s/%s" % (self.actionlogDir, dynid), 'a')
f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr))
f.close()
def run(self):
while(True):
msg = self.msgQueue.get()
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)))
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)))
def insertARR(self, dynid, name, zone, address):
if self.dnsDummy:
return
if self.dnsDummy:
return
# send A-RR insertion for ip to DNS server
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)
rc = r.rcode()
rc = r.rcode()
if rc != 0:
raise LocalDnsHandlerException("failure when inserting: %d, %s" % (rc, dns.rcode.to_text(rc)))
raise LocalDnsHandlerException("failure when inserting: %d, %s" % (rc, dns.rcode.to_text(rc)))
def deleteARR(self, dynid, name, zone):
if self.dnsDummy:
return
if self.dnsDummy:
return
# send A-RR deletion for ip to DNS server
u = dns.update.Update(zone, keyring=self.keyring)
u.delete(name)
r = dns.query.tcp(u, self.nsAddress)
rc = r.rcode()
rc = r.rcode()
if rc != 0:
raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))
raise LocalDnsHandlerException("failure when deleting: %d, %s" % (rc, dns.rcode.to_text(rc)))

View File

@ -7,7 +7,7 @@ class Entry(object):
self.zone = zone
self.lastEventTime = 0
self.address = '0.0.0.0'
self.addressInDns = '0.0.0.0'
self.addressInDns = '0.0.0.0'
def __str__(self):
return "dynid=%s, name=%s, zone=%s, sharedSecret=%s, address=%s (%s), lastEventTime=%d" % (self.dynid, self.name, self.zone, self.sharedSecret, self.address, self.addressInDns, self.lastEventTime)

View File

@ -54,13 +54,13 @@ class Event(object):
if d != self.checksum:
raise IllegalEventException("wrong checksum for event %s" % str(self))
entry.lastEventTime = self.msgTime
entry.address = self.address
Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
try:
Event.dnsq.put_nowait(entry)
except Queue.Full, e:
Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
entry.lastEventTime = self.msgTime
entry.address = self.address
Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
try:
Event.dnsq.put_nowait(entry)
except Queue.Full, e:
Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
def __str__(self):
if not self.prepared:

View File

@ -11,71 +11,71 @@ import Entry
class LocalException(Exception):
def __init__(self, msg):
Logger.log("Exception in HttpCmdReceiver: %s" % msg)
self.msg = msg
Logger.log("Exception in HttpCmdReceiver: %s" % msg)
self.msg = msg
class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
server_version = "YadynCMDHTTP/1.0"
@classmethod
def setClassParams(cls, entries, adminPwd):
cls.entries = entries
cls.adminPwd = adminPwd
cls.entries = entries
cls.adminPwd = adminPwd
def do_GET(self):
Logger.log("Request: %s" % self.path)
try:
if self.command == "GET":
q = urlparse.urlparse(self.path).query
c = cgi.parse_qs(q)
if not c.has_key('c'):
raise LocalException('no cmd given')
cmd = c['c'][0]
Logger.log("Cmd: " + cmd)
if cmd == 'register':
self.register(c)
else:
raise LocalException('unknown cmd')
Logger.log("Request: %s" % self.path)
try:
if self.command == "GET":
q = urlparse.urlparse(self.path).query
c = cgi.parse_qs(q)
if not c.has_key('c'):
raise LocalException('no cmd given')
cmd = c['c'][0]
Logger.log("Cmd: " + cmd)
if cmd == 'register':
self.register(c)
else:
raise LocalException('unknown cmd')
self.send_response(200, "OK")
self.end_headers()
except LocalException, e:
self.send_response(400, e.msg)
self.end_headers()
self.send_response(200, "OK")
self.end_headers()
except LocalException, e:
self.send_response(400, e.msg)
self.end_headers()
def register(self, c):
try:
subdomain = c['subdomain'][0]
sharedSecret = c['sharedsecret'][0]
except KeyError, e:
raise LocalException('Parameter missing: ' + str(e))
try:
subdomain = c['subdomain'][0]
sharedSecret = c['sharedsecret'][0]
except KeyError, e:
raise LocalException('Parameter missing: ' + str(e))
dynid = subdomain
zone = 'yadynns.net'
if HttpCmdHandler.entries.has_key(dynid):
raise LocalException("duplicate dynid")
for entry in HttpCmdHandler.entries.values():
if entry.name == subdomain and entry.zone == zone:
raise LocalException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
HttpCmdHandler.entries[dynid] = newEntry
dynid = subdomain
zone = 'yadynns.net'
if HttpCmdHandler.entries.has_key(dynid):
raise LocalException("duplicate dynid")
for entry in HttpCmdHandler.entries.values():
if entry.name == subdomain and entry.zone == zone:
raise LocalException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
HttpCmdHandler.entries[dynid] = newEntry
class HttpCmdServer(SocketServer.ThreadingTCPServer):
def __init__(self, serverAddr):
self.allow_reuse_address = True
SocketServer.ThreadingTCPServer.__init__(self, serverAddr, HttpCmdHandler)
self.allow_reuse_address = True
SocketServer.ThreadingTCPServer.__init__(self, serverAddr, HttpCmdHandler)
class HttpCmdReceiver(threading.Thread):
def __init__(self, httpCmdRecvAddr, entries, adminPwd):
threading.Thread.__init__(self)
self.httpCmdRecvAddr = httpCmdRecvAddr
HttpCmdHandler.setClassParams(entries, adminPwd)
HttpCmdHandler.setClassParams(entries, adminPwd)
self.setDaemon(True)
def run(self):
server = HttpCmdServer(self.httpCmdRecvAddr)
server.serve_forever()
server = HttpCmdServer(self.httpCmdRecvAddr)
server.serve_forever()

View File

@ -8,13 +8,13 @@ import Entry
class LocalException(Exception):
def __init__(self, msg):
self.msg = msg
self.msg = msg
class XmlRpcServer(SimpleXMLRPCServer):
@classmethod
def setClassParams(cls, entries, adminPwd):
cls.entries = entries
cls.adminPwd = adminPwd
cls.entries = entries
cls.adminPwd = adminPwd
def _dispatch(self, method, params):
@ -29,21 +29,21 @@ class XmlRpcServer(SimpleXMLRPCServer):
return func(*params)
def export_register(self, subdomain, sharedSecret, email):
try:
dynid = subdomain
zone = 'yadynns.net'
if XmlRpcServer.entries.has_key(dynid):
raise LocalException("duplicate dynid")
for entry in XmlRpcServer.entries.values():
if entry.name == subdomain and entry.zone == zone:
raise LocalException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
XmlRpcServer.entries[dynid] = newEntry
return 'ok'
except LocalException, e:
return 'not ok ' + e.msg
try:
dynid = subdomain
zone = 'yadynns.net'
if XmlRpcServer.entries.has_key(dynid):
raise LocalException("duplicate dynid")
for entry in XmlRpcServer.entries.values():
if entry.name == subdomain and entry.zone == zone:
raise LocalException("duplicate full name")
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
XmlRpcServer.entries[dynid] = newEntry
return 'ok'
except LocalException, e:
return 'not ok ' + e.msg
@ -53,10 +53,10 @@ class XmlRpcReceiver(threading.Thread):
def __init__(self, xmlRpcRecvAddr, entries, adminPwd):
threading.Thread.__init__(self)
self.xmlRpcRecvAddr = xmlRpcRecvAddr
XmlRpcServer.setClassParams(entries, adminPwd)
XmlRpcServer.setClassParams(entries, adminPwd)
self.setDaemon(True)
def run(self):
server = XmlRpcServer(self.xmlRpcRecvAddr)
server.serve_forever()
server = XmlRpcServer(self.xmlRpcRecvAddr)
server.serve_forever()

View File

@ -11,7 +11,7 @@ class Logger(object):
@staticmethod
def debug(data):
if Logger.debugFlag:
syslog.syslog(syslog.LOG_DEBUG, data)
syslog.syslog(syslog.LOG_DEBUG, data)
print data
@staticmethod
@ -24,7 +24,7 @@ class Logger(object):
@staticmethod
def debugDisable():
Logger.debugFlag = False
Logger.debugFlag = False
debugFlag = False