improve http and xmlrpc interfaces

This commit is contained in:
Wolfgang Hottgenroth 2009-02-19 22:07:34 +01:00
parent a2d3bd6e79
commit 399483b7b5
4 changed files with 40 additions and 30 deletions

View File

@ -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

View File

@ -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]

View File

@ -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)

View File

@ -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")