This commit is contained in:
Wolfgang Hottgenroth 2009-02-19 17:54:22 +01:00
parent beba6a5806
commit a2d3bd6e79
5 changed files with 81 additions and 44 deletions

29
server/AdminFuncs.py Normal file
View File

@ -0,0 +1,29 @@
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)
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")
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
AdminFuncs.entries[dynid] = newEntry

View File

@ -1,4 +1,5 @@
import md5
import Queue
from logger import Logger
class IllegalEventException(Exception):

View File

@ -1,13 +1,16 @@
import threading
import time
import Event
from Event import IllegalEventException
from logger import Logger
import BaseHTTPServer
import SocketServer
import cgi
import urlparse
import time
import Queue
import Entry
import AdminFuncs
class LocalException(Exception):
def __init__(self, msg):
@ -18,13 +21,14 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
server_version = "YadynCMDHTTP/1.0"
@classmethod
def setClassParams(cls, entries, adminPwd, dnsq):
def setClassParams(cls, entries, adminPwd, dnsq, nullAddress):
cls.entries = entries
cls.adminPwd = adminPwd
cls.dnsq = dnsq
cls.dnsq = dnsq
cls.nullAddress = nullAdress
def do_GET(self):
Logger.log("Request: %s" % self.path)
Logger.log("Request: %s, %s" % (self.path, self.client_address))
try:
if self.command == "GET":
q = urlparse.urlparse(self.path).query
@ -35,47 +39,60 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
Logger.log("Cmd: " + cmd)
if cmd == 'register':
self.register(c)
elif cmd == 'start':
self.start(c)
elif cmd == 'stop':
self.stop(c)
elif cmd == 'start':
self.setAddress(c, self.client_address[0])
elif cmd == 'stop':
self.setAddress(c, HttpCmdHandler.nullAddress)
else:
raise LocalException('unknown cmd')
self.send_response(200, "OK")
self.end_headers()
except IllegalEventException, e:
Logger.log("Some failure (%s), not notifying user" % e.msg)
self.send_response(200, "OK")
self.end_headers()
except AdminFuncs.AdminFuncException, e:
self.send_response(400, e.msg)
self.end_headers()
except LocalException, e:
self.send_response(400, e.msg)
self.end_headers()
def register(self, c):
try:
dynid = c['dynid'][0]
subdomain = c['subdomain'][0]
zone = c['zone'][0]
sharedSecret = c['sharedsecret'][0]
checkSum = c['checksum'][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
AdminFuncs.register(dynid, subdomain, zone, sharedSecret)
def start(self, c):
try:
dynId = c['dynid'][0]
sharedSecret = c['sharedsecret'][0]
except KeyError, e:
def setAddress(self, c, address):
try:
dynId = c['dynid'][0]
sharedSecret = c['sharedsecret'][0]
except KeyError, e:
raise LocalException('Parameter missing: ' + str(e))
if not Event.entries.has_key(self.dynid):
raise IllegalEventException("unknown dynid in event %s" % str(self))
entry = Event.entries[self.dynid]
if not HttpCmdHandler.entries.has_key(dynId):
raise IllegalEventException("unknown dynid %s" % dynId)
entry = HttpCmdHandler.entries[dynId]
if entry.sharedSecret != sharedSecret:
raise IllegalEventException("shared secret %s does not match to dynid %s" % (sharedSecret, dynId))
entry.lastEventTime = int(time.time())
entry.address = address
Logger.debug("Set in DNS: %s -> %s" % (entry.name, entry.address))
try:
HttpCmdHandler.dnsq.put_nowait(entry)
except Queue.Full, e:
Logger.log("Dns Queue overrun, drop event for %s" % str(entry))
@ -86,10 +103,10 @@ class HttpCmdServer(SocketServer.ThreadingTCPServer):
class HttpCmdReceiver(threading.Thread):
def __init__(self, httpCmdRecvAddr, entries, adminPwd, dnsq):
def __init__(self, httpCmdRecvAddr, entries, adminPwd, dnsq, nullAddress):
threading.Thread.__init__(self)
self.httpCmdRecvAddr = httpCmdRecvAddr
HttpCmdHandler.setClassParams(entries, adminPwd, dnsq)
HttpCmdHandler.setClassParams(entries, adminPwd, dnsq, nullAddress)
self.setDaemon(True)
def run(self):

View File

@ -28,21 +28,11 @@ class XmlRpcServer(SimpleXMLRPCServer):
else:
return func(*params)
def export_register(self, subdomain, sharedSecret, email):
def export_register(self, dynid, subdomain, zone, 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
AdminFuncs.register(dynid, subdomain, zone, sharedSecret)
return 'ok'
except LocalException, e:
except AdminFuncs.AdminFuncException, e:
return 'not ok ' + e.msg

View File

@ -20,10 +20,10 @@ import Event
MSG_TIME_CORRIDOR = 120
EVENT_LIFE_TIME = 300
EVENT_LIFE_TIME = 60
NULL_ADDRESS = '0.0.0.0'
TTL = 120
EXPIRY_PERIOD = 300
EXPIRY_PERIOD = 30
NAMESERVER = '127.0.0.1'
NAMESERVER_PORT = 5300
TSIGKEY = { "yadyn." : "+xLH8GuZnEgBljuIEM/iDA==" }
@ -89,7 +89,7 @@ try:
xmlRpcReceiver.start()
Logger.debug("XmlRpcReceiver started")
httpCmdReceiver = HttpCmdReceiver.HttpCmdReceiver(("", 8025), entries, ADMIN_PWD, dnsq)
httpCmdReceiver = HttpCmdReceiver.HttpCmdReceiver(("", 8025), entries, ADMIN_PWD, dnsq, NULL_ADDRESS)
httpCmdReceiver.start()
Logger.debug("httpCmdReceiver started")