improve http and xmlrpc interfaces
This commit is contained in:
parent
a2d3bd6e79
commit
399483b7b5
@ -1,29 +1,35 @@
|
||||
import md5
|
||||
from logger import Logger
|
||||
import Entry
|
||||
|
||||
class AdminFuncException(Exception):
|
||||
def __init__(self, msg):
|
||||
Logger.log("Exception in AdminFuncs: %s" % msg)
|
||||
self.msg = msg
|
||||
|
||||
class AdminFuncs(object):
|
||||
@classmethod
|
||||
def setParams(cls, entries, adminPwd):
|
||||
cls.entries = entries
|
||||
cls.adminPwd = adminPwd
|
||||
|
||||
@classmethod
|
||||
def register(cls, dynid, subdomain, zone, sharedSecret):
|
||||
di = "%s %s %s %s %s" % (dynid, subdomain, zone, sharedSecret, AdminFuncs.adminPwd)
|
||||
d = md5.new(di).hexdigest()
|
||||
Logger.debug("%s, received: %s, calculated: %s" % (di, checksum, d))
|
||||
if d != self.checksum:
|
||||
raise AdminFuncException("access denied" % di)
|
||||
@classmethod
|
||||
def setParams(cls, entries, adminPwd):
|
||||
cls.entries = entries
|
||||
cls.adminPwd = adminPwd
|
||||
|
||||
@classmethod
|
||||
def register(cls, dynid, subdomain, zone, sharedSecret, checksum):
|
||||
di = "%s %s %s %s %s" % (dynid, subdomain, zone, sharedSecret, AdminFuncs.adminPwd)
|
||||
d = md5.new(di).hexdigest()
|
||||
Logger.debug("%s, received: %s, calculated: %s" % (di, checksum, d))
|
||||
if d != checksum:
|
||||
raise AdminFuncException("access denied: %s" % di)
|
||||
|
||||
if AdminFuncs.entries.has_key(dynid):
|
||||
raise AdminFuncException("duplicate dynid")
|
||||
if AdminFuncs.entries.has_key(dynid):
|
||||
raise AdminFuncException("duplicate dynid")
|
||||
|
||||
for entry in AdminFuncs.entries.values():
|
||||
if entry.name == subdomain and entry.zone == zone:
|
||||
raise AdminFuncException("duplicate full name")
|
||||
for entry in AdminFuncs.entries.values():
|
||||
if entry.name == subdomain and entry.zone == zone:
|
||||
raise AdminFuncException("duplicate full name")
|
||||
|
||||
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
||||
AdminFuncs.entries[dynid] = newEntry
|
||||
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
||||
AdminFuncs.entries[dynid] = newEntry
|
||||
|
||||
|
||||
|
||||
|
@ -25,7 +25,7 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
cls.entries = entries
|
||||
cls.adminPwd = adminPwd
|
||||
cls.dnsq = dnsq
|
||||
cls.nullAddress = nullAdress
|
||||
cls.nullAddress = nullAddress
|
||||
|
||||
def do_GET(self):
|
||||
Logger.log("Request: %s, %s" % (self.path, self.client_address))
|
||||
@ -40,17 +40,19 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
if cmd == 'register':
|
||||
self.register(c)
|
||||
elif cmd == 'start':
|
||||
self.setAddress(c, self.client_address[0])
|
||||
self.setAddress(c, self.client_address[0])
|
||||
elif cmd == 'stop':
|
||||
self.setAddress(c, HttpCmdHandler.nullAddress)
|
||||
self.setAddress(c, HttpCmdHandler.nullAddress)
|
||||
else:
|
||||
raise LocalException('unknown cmd')
|
||||
|
||||
self.send_response(200, "OK")
|
||||
self.send_header("Content-Length", "0")
|
||||
self.end_headers()
|
||||
except IllegalEventException, e:
|
||||
Logger.log("Some failure (%s), not notifying user" % e.msg)
|
||||
self.send_response(200, "OK")
|
||||
self.send_header("Content-Length", "0")
|
||||
self.end_headers()
|
||||
except AdminFuncs.AdminFuncException, e:
|
||||
self.send_response(400, e.msg)
|
||||
@ -59,6 +61,7 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
self.send_response(400, e.msg)
|
||||
self.end_headers()
|
||||
|
||||
|
||||
def register(self, c):
|
||||
try:
|
||||
dynid = c['dynid'][0]
|
||||
@ -69,17 +72,17 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||
except KeyError, e:
|
||||
raise LocalException('Parameter missing: ' + str(e))
|
||||
|
||||
AdminFuncs.register(dynid, subdomain, zone, sharedSecret)
|
||||
AdminFuncs.AdminFuncs.register(dynid, subdomain, zone, sharedSecret, checkSum)
|
||||
|
||||
def setAddress(self, c, address):
|
||||
try:
|
||||
dynId = c['dynid'][0]
|
||||
sharedSecret = c['sharedsecret'][0]
|
||||
except KeyError, e:
|
||||
raise LocalException('Parameter missing: ' + str(e))
|
||||
raise LocalException('Parameter missing: ' + str(e))
|
||||
|
||||
if not HttpCmdHandler.entries.has_key(dynId):
|
||||
raise IllegalEventException("unknown dynid %s" % dynId)
|
||||
raise IllegalEventException("unknown dynid %s" % dynId)
|
||||
|
||||
entry = HttpCmdHandler.entries[dynId]
|
||||
|
||||
|
@ -28,17 +28,15 @@ class XmlRpcServer(SimpleXMLRPCServer):
|
||||
else:
|
||||
return func(*params)
|
||||
|
||||
def export_register(self, dynid, subdomain, zone, sharedSecret, email):
|
||||
def export_register(self, dynid, subdomain, zone, sharedSecret, checkSum, email):
|
||||
try:
|
||||
AdminFuncs.register(dynid, subdomain, zone, sharedSecret)
|
||||
AdminFuncs.register(dynid, subdomain, zone, sharedSecret, checkSum)
|
||||
return 'ok'
|
||||
except AdminFuncs.AdminFuncException, e:
|
||||
return 'not ok ' + e.msg
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class XmlRpcReceiver(threading.Thread):
|
||||
def __init__(self, xmlRpcRecvAddr, entries, adminPwd):
|
||||
threading.Thread.__init__(self)
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
|
||||
import Queue
|
||||
import time
|
||||
@ -16,6 +16,7 @@ import XmlRpcReceiver
|
||||
import HttpCmdReceiver
|
||||
import Entry
|
||||
import Event
|
||||
import AdminFuncs
|
||||
|
||||
|
||||
|
||||
@ -65,6 +66,8 @@ try:
|
||||
|
||||
Event.Event.setParams(entries, MSG_TIME_CORRIDOR, dnsq)
|
||||
|
||||
AdminFuncs.AdminFuncs.setParams(entries, ADMIN_PWD)
|
||||
|
||||
dynHandler = DynHandler.DynHandler(eventq)
|
||||
dynHandler.start()
|
||||
Logger.debug("DynHandler started")
|
||||
|
Loading…
x
Reference in New Issue
Block a user