cli instead of web

This commit is contained in:
who 2007-11-12 14:52:41 +01:00
parent 261b60d003
commit 4686523707
14 changed files with 75 additions and 254 deletions

48
server/CmdReceiver.py Normal file
View File

@ -0,0 +1,48 @@
import SocketServer
import threading
import cmd
import sys
class MyCmd(cmd.Cmd):
@classmethod
def setClassParams(cls, entries, adminPwd):
cls.entries = entries
cls.adminPwd = adminPwd
def __init__(self, i, o):
cmd.Cmd.__init__(self, completekey=None, stdin=i, stdout=o)
cmd.Cmd.use_rawinput = False
self.intro = "yadyn commandline interface\n"
self.prompt = "yadyn> "
def do_hello(self, l):
self.stdout.write("DO: %s\n" % l)
def do_quit(self, l):
return True
class CmdHandler(SocketServer.StreamRequestHandler):
def handle(self):
myCmd = MyCmd(self.rfile, self.wfile)
myCmd.cmdloop()
class CmdServer(SocketServer.ThreadingTCPServer):
def __init__(self, server_address, RequestHandlerClass):
self.allow_reuse_address = True
SocketServer.ThreadingTCPServer.__init__(self, server_address, RequestHandlerClass)
class CmdReceiver(threading.Thread):
def __init__(self, cmdAddr, entries, adminPwd):
threading.Thread.__init__(self)
self.cmdAddr = cmdAddr
MyCmd.setClassParams(entries, adminPwd)
self.setDaemon(True)
def run(self):
CmdServer(self.cmdAddr, CmdHandler).serve_forever()

View File

@ -18,8 +18,10 @@ TEMPLATE_DIR='./templates'
class YaDynWebApp(object):
@classmethod
def setSessionContainer(cls, sessionContainer):
def setClassParams(cls, sessionContainer, adminPwd, entries):
cls.sessionContainer = sessionContainer
cls.adminPwd = adminPwd
cls.entries = entries
def __init__(self, sid):
self.buf = StringIO.StringIO()
@ -88,7 +90,7 @@ class YaDynWebApp(object):
def processAction(self):
if self.params.action == "Login":
authTuple = getAuthTuple(self.params.username, self.params.password)
authTuple = self.getAuthTuple(self.params.username, self.params.password)
if authTuple:
self.params = Params({})
self.sid = str(uuid.uuid1())
@ -131,13 +133,16 @@ class YaDynWebApp(object):
return self.buf.getvalue()
def getAuthTuple(self, username, password):
if username == "admin" and password == self.adminPwd:
return {'username': username, 'password': password, 'role': 'admin'}
elif self.entries.has_key(username) and self.entries[username].sharedSecret == password:
return {'username': username, 'password': password, 'role': 'user'}
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
server_version = "YaDynWebAppHTTP/1.0"
@classmethod
def setParams(cls, entries):
cls.entries = entries
def log_message(self, format, *args):
Logger.log(format%args)
@ -206,17 +211,18 @@ class MyServer(SocketServer.ThreadingTCPServer):
class WebReceiver(threading.Thread):
def __init__(self, webAddr, entries):
def __init__(self, webAddr, entries, adminPwd):
threading.Thread.__init__(self)
self.webAddr = webAddr
MyHandler.setParams(entries)
self.entries = entries
self.adminPwd = adminPwd
self.setDaemon(True)
def run(self):
self.sessionContainer = SessionContainer(60, 600)
self.sessionContainer.setDaemon(True)
self.sessionContainer.start()
YaDynWebApp.setSessionContainer(self.sessionContainer)
YaDynWebApp.setClassParams(self.sessionContainer, self.adminPwd, self.entries)
MyServer(self.webAddr, MyHandler).serve_forever()

View File

@ -1,26 +0,0 @@
import syslog
class Logger(object):
def log(data):
syslog.syslog(syslog.LOG_INFO, data)
if Logger.debugFlag:
print data
def debug(data):
syslog.syslog(syslog.LOG_DEBUG, data)
if Logger.debugFlag:
print data
def openlog():
syslog.openlog('hsc', syslog.LOG_PID, syslog.LOG_LOCAL0)
def debugEnable():
Logger.debugFlag = True
log = staticmethod(log)
debug = staticmethod(debug)
openlog = staticmethod(openlog)
debugEnable = staticmethod(debugEnable)
debugFlag = False

View File

@ -1,30 +0,0 @@
from logger import Logger
class Params(object):
def __init__(self, e):
Logger.log("Params: %s" % str(e))
for k in e.keys():
self.__dict__[k] = e[k][0]
def __getattr__(self, a):
return ''
def get(self, k):
if self.__dict__.has_key(k):
return self.__dict__[k]
else:
return ''
def check_existance(self, l):
for i in l:
if not self.__dict__.has_key(i):
raise KeyError, i
def items(self):
for k in self.__dict__.keys():
yield (k, self.__dict__[k])
return
def __str__(self):
return str(self.__dict__)

View File

@ -1,110 +0,0 @@
import time
import threading
from logger import Logger
class SessionContainer(threading.Thread):
def __init__(self, checkPeriod, expiryTime):
threading.Thread.__init__(self)
self.checkPeriod = checkPeriod
self.expiryTime = expiryTime
self.sessions = {}
self.sessionsLock = threading.Lock()
def get(self, sid):
if not sid:
return None
try:
self.sessionsLock.acquire()
session = self.sessions[sid]
session.updateTimestamp()
return session
except KeyError:
return None
finally:
self.sessionsLock.release()
def delete(self, sid):
if sid:
try:
self.sessionsLock.acquire()
del self.sessions[sid]
except KeyError:
pass
finally:
self.sessionsLock.release()
def add(self, session):
try:
self.sessionsLock.acquire()
self.sessions[session.getId()] = session
finally:
self.sessionsLock.release()
def run(self):
while True:
try:
self.sessionsLock.acquire()
currentTime = int(time.time())
for session in self.sessions.values():
Logger.log("SessionContainer: checking session %s, expires in %d s" % (session.getId(),
(session.getTimestamp() + self.expiryTime) - currentTime))
if (session.getTimestamp() + self.expiryTime) < currentTime:
Logger.log("SessionContainer: about to drop session %s" % session.getId())
del self.sessions[session.getId()]
finally:
self.sessionsLock.release()
time.sleep(self.checkPeriod)
class Session(object):
def __init__(self, id, params):
self.timestamp = int(time.time())
self.id = id
self.params = params
self.badmsg = ''
self.goodmsg = ''
self.role = ''
def updateTimestamp(self):
self.timestamp = int(time.time())
def getTimestamp(self):
return self.timestamp
def getId(self):
return self.id
def setParams(self, params):
self.params = params
def getParams(self):
return self.params
def setGoodMsg(self, msg):
self.goodmsg = msg
def setBadMsg(self, msg):
self.badmsg = msg
def setRedirectTarget(self, target):
self.redirectTarget = target
def setShownPage(self, page):
self.page = page
def getShownPage(self):
return self.page
def setAuthTuple(self, authTuple):
self.authTuple = authTuple
self.username = authTuple['username']
self.password = authTuple['password']
self.role = authTuple['role']
def clearMsgs(self):
self.badmsg = ''
self.goodmsg = ''

View File

@ -1,3 +0,0 @@
<ul>
<li><a href="/person">Person</a></li>
</ul>

View File

@ -1,4 +0,0 @@
<ul>
<li><a href="/change_password">Change password</a></li>
<li><a href="/logout">Logout</a></li>
</ul>

View File

@ -1,4 +0,0 @@
</p>
</div>
</body>
</html>

View File

@ -1,42 +0,0 @@
<html>
<head>
<title>YaDyn</title>
</head>
<body>
<div id="head">
</div>
<div id="goodmsg">
#if $session and $session.goodmsg
<p>
<font color="green">$session.goodmsg</font>
</p>
#end if
</div>
<div id="badmsg">
#if $session and $session.badmsg
<p>
<font color="red">$session.badmsg</font>
</p>
#end if
</div>
<div id="menu">
<p>
#if $session
#include "templates/any_menu.inc"
#end if
#if $session and $session.role == "user"
#include "templates/user_menu.inc"
#end if
#if $session and $session.role == "admin"
#include "templates/admin_menu.inc"
#end if
</p>
</div>
<div id="main">
<p>

View File

@ -1,17 +0,0 @@
#include "templates/header.inc"
<form method="POST">
<table>
<tr>
<td>Username:</td><td><input type="text" name="username" value=""/></td>
</tr><tr>
<td>Password:</td><td><input type="password" name="password" value=""/></td>
</tr>
</table>
<br/>
<input type="submit" name="action" value="Login"/>
</form>
#include "templates/footer.inc"

View File

@ -1 +0,0 @@
bye

View File

@ -0,0 +1,6 @@
#include "templates/header.inc"
#include "templates/footer.inc"

View File

@ -1,3 +0,0 @@
<ul>
<li><a href="/personal_statistics">View your personal statistics</a></li>
</ul>

View File

@ -8,7 +8,7 @@ import DynHandler
# import DnsHandler
import Expirer
import DynReceiver
import WebReceiver
import CmdReceiver
import Entry
import Event
@ -17,13 +17,12 @@ import Event
MSG_TIME_CORRIDOR = 5
EVENT_LIFE_TIME = 10
NULL_ADDRESS = '0.0.0.0'
ZONE = 'contextmatters.de'
NAME = 'serve'
TTL = 120
NAMESERVER = '127.0.0.1'
TSIGKEY = { "monitoring." : "HYHN8l/dg1+q6QLOURp2qw==" }
PIDFILE = "/tmp/yadyn.pid"
ADMIN_PWD = 'test123'
entries = shelve.open('entries', flag='c', writeback=True)
@ -44,8 +43,10 @@ try:
expirer = Expirer.Expirer(entries, EVENT_LIFE_TIME, NULL_ADDRESS)
expirer.start()
webReceiver = WebReceiver.WebReceiver(("", 8080), entries)
webReceiver.start()
#webReceiver = WebReceiver.WebReceiver(("", 8080), entries, ADMIN_PWD)
#webReceiver.start()
cmdReceiver = CmdReceiver.CmdReceiver(("", 8023), entries, ADMIN_PWD)
cmdReceiver.start()
while True:
entries.sync()