import threading import time import Event from logger import Logger import BaseHTTPServer import SocketServer import cgi import urlparse import Entry class LocalException(Exception): def __init__(self, msg): self.msg = msg class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler): server_version = "YadynCMDHTTP/1.0" @classmethod def setClassParams(cls, entries, adminPwd): cls.entries = entries cls.adminPwd = adminPwd def do_GET(self): Logger.log("Request: %s" % self.path) try: if self.command == "GET": q = urlparse.urlparse(self.path).query c = cgi.parse_qs(q) if not c.has_key('c'): raise LocalException('no cmd given') cmd = c['c'] if cmd == 'register': self.register(c) else: raise LocalException('unknown cmd') self.send_response(200, "OK") self.end_headers() except LocalException, e: self.send_response(400, e.msg) self.end_headers() def register(self, c): try: subdomain = c['subdomain'] sharedShared = c['sharedsecret'] except KeyError, e: raise LocalException('Parameter missing: ' + e.msg) try: dynid = subdomain zone = 'yadynns.net' if XmlRpcServer.entries.has_key(dynid): raise LocalException("duplicate dynid") for entry in MyCmd.entries.values(): if entry.name == name and entry.zone == zone: raise LocalException("duplicate full name") newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone) XmlRpcServer.entries[dynid] = newEntry return 'ok' except LocalException, e: return 'nok ' + e.msg class HttpCmdServer(SocketServer.ThreadingTCPServer): def __init__(self, serverAddr): self.allow_reuse_address = True SocketServer.ThreadingTCPServer.__init__(self, serverAddr, HttpCmdHandler) class HttpCmdReceiver(threading.Thread): def __init__(self, httpCmdRecvAddr, entries, adminPwd): threading.Thread.__init__(self) self.httpCmdRecvAddr = httpCmdRecvAddr HttpCmdHandler.setClassParams(entries, adminPwd) self.setDaemon(True) def run(self): server = HttpCmdServer(self.httpCmdRecvAddr) server.serve_forever()