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 md5
import Queue
from logger import Logger from logger import Logger
class IllegalEventException(Exception): class IllegalEventException(Exception):

View File

@ -1,13 +1,16 @@
import threading import threading
import time import time
import Event from Event import IllegalEventException
from logger import Logger from logger import Logger
import BaseHTTPServer import BaseHTTPServer
import SocketServer import SocketServer
import cgi import cgi
import urlparse import urlparse
import time
import Queue
import Entry import Entry
import AdminFuncs
class LocalException(Exception): class LocalException(Exception):
def __init__(self, msg): def __init__(self, msg):
@ -18,13 +21,14 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
server_version = "YadynCMDHTTP/1.0" server_version = "YadynCMDHTTP/1.0"
@classmethod @classmethod
def setClassParams(cls, entries, adminPwd, dnsq): def setClassParams(cls, entries, adminPwd, dnsq, nullAddress):
cls.entries = entries cls.entries = entries
cls.adminPwd = adminPwd cls.adminPwd = adminPwd
cls.dnsq = dnsq cls.dnsq = dnsq
cls.nullAddress = nullAdress
def do_GET(self): def do_GET(self):
Logger.log("Request: %s" % self.path) Logger.log("Request: %s, %s" % (self.path, self.client_address))
try: try:
if self.command == "GET": if self.command == "GET":
q = urlparse.urlparse(self.path).query q = urlparse.urlparse(self.path).query
@ -36,46 +40,59 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
if cmd == 'register': if cmd == 'register':
self.register(c) self.register(c)
elif cmd == 'start': elif cmd == 'start':
self.start(c) self.setAddress(c, self.client_address[0])
elif cmd == 'stop': elif cmd == 'stop':
self.stop(c) self.setAddress(c, HttpCmdHandler.nullAddress)
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 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: 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:
dynid = c['dynid'][0]
subdomain = c['subdomain'][0] subdomain = c['subdomain'][0]
zone = c['zone'][0]
sharedSecret = c['sharedsecret'][0] sharedSecret = c['sharedsecret'][0]
checkSum = c['checksum'][0]
except KeyError, e: except KeyError, e:
raise LocalException('Parameter missing: ' + str(e)) raise LocalException('Parameter missing: ' + str(e))
dynid = subdomain AdminFuncs.register(dynid, subdomain, zone, sharedSecret)
zone = 'yadynns.net'
if HttpCmdHandler.entries.has_key(dynid): def setAddress(self, c, address):
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
def start(self, c):
try: try:
dynId = c['dynid'][0] dynId = c['dynid'][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))
if not Event.entries.has_key(self.dynid): if not HttpCmdHandler.entries.has_key(dynId):
raise IllegalEventException("unknown dynid in event %s" % str(self)) raise IllegalEventException("unknown dynid %s" % dynId)
entry = Event.entries[self.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): class HttpCmdReceiver(threading.Thread):
def __init__(self, httpCmdRecvAddr, entries, adminPwd, dnsq): def __init__(self, httpCmdRecvAddr, entries, adminPwd, dnsq, nullAddress):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.httpCmdRecvAddr = httpCmdRecvAddr self.httpCmdRecvAddr = httpCmdRecvAddr
HttpCmdHandler.setClassParams(entries, adminPwd, dnsq) HttpCmdHandler.setClassParams(entries, adminPwd, dnsq, nullAddress)
self.setDaemon(True) self.setDaemon(True)
def run(self): def run(self):

View File

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

View File

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