(no commit message)
This commit is contained in:
@ -2,6 +2,7 @@ import SocketServer
|
|||||||
import threading
|
import threading
|
||||||
import cmd
|
import cmd
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
import Entry
|
import Entry
|
||||||
from logger import Logger
|
from logger import Logger
|
||||||
@ -9,109 +10,125 @@ from logger import Logger
|
|||||||
|
|
||||||
class LocalMyCmdException(Exception):
|
class LocalMyCmdException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
|
|
||||||
class MyCmd(cmd.Cmd):
|
class MyCmd(cmd.Cmd):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd):
|
def setClassParams(cls, entries, adminPwd):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
cls.adminPwd = adminPwd
|
||||||
|
|
||||||
def __init__(self, i, o):
|
def __init__(self, i, o):
|
||||||
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
|
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
|
||||||
cmd.Cmd.use_rawinput = False
|
cmd.Cmd.use_rawinput = False
|
||||||
self.intro = "Hello at the yadyn cli\n"
|
self.intro = "Hello at the yadyn cli\n"
|
||||||
self.prompt = "yadyn> "
|
self.prompt = "yadyn> "
|
||||||
|
|
||||||
def do_list(self, l):
|
def do_list(self, l):
|
||||||
try:
|
try:
|
||||||
parts = l.split(' ')
|
parts = l.split(' ')
|
||||||
if len(parts) != 1:
|
if len(parts) != 1:
|
||||||
raise LocalMyCmdException("illegal number of arguments")
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
x = parts[0]
|
x = parts[0]
|
||||||
if x == 'all':
|
if x == 'all':
|
||||||
for entry in MyCmd.entries.values():
|
for entry in MyCmd.entries.values():
|
||||||
self.stdout.write(str(entry) + "\n")
|
self.stdout.write(str(entry) + "\n")
|
||||||
elif MyCmd.entries.has_key(x):
|
elif MyCmd.entries.has_key(x):
|
||||||
self.stdout.write(str(MyCmd.entries[x]) + "\n")
|
self.stdout.write(str(MyCmd.entries[x]) + "\n")
|
||||||
else:
|
else:
|
||||||
raise LocalMyCmdException("unknown dynid")
|
raise LocalMyCmdException("unknown dynid")
|
||||||
except LocalMyCmdException, e:
|
except LocalMyCmdException, e:
|
||||||
self.stdout.write("Failure: %s\n" % str(e.msg))
|
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):
|
def do_add(self, l):
|
||||||
try:
|
try:
|
||||||
parts = l.split(' ')
|
parts = l.split(' ')
|
||||||
if len(parts) != 4:
|
if len(parts) != 4:
|
||||||
raise LocalMyCmdException("illegal number of arguments")
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
(dynid, name, zone, sharedSecret) = parts
|
(dynid, name, zone, sharedSecret) = parts
|
||||||
if MyCmd.entries.has_key(dynid):
|
if MyCmd.entries.has_key(dynid):
|
||||||
raise LocalMyCmdException("duplicate dynid")
|
raise LocalMyCmdException("duplicate dynid")
|
||||||
for entry in MyCmd.entries.values():
|
for entry in MyCmd.entries.values():
|
||||||
if entry.name == name and entry.zone == zone:
|
if entry.name == name and entry.zone == zone:
|
||||||
raise LocalMyCmdException("duplicate full name")
|
raise LocalMyCmdException("duplicate full name")
|
||||||
newEntry = Entry.Entry(dynid, sharedSecret, name, zone)
|
newEntry = Entry.Entry(dynid, sharedSecret, name, zone)
|
||||||
MyCmd.entries[dynid] = newEntry
|
MyCmd.entries[dynid] = newEntry
|
||||||
self.stdout.write("Done\n")
|
self.stdout.write("Done\n")
|
||||||
except LocalMyCmdException, e:
|
except LocalMyCmdException, e:
|
||||||
self.stdout.write("Failure: %s\n" % str(e.msg))
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
def do_edit(self, l):
|
def do_edit(self, l):
|
||||||
try:
|
try:
|
||||||
parts = l.split(' ')
|
parts = l.split(' ')
|
||||||
if len(parts) != 3:
|
if len(parts) != 3:
|
||||||
raise LocalMyCmdException("illegal number of arguments")
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
(dynid, attr, value) = parts
|
(dynid, attr, value) = parts
|
||||||
if not MyCmd.entries.has_key(dynid):
|
if not MyCmd.entries.has_key(dynid):
|
||||||
raise LocalMyCmdException("unknown dynid")
|
raise LocalMyCmdException("unknown dynid")
|
||||||
if attr == 'sharedSecret':
|
if attr == 'sharedSecret':
|
||||||
MyCmd.entries[dynid].sharedSecret = value
|
MyCmd.entries[dynid].sharedSecret = value
|
||||||
elif attr == 'name':
|
elif attr == 'name':
|
||||||
MyCmd.entries[dynid].name = value
|
MyCmd.entries[dynid].name = value
|
||||||
else:
|
else:
|
||||||
raise LocalMyCmdException("unknown attribute to change")
|
raise LocalMyCmdException("unknown attribute to change")
|
||||||
self.stdout.write("Done\n")
|
self.stdout.write("Done\n")
|
||||||
except LocalMyCmdException, e:
|
except LocalMyCmdException, e:
|
||||||
self.stdout.write("Failure: %s\n" % str(e.msg))
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
def do_delete(self, l):
|
def do_delete(self, l):
|
||||||
try:
|
try:
|
||||||
parts = l.split(' ')
|
parts = l.split(' ')
|
||||||
if len(parts) != 1:
|
if len(parts) != 1:
|
||||||
raise LocalMyCmdException("illegal number of arguments")
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
x = parts[0]
|
x = parts[0]
|
||||||
if not MyCmd.entries.has_key(x):
|
if not MyCmd.entries.has_key(x):
|
||||||
raise LocalMyCmdException("unknown dynid")
|
raise LocalMyCmdException("unknown dynid")
|
||||||
del MyCmd.entries[x]
|
del MyCmd.entries[x]
|
||||||
self.stdout.write("Done\n")
|
self.stdout.write("Done\n")
|
||||||
except LocalMyCmdException, e:
|
except LocalMyCmdException, e:
|
||||||
self.stdout.write("Failure: %s\n" % str(e.msg))
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
def do_debug(self, l):
|
def do_debug(self, l):
|
||||||
try:
|
try:
|
||||||
parts = l.split(' ')
|
parts = l.split(' ')
|
||||||
if len(parts) != 1:
|
if len(parts) != 1:
|
||||||
raise LocalMyCmdException("illegal number of arguments")
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
if parts[0] == 'on':
|
if parts[0] == 'on':
|
||||||
Logger.debugEnable()
|
Logger.debugEnable()
|
||||||
elif parts[0] == 'off':
|
elif parts[0] == 'off':
|
||||||
Logger.debugDisable()
|
Logger.debugDisable()
|
||||||
else:
|
else:
|
||||||
raise LocalMyCmdException("illegal argument")
|
raise LocalMyCmdException("illegal argument")
|
||||||
except LocalMyCmdException, e:
|
except LocalMyCmdException, e:
|
||||||
self.stdout.write("Failure: %s\n" % str(e.msg))
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
|
|
||||||
def do_quit(self, l):
|
def do_quit(self, l):
|
||||||
self.stdout.write("Bye\n")
|
self.stdout.write("Bye\n")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CmdHandler(SocketServer.StreamRequestHandler):
|
class CmdHandler(SocketServer.StreamRequestHandler):
|
||||||
def handle(self):
|
def handle(self):
|
||||||
myCmd = MyCmd(self.rfile, self.wfile)
|
myCmd = MyCmd(self.rfile, self.wfile)
|
||||||
myCmd.cmdloop()
|
myCmd.cmdloop()
|
||||||
|
|
||||||
|
|
||||||
class CmdServer(SocketServer.ThreadingTCPServer):
|
class CmdServer(SocketServer.ThreadingTCPServer):
|
||||||
@ -128,5 +145,5 @@ class CmdReceiver(threading.Thread):
|
|||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
CmdServer(self.cmdAddr, CmdHandler).serve_forever()
|
CmdServer(self.cmdAddr, CmdHandler).serve_forever()
|
||||||
|
|
||||||
|
@ -12,63 +12,63 @@ from logger import Logger
|
|||||||
|
|
||||||
class LocalDnsHandlerException(Exception):
|
class LocalDnsHandlerException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
Exception.__init__(self, msg)
|
Exception.__init__(self, msg)
|
||||||
|
|
||||||
class DnsHandler(threading.Thread):
|
class DnsHandler(threading.Thread):
|
||||||
def __init__(self, msgQueue, dnsDummy, tsigKey, nsAddress, ttl, actionlogDir):
|
def __init__(self, msgQueue, dnsDummy, tsigKey, nsAddress, ttl, actionlogDir):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.msgQueue = msgQueue
|
self.msgQueue = msgQueue
|
||||||
self.dnsDummy = dnsDummy
|
self.dnsDummy = dnsDummy
|
||||||
self.nsAddress = nsAddress
|
self.nsAddress = nsAddress
|
||||||
self.ttl = ttl
|
self.ttl = ttl
|
||||||
self.keyring = dns.tsigkeyring.from_text(tsigKey)
|
self.keyring = dns.tsigkeyring.from_text(tsigKey)
|
||||||
self.actionlogDir = actionlogDir
|
self.actionlogDir = actionlogDir
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def writeActionlog(self, dynid, name, zone, oldAddr, newAddr):
|
def writeActionlog(self, dynid, name, zone, oldAddr, newAddr):
|
||||||
f = open("%s/%s" % (self.actionlogDir, dynid), 'a')
|
f = open("%s/%s" % (self.actionlogDir, dynid), 'a')
|
||||||
f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr))
|
f.write("%d %s.%s %s %s\n" % (time.time(), name, zone, oldAddr, newAddr))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
while(True):
|
while(True):
|
||||||
msg = self.msgQueue.get()
|
msg = self.msgQueue.get()
|
||||||
|
|
||||||
if msg.address != msg.addressInDns:
|
if msg.address != msg.addressInDns:
|
||||||
try:
|
try:
|
||||||
self.deleteARR(msg.dynid, msg.name, msg.zone)
|
self.deleteARR(msg.dynid, msg.name, msg.zone)
|
||||||
self.insertARR(msg.dynid, msg.name, msg.zone, msg.address)
|
self.insertARR(msg.dynid, msg.name, msg.zone, msg.address)
|
||||||
self.writeActionlog(msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address)
|
self.writeActionlog(msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address)
|
||||||
Logger.log("Update: %s, %s.%s, %s -> %s" %
|
Logger.log("Update: %s, %s.%s, %s -> %s" %
|
||||||
(msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address))
|
(msg.dynid, msg.name, msg.zone, msg.addressInDns, msg.address))
|
||||||
msg.addressInDns = msg.address
|
msg.addressInDns = msg.address
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
Logger.log("Failure for %s when updating DNS: %s" % (str(msg), str(e)))
|
Logger.log("Failure for %s when updating DNS: %s" % (str(msg), str(e)))
|
||||||
|
|
||||||
|
|
||||||
def insertARR(self, dynid, name, zone, address):
|
def insertARR(self, dynid, name, zone, address):
|
||||||
if self.dnsDummy:
|
if self.dnsDummy:
|
||||||
return
|
return
|
||||||
# send A-RR insertion for ip to DNS server
|
# send A-RR insertion for ip to DNS server
|
||||||
rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, address)
|
rr = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, address)
|
||||||
u = dns.update.Update(zone, keyring=self.keyring)
|
u = dns.update.Update(zone, keyring=self.keyring)
|
||||||
u.add(name, self.ttl, rr)
|
u.add(name, self.ttl, rr)
|
||||||
r = dns.query.tcp(u, self.nsAddress)
|
r = dns.query.tcp(u, self.nsAddress)
|
||||||
|
|
||||||
rc = r.rcode()
|
rc = r.rcode()
|
||||||
if rc != 0:
|
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):
|
def deleteARR(self, dynid, name, zone):
|
||||||
if self.dnsDummy:
|
if self.dnsDummy:
|
||||||
return
|
return
|
||||||
# send A-RR deletion for ip to DNS server
|
# send A-RR deletion for ip to DNS server
|
||||||
u = dns.update.Update(zone, keyring=self.keyring)
|
u = dns.update.Update(zone, keyring=self.keyring)
|
||||||
u.delete(name)
|
u.delete(name)
|
||||||
r = dns.query.tcp(u, self.nsAddress)
|
r = dns.query.tcp(u, self.nsAddress)
|
||||||
|
|
||||||
rc = r.rcode()
|
rc = r.rcode()
|
||||||
if rc != 0:
|
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)))
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ class Entry(object):
|
|||||||
self.zone = zone
|
self.zone = zone
|
||||||
self.lastEventTime = 0
|
self.lastEventTime = 0
|
||||||
self.address = '0.0.0.0'
|
self.address = '0.0.0.0'
|
||||||
self.addressInDns = '0.0.0.0'
|
self.addressInDns = '0.0.0.0'
|
||||||
|
|
||||||
def __str__(self):
|
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)
|
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)
|
||||||
|
@ -54,13 +54,13 @@ class Event(object):
|
|||||||
if d != self.checksum:
|
if d != self.checksum:
|
||||||
raise IllegalEventException("wrong checksum for event %s" % str(self))
|
raise IllegalEventException("wrong checksum for event %s" % str(self))
|
||||||
|
|
||||||
entry.lastEventTime = self.msgTime
|
entry.lastEventTime = self.msgTime
|
||||||
entry.address = self.address
|
entry.address = self.address
|
||||||
Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
|
Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
|
||||||
try:
|
try:
|
||||||
Event.dnsq.put_nowait(entry)
|
Event.dnsq.put_nowait(entry)
|
||||||
except Queue.Full, e:
|
except Queue.Full, e:
|
||||||
Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
|
Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if not self.prepared:
|
if not self.prepared:
|
||||||
|
@ -11,71 +11,71 @@ import Entry
|
|||||||
|
|
||||||
class LocalException(Exception):
|
class LocalException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
Logger.log("Exception in HttpCmdReceiver: %s" % msg)
|
Logger.log("Exception in HttpCmdReceiver: %s" % msg)
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
|
|
||||||
class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
server_version = "YadynCMDHTTP/1.0"
|
server_version = "YadynCMDHTTP/1.0"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd):
|
def setClassParams(cls, entries, adminPwd):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
cls.adminPwd = adminPwd
|
||||||
|
|
||||||
def do_GET(self):
|
def do_GET(self):
|
||||||
Logger.log("Request: %s" % self.path)
|
Logger.log("Request: %s" % self.path)
|
||||||
try:
|
try:
|
||||||
if self.command == "GET":
|
if self.command == "GET":
|
||||||
q = urlparse.urlparse(self.path).query
|
q = urlparse.urlparse(self.path).query
|
||||||
c = cgi.parse_qs(q)
|
c = cgi.parse_qs(q)
|
||||||
if not c.has_key('c'):
|
if not c.has_key('c'):
|
||||||
raise LocalException('no cmd given')
|
raise LocalException('no cmd given')
|
||||||
cmd = c['c'][0]
|
cmd = c['c'][0]
|
||||||
Logger.log("Cmd: " + cmd)
|
Logger.log("Cmd: " + cmd)
|
||||||
if cmd == 'register':
|
if cmd == 'register':
|
||||||
self.register(c)
|
self.register(c)
|
||||||
else:
|
else:
|
||||||
raise LocalException('unknown cmd')
|
raise LocalException('unknown cmd')
|
||||||
|
|
||||||
self.send_response(200, "OK")
|
self.send_response(200, "OK")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
except LocalException, e:
|
except LocalException, e:
|
||||||
self.send_response(400, e.msg)
|
self.send_response(400, e.msg)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
|
|
||||||
def register(self, c):
|
def register(self, c):
|
||||||
try:
|
try:
|
||||||
subdomain = c['subdomain'][0]
|
subdomain = c['subdomain'][0]
|
||||||
sharedSecret = c['sharedsecret'][0]
|
sharedSecret = c['sharedsecret'][0]
|
||||||
except KeyError, e:
|
except KeyError, e:
|
||||||
raise LocalException('Parameter missing: ' + str(e))
|
raise LocalException('Parameter missing: ' + str(e))
|
||||||
|
|
||||||
dynid = subdomain
|
dynid = subdomain
|
||||||
zone = 'yadynns.net'
|
zone = 'yadynns.net'
|
||||||
|
|
||||||
if HttpCmdHandler.entries.has_key(dynid):
|
if HttpCmdHandler.entries.has_key(dynid):
|
||||||
raise LocalException("duplicate dynid")
|
raise LocalException("duplicate dynid")
|
||||||
for entry in HttpCmdHandler.entries.values():
|
for entry in HttpCmdHandler.entries.values():
|
||||||
if entry.name == subdomain and entry.zone == zone:
|
if entry.name == subdomain and entry.zone == zone:
|
||||||
raise LocalException("duplicate full name")
|
raise LocalException("duplicate full name")
|
||||||
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
||||||
HttpCmdHandler.entries[dynid] = newEntry
|
HttpCmdHandler.entries[dynid] = newEntry
|
||||||
|
|
||||||
|
|
||||||
class HttpCmdServer(SocketServer.ThreadingTCPServer):
|
class HttpCmdServer(SocketServer.ThreadingTCPServer):
|
||||||
def __init__(self, serverAddr):
|
def __init__(self, serverAddr):
|
||||||
self.allow_reuse_address = True
|
self.allow_reuse_address = True
|
||||||
SocketServer.ThreadingTCPServer.__init__(self, serverAddr, HttpCmdHandler)
|
SocketServer.ThreadingTCPServer.__init__(self, serverAddr, HttpCmdHandler)
|
||||||
|
|
||||||
|
|
||||||
class HttpCmdReceiver(threading.Thread):
|
class HttpCmdReceiver(threading.Thread):
|
||||||
def __init__(self, httpCmdRecvAddr, entries, adminPwd):
|
def __init__(self, httpCmdRecvAddr, entries, adminPwd):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.httpCmdRecvAddr = httpCmdRecvAddr
|
self.httpCmdRecvAddr = httpCmdRecvAddr
|
||||||
HttpCmdHandler.setClassParams(entries, adminPwd)
|
HttpCmdHandler.setClassParams(entries, adminPwd)
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
server = HttpCmdServer(self.httpCmdRecvAddr)
|
server = HttpCmdServer(self.httpCmdRecvAddr)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ import Entry
|
|||||||
|
|
||||||
class LocalException(Exception):
|
class LocalException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
|
|
||||||
class XmlRpcServer(SimpleXMLRPCServer):
|
class XmlRpcServer(SimpleXMLRPCServer):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd):
|
def setClassParams(cls, entries, adminPwd):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
cls.adminPwd = adminPwd
|
||||||
|
|
||||||
|
|
||||||
def _dispatch(self, method, params):
|
def _dispatch(self, method, params):
|
||||||
@ -29,21 +29,21 @@ class XmlRpcServer(SimpleXMLRPCServer):
|
|||||||
return func(*params)
|
return func(*params)
|
||||||
|
|
||||||
def export_register(self, subdomain, sharedSecret, email):
|
def export_register(self, subdomain, sharedSecret, email):
|
||||||
try:
|
try:
|
||||||
dynid = subdomain
|
dynid = subdomain
|
||||||
zone = 'yadynns.net'
|
zone = 'yadynns.net'
|
||||||
|
|
||||||
if XmlRpcServer.entries.has_key(dynid):
|
if XmlRpcServer.entries.has_key(dynid):
|
||||||
raise LocalException("duplicate dynid")
|
raise LocalException("duplicate dynid")
|
||||||
for entry in XmlRpcServer.entries.values():
|
for entry in XmlRpcServer.entries.values():
|
||||||
if entry.name == subdomain and entry.zone == zone:
|
if entry.name == subdomain and entry.zone == zone:
|
||||||
raise LocalException("duplicate full name")
|
raise LocalException("duplicate full name")
|
||||||
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
||||||
XmlRpcServer.entries[dynid] = newEntry
|
XmlRpcServer.entries[dynid] = newEntry
|
||||||
|
|
||||||
return 'ok'
|
return 'ok'
|
||||||
except LocalException, e:
|
except LocalException, e:
|
||||||
return 'not ok ' + e.msg
|
return 'not ok ' + e.msg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -53,10 +53,10 @@ class XmlRpcReceiver(threading.Thread):
|
|||||||
def __init__(self, xmlRpcRecvAddr, entries, adminPwd):
|
def __init__(self, xmlRpcRecvAddr, entries, adminPwd):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.xmlRpcRecvAddr = xmlRpcRecvAddr
|
self.xmlRpcRecvAddr = xmlRpcRecvAddr
|
||||||
XmlRpcServer.setClassParams(entries, adminPwd)
|
XmlRpcServer.setClassParams(entries, adminPwd)
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
server = XmlRpcServer(self.xmlRpcRecvAddr)
|
server = XmlRpcServer(self.xmlRpcRecvAddr)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ class Logger(object):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def debug(data):
|
def debug(data):
|
||||||
if Logger.debugFlag:
|
if Logger.debugFlag:
|
||||||
syslog.syslog(syslog.LOG_DEBUG, data)
|
syslog.syslog(syslog.LOG_DEBUG, data)
|
||||||
print data
|
print data
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -24,7 +24,7 @@ class Logger(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def debugDisable():
|
def debugDisable():
|
||||||
Logger.debugFlag = False
|
Logger.debugFlag = False
|
||||||
|
|
||||||
debugFlag = False
|
debugFlag = False
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user