add customer level
This commit is contained in:
parent
31c92eae50
commit
cb38eef50f
@ -9,25 +9,39 @@ class AdminFuncException(Exception):
|
|||||||
|
|
||||||
class AdminFuncs(object):
|
class AdminFuncs(object):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setParams(cls, entries, adminPwd):
|
def setParams(cls, entries, customers):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
cls.customers = customers
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register(cls, dynid, subdomain, zone, sharedSecret, checksum):
|
def register(cls, dynid, subdomain, zone, sharedSecret, checksum):
|
||||||
di = "%s %s %s %s %s" % (dynid, subdomain, zone, sharedSecret, AdminFuncs.adminPwd)
|
try:
|
||||||
|
customer = AdminFuncs.customers[zone]
|
||||||
|
except KeyError:
|
||||||
|
raise AdminFuncException("access denied")
|
||||||
|
|
||||||
|
adminPwd = customer.adminPwd
|
||||||
|
maxEntries = customer.maxEntries
|
||||||
|
|
||||||
|
di = "%s %s %s %s %s" % (dynid, subdomain, zone, sharedSecret, adminPwd)
|
||||||
d = md5.new(di).hexdigest()
|
d = md5.new(di).hexdigest()
|
||||||
Logger.debug("%s, received: %s, calculated: %s" % (di, checksum, d))
|
Logger.debug("%s, received: %s, calculated: %s" % (di, checksum, d))
|
||||||
if d != checksum:
|
if d != checksum:
|
||||||
raise AdminFuncException("access denied: %s" % di)
|
raise AdminFuncException("access denied")
|
||||||
|
|
||||||
if AdminFuncs.entries.has_key(dynid):
|
if AdminFuncs.entries.has_key(dynid):
|
||||||
raise AdminFuncException("duplicate dynid")
|
raise AdminFuncException("duplicate dynid")
|
||||||
|
|
||||||
|
entryCnt = 0
|
||||||
for entry in AdminFuncs.entries.values():
|
for entry in AdminFuncs.entries.values():
|
||||||
|
if entry.zone == zone:
|
||||||
|
entryCnt += 1
|
||||||
if entry.name == subdomain and entry.zone == zone:
|
if entry.name == subdomain and entry.zone == zone:
|
||||||
raise AdminFuncException("duplicate full name")
|
raise AdminFuncException("duplicate full name")
|
||||||
|
|
||||||
|
if entryCnt >= maxEntries and maxEntries != 0:
|
||||||
|
raise AdminFuncException("too much entries")
|
||||||
|
|
||||||
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
newEntry = Entry.Entry(dynid, sharedSecret, subdomain, zone)
|
||||||
AdminFuncs.entries[dynid] = newEntry
|
AdminFuncs.entries[dynid] = newEntry
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import sys
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import Entry
|
import Entry
|
||||||
|
import Customer
|
||||||
from logger import Logger
|
from logger import Logger
|
||||||
|
|
||||||
|
|
||||||
@ -14,9 +15,9 @@ class LocalMyCmdException(Exception):
|
|||||||
|
|
||||||
class MyCmd(cmd.Cmd):
|
class MyCmd(cmd.Cmd):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd):
|
def setClassParams(cls, entries, customers):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
cls.customers = customers
|
||||||
|
|
||||||
def __init__(self, i, o):
|
def __init__(self, i, o):
|
||||||
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
|
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
|
||||||
@ -123,6 +124,79 @@ class MyCmd(cmd.Cmd):
|
|||||||
self.stdout.write("Bye\n")
|
self.stdout.write("Bye\n")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def do_addcust(self, l):
|
||||||
|
try:
|
||||||
|
parts = l.split(' ')
|
||||||
|
if len(parts) != 5:
|
||||||
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
|
(zone, adminPwd, contact, email, maxEntries) = parts
|
||||||
|
if MyCmd.customers.has_key(zone):
|
||||||
|
raise LocalMyCmdException("duplicate zone")
|
||||||
|
try:
|
||||||
|
maxEntries = int(maxEntries)
|
||||||
|
except ValueError:
|
||||||
|
raise LocalMyCmdException("maxEntries is no number")
|
||||||
|
newCustomer = Customer.Customer(zone, adminPwd, contact, email, maxEntries)
|
||||||
|
MyCmd.customers[zone] = newCustomer
|
||||||
|
self.stdout.write("Done\n")
|
||||||
|
except LocalMyCmdException, e:
|
||||||
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
|
def do_editcust(self, l):
|
||||||
|
try:
|
||||||
|
parts = l.split(' ')
|
||||||
|
if len(parts) != 3:
|
||||||
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
|
(zone, attr, value) = parts
|
||||||
|
if not MyCmd.customers.has_key(zone):
|
||||||
|
raise LocalMyCmdException("unknown zone")
|
||||||
|
if attr == 'adminPwd':
|
||||||
|
MyCmd.customers[zone].adminPwd = value
|
||||||
|
elif attr == 'contact':
|
||||||
|
MyCmd.customers[zone].contact = value
|
||||||
|
elif attr == 'email':
|
||||||
|
MyCmd.customers[zone].email = value
|
||||||
|
elif attr == 'maxEntries':
|
||||||
|
try:
|
||||||
|
MyCmd.customers[zone].maxEntries = int(value)
|
||||||
|
except ValueError:
|
||||||
|
raise LocalMyCmdException("value is no number")
|
||||||
|
else:
|
||||||
|
raise LocalMyCmdException("unknown attribute to change")
|
||||||
|
self.stdout.write("Done\n")
|
||||||
|
except LocalMyCmdException, e:
|
||||||
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
|
def do_deletecust(self, l):
|
||||||
|
try:
|
||||||
|
parts = l.split(' ')
|
||||||
|
if len(parts) != 1:
|
||||||
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
|
zone = parts[0]
|
||||||
|
if not MyCmd.customers.has_key(zone):
|
||||||
|
raise LocalMyCmdException("unknown zone")
|
||||||
|
del MyCmd.entries[x]
|
||||||
|
self.stdout.write("Done\n")
|
||||||
|
except LocalMyCmdException, e:
|
||||||
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
|
|
||||||
|
def do_listcust(self, l):
|
||||||
|
try:
|
||||||
|
parts = l.split(' ')
|
||||||
|
if len(parts) != 1:
|
||||||
|
raise LocalMyCmdException("illegal number of arguments")
|
||||||
|
x = parts[0]
|
||||||
|
if x == 'all':
|
||||||
|
for customer in MyCmd.customers.values():
|
||||||
|
self.stdout.write(str(customer) + "\n")
|
||||||
|
elif MyCmd.customers.has_key(x):
|
||||||
|
self.stdout.write(str(MyCmd.customers[x]) + "\n")
|
||||||
|
else:
|
||||||
|
raise LocalMyCmdException("unknown zone")
|
||||||
|
except LocalMyCmdException, e:
|
||||||
|
self.stdout.write("Failure: %s\n" % str(e.msg))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CmdHandler(SocketServer.StreamRequestHandler):
|
class CmdHandler(SocketServer.StreamRequestHandler):
|
||||||
|
10
server/Customer.py
Normal file
10
server/Customer.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
class Customer(object):
|
||||||
|
def __init__(self, zone, adminPwd, contact, email, maxEntries):
|
||||||
|
self.zone = zone
|
||||||
|
self.adminPwd = adminPwd
|
||||||
|
self.contact = contact
|
||||||
|
self.email = email
|
||||||
|
self.maxEntries = maxEntries
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Customer[zone=%s, adminPwd=%s, contact=%s, email=%s, maxEntries=%d]" % (self.zone, self.adminPwd, self.contact, self.email, self.maxEntries)
|
@ -9,7 +9,7 @@ class Entry(object):
|
|||||||
self.addressInDns = '0.0.0.0'
|
self.addressInDns = '0.0.0.0'
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "dynid=%s, name=%s, zone=%s, sharedSecret=%s, address=%s (%s), lastEventTime=%d" % (self.dynid, self.name, self.zone, self.sharedSecret, self.address, self.addressInDns, self.lastEventTime)
|
return "Entry[dynid=%s, name=%s, zone=%s, sharedSecret=%s, address=%s (%s), lastEventTime=%d]" % (self.dynid, self.name, self.zone, self.sharedSecret, self.address, self.addressInDns, self.lastEventTime)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,9 +23,8 @@ class HttpCmdHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
def log_request(self, code='-', size='-'): pass
|
def log_request(self, code='-', size='-'): pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd, dnsq, nullAddress):
|
def setClassParams(cls, entries, dnsq, nullAddress):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
|
||||||
cls.dnsq = dnsq
|
cls.dnsq = dnsq
|
||||||
cls.nullAddress = nullAddress
|
cls.nullAddress = nullAddress
|
||||||
|
|
||||||
@ -109,10 +108,10 @@ class HttpCmdServer(SocketServer.ThreadingTCPServer):
|
|||||||
|
|
||||||
|
|
||||||
class HttpCmdReceiver(threading.Thread):
|
class HttpCmdReceiver(threading.Thread):
|
||||||
def __init__(self, httpCmdRecvAddr, entries, adminPwd, dnsq, nullAddress):
|
def __init__(self, httpCmdRecvAddr, entries, dnsq, nullAddress):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.httpCmdRecvAddr = httpCmdRecvAddr
|
self.httpCmdRecvAddr = httpCmdRecvAddr
|
||||||
HttpCmdHandler.setClassParams(entries, adminPwd, dnsq, nullAddress)
|
HttpCmdHandler.setClassParams(entries, dnsq, nullAddress)
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -12,9 +12,8 @@ class LocalException(Exception):
|
|||||||
|
|
||||||
class XmlRpcServer(SimpleXMLRPCServer):
|
class XmlRpcServer(SimpleXMLRPCServer):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setClassParams(cls, entries, adminPwd):
|
def setClassParams(cls, entries):
|
||||||
cls.entries = entries
|
cls.entries = entries
|
||||||
cls.adminPwd = adminPwd
|
|
||||||
|
|
||||||
|
|
||||||
def _dispatch(self, method, params):
|
def _dispatch(self, method, params):
|
||||||
@ -38,10 +37,10 @@ class XmlRpcServer(SimpleXMLRPCServer):
|
|||||||
|
|
||||||
|
|
||||||
class XmlRpcReceiver(threading.Thread):
|
class XmlRpcReceiver(threading.Thread):
|
||||||
def __init__(self, xmlRpcRecvAddr, entries, adminPwd):
|
def __init__(self, xmlRpcRecvAddr, entries):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.xmlRpcRecvAddr = xmlRpcRecvAddr
|
self.xmlRpcRecvAddr = xmlRpcRecvAddr
|
||||||
XmlRpcServer.setClassParams(entries, adminPwd)
|
XmlRpcServer.setClassParams(entries)
|
||||||
self.setDaemon(True)
|
self.setDaemon(True)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
15
server/testxml
Executable file
15
server/testxml
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import xmlrpclib
|
||||||
|
import md5
|
||||||
|
|
||||||
|
(x, dynid, subdomain, zone, sharedSecret, adminPwd) = sys.argv
|
||||||
|
|
||||||
|
d = "%s %s %s %s %s" % (dynid, subdomain, zone, sharedSecret, adminPwd)
|
||||||
|
checksum = md5.new(d).hexdigest()
|
||||||
|
|
||||||
|
s = xmlrpclib.ServerProxy("http://localhost:8024")
|
||||||
|
r = s.register(dynid, subdomain, zone, sharedSecret, checksum, "test@test.de")
|
||||||
|
|
||||||
|
print r
|
63
server/yadyn
63
server/yadyn
@ -20,35 +20,37 @@ import AdminFuncs
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#MSG_TIME_CORRIDOR = 120
|
|
||||||
#EVENT_LIFE_TIME = 60
|
|
||||||
#NULL_ADDRESS = '0.0.0.0'
|
|
||||||
#TTL = 120
|
|
||||||
#EXPIRY_PERIOD = 30
|
|
||||||
#NAMESERVER = '127.0.0.1'
|
|
||||||
#NAMESERVER_PORT = 5300
|
|
||||||
#TSIGKEY = { "yadyn." : "+xLH8GuZnEgBljuIEM/iDA==" }
|
|
||||||
#PID_FILE = "/tmp/yadyn/yadyn.pid"
|
|
||||||
#ENTRIES_FILE = "/tmp/yadyn/entries"
|
|
||||||
#ACTIONLOG_DIR = "/tmp/yadyn/actionlog"
|
|
||||||
#ADMIN_PWD = 'test123'
|
|
||||||
#DNS_DUMMY = False
|
|
||||||
#DEBUG = True
|
|
||||||
|
|
||||||
MSG_TIME_CORRIDOR = 120
|
MSG_TIME_CORRIDOR = 120
|
||||||
EVENT_LIFE_TIME = 600
|
EVENT_LIFE_TIME = 120
|
||||||
NULL_ADDRESS = '0.0.0.0'
|
NULL_ADDRESS = '0.0.0.0'
|
||||||
TTL = 120
|
TTL = 120
|
||||||
EXPIRY_PERIOD = 300
|
EXPIRY_PERIOD = 120
|
||||||
NAMESERVER = '88.198.170.2'
|
NAMESERVER = '127.0.0.1'
|
||||||
NAMESERVER_PORT = 53
|
NAMESERVER_PORT = 5300
|
||||||
TSIGKEY = { "yadyn." : "+xLH8GuZnEgBljuIEM/iDA==" }
|
TSIGKEY = { "yadyn." : "+xLH8GuZnEgBljuIEM/iDA==" }
|
||||||
PID_FILE = "/var/db/yadyn/yadyn.pid"
|
PID_FILE = "/tmp/yadyn/yadyn.pid"
|
||||||
ENTRIES_FILE = "/var/db/yadyn/entries"
|
ENTRIES_FILE = "/tmp/yadyn/entries"
|
||||||
ACTIONLOG_DIR = "/var/db/yadyn/actionlog"
|
CUSTOMERS_FILE = "/tmp/yadyn/customers"
|
||||||
|
ACTIONLOG_DIR = "/tmp/yadyn/actionlog"
|
||||||
ADMIN_PWD = 'test123'
|
ADMIN_PWD = 'test123'
|
||||||
DNS_DUMMY = False
|
DNS_DUMMY = False
|
||||||
DEBUG = False
|
DEBUG = True
|
||||||
|
|
||||||
|
#MSG_TIME_CORRIDOR = 120
|
||||||
|
#EVENT_LIFE_TIME = 600
|
||||||
|
#NULL_ADDRESS = '0.0.0.0'
|
||||||
|
#TTL = 120
|
||||||
|
#EXPIRY_PERIOD = 300
|
||||||
|
#NAMESERVER = '88.198.170.2'
|
||||||
|
#NAMESERVER_PORT = 53
|
||||||
|
#TSIGKEY = { "yadyn." : "+xLH8GuZnEgBljuIEM/iDA==" }
|
||||||
|
#PID_FILE = "/var/db/yadyn/yadyn.pid"
|
||||||
|
#ENTRIES_FILE = "/var/db/yadyn/entries"
|
||||||
|
#CUSTOMERS_FILE = "/var/db/yadyn/customers"
|
||||||
|
#ACTIONLOG_DIR = "/var/db/yadyn/actionlog"
|
||||||
|
#ADMIN_PWD = 'test123'
|
||||||
|
#DNS_DUMMY = False
|
||||||
|
#DEBUG = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -74,7 +76,10 @@ if DEBUG:
|
|||||||
Logger.log("yadyn starting")
|
Logger.log("yadyn starting")
|
||||||
|
|
||||||
entries = shelve.open(ENTRIES_FILE, flag='c', writeback=True)
|
entries = shelve.open(ENTRIES_FILE, flag='c', writeback=True)
|
||||||
Logger.debug("Shelve opened")
|
Logger.debug("Entry shelve opened")
|
||||||
|
|
||||||
|
customers = shelve.open(CUSTOMERS_FILE, flag='c', writeback=True)
|
||||||
|
Logger.debug("Customer shelve opened")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
eventq = Queue.Queue()
|
eventq = Queue.Queue()
|
||||||
@ -83,7 +88,7 @@ try:
|
|||||||
|
|
||||||
Event.Event.setParams(entries, MSG_TIME_CORRIDOR, dnsq)
|
Event.Event.setParams(entries, MSG_TIME_CORRIDOR, dnsq)
|
||||||
|
|
||||||
AdminFuncs.AdminFuncs.setParams(entries, ADMIN_PWD)
|
AdminFuncs.AdminFuncs.setParams(entries, customers)
|
||||||
|
|
||||||
dynHandler = DynHandler.DynHandler(eventq)
|
dynHandler = DynHandler.DynHandler(eventq)
|
||||||
dynHandler.start()
|
dynHandler.start()
|
||||||
@ -101,15 +106,15 @@ try:
|
|||||||
expirer.start()
|
expirer.start()
|
||||||
Logger.debug("Expirer started")
|
Logger.debug("Expirer started")
|
||||||
|
|
||||||
cmdReceiver = CmdReceiver.CmdReceiver(("", 8023), entries, ADMIN_PWD)
|
cmdReceiver = CmdReceiver.CmdReceiver(("", 8023), entries, customers)
|
||||||
cmdReceiver.start()
|
cmdReceiver.start()
|
||||||
Logger.debug("CmdReceiver started")
|
Logger.debug("CmdReceiver started")
|
||||||
|
|
||||||
xmlRpcReceiver = XmlRpcReceiver.XmlRpcReceiver(("", 8024), entries, ADMIN_PWD)
|
xmlRpcReceiver = XmlRpcReceiver.XmlRpcReceiver(("", 8024), entries)
|
||||||
xmlRpcReceiver.start()
|
xmlRpcReceiver.start()
|
||||||
Logger.debug("XmlRpcReceiver started")
|
Logger.debug("XmlRpcReceiver started")
|
||||||
|
|
||||||
httpCmdReceiver = HttpCmdReceiver.HttpCmdReceiver(("", 8025), entries, ADMIN_PWD, dnsq, NULL_ADDRESS)
|
httpCmdReceiver = HttpCmdReceiver.HttpCmdReceiver(("", 8025), entries, dnsq, NULL_ADDRESS)
|
||||||
httpCmdReceiver.start()
|
httpCmdReceiver.start()
|
||||||
Logger.debug("httpCmdReceiver started")
|
Logger.debug("httpCmdReceiver started")
|
||||||
|
|
||||||
@ -118,8 +123,10 @@ try:
|
|||||||
Logger.log("yadyn running")
|
Logger.log("yadyn running")
|
||||||
while True:
|
while True:
|
||||||
entries.sync()
|
entries.sync()
|
||||||
|
customers.sync()
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
finally:
|
finally:
|
||||||
entries.close()
|
entries.close()
|
||||||
|
customers.close()
|
||||||
Logger.debug("Shelves closed")
|
Logger.debug("Shelves closed")
|
||||||
Logger.log("yadyn terminating")
|
Logger.log("yadyn terminating")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user