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

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