MSDP basic testing for ECHO and SEND done.

This commit is contained in:
Griatch 2015-02-13 23:34:02 +01:00
parent 07dd81851e
commit d5a7908a43
6 changed files with 38 additions and 22 deletions

View file

@ -193,6 +193,7 @@ def oob_send(oobhandler, session, *args, **kwargs):
if obj: if obj:
for name in (a.upper() for a in args if a): for name in (a.upper() for a in args if a):
try: try:
print "MSDP SEND inp:", name
value = OOB_SENDABLE.get(name, _NA_SEND)(obj) value = OOB_SENDABLE.get(name, _NA_SEND)(obj)
ret[name] = value ret[name] = value
except Exception, e: except Exception, e:

View file

@ -414,6 +414,7 @@ class OOBHandler(TickerHandler):
(session, oobfuncname, args, kwargs) (session, oobfuncname, args, kwargs)
raise RuntimeError(errmsg) raise RuntimeError(errmsg)
print "execute_oob:", session, oobfuncname, args, kwargs
# don't catch this, wrong oobfuncname should be reported # don't catch this, wrong oobfuncname should be reported
oobfunc = _OOB_FUNCS[oobfuncname] oobfunc = _OOB_FUNCS[oobfuncname]

View file

@ -2,7 +2,7 @@
Sessionhandler for portal sessions Sessionhandler for portal sessions
""" """
import time import time
from evennia.server.sessionhandler import SessionHandler, PCONN, PDISCONN, PSYNC, PCONNSYNC from evennia.server.sessionhandler import SessionHandler, PCONN, PDISCONN, PCONNSYNC
_MOD_IMPORT = None _MOD_IMPORT = None

View file

@ -236,11 +236,11 @@ class TelnetProtocol(Telnet, StatefulTelnetProtocol, Session):
except Exception, e: except Exception, e:
self.sendLine(str(e)) self.sendLine(str(e))
return return
if "oob" in kwargs: if "oob" in kwargs and "OOB" in self.protocol_flags:
# oob is a list of [(cmdname, arg, kwarg), ...] # oob is a list of [(cmdname, arg, kwarg), ...]
if "OOB" in self.protocol_flags: for cmdname, args, kwargs in kwargs["oob"]:
for cmdname, args, kwargs in kwargs["oob"]: print "telnet oob data_out:", cmdname, args, kwargs
self.oob.data_out(cmdname, *args, **kwargs) self.oob.data_out(cmdname, *args, **kwargs)
# parse **kwargs, falling back to ttype if nothing is given explicitly # parse **kwargs, falling back to ttype if nothing is given explicitly
ttype = self.protocol_flags.get('TTYPE', {}) ttype = self.protocol_flags.get('TTYPE', {})

View file

@ -32,8 +32,10 @@ MSDP_TABLE_CLOSE = chr(4)
MSDP_ARRAY_OPEN = chr(5) MSDP_ARRAY_OPEN = chr(5)
MSDP_ARRAY_CLOSE = chr(6) MSDP_ARRAY_CLOSE = chr(6)
# GMCP
GMCP = chr(200) GMCP = chr(200)
# General Telnet
IAC = chr(255) IAC = chr(255)
SB = chr(250) SB = chr(250)
SE = chr(240) SE = chr(240)
@ -54,7 +56,7 @@ msdp_regex_val = re.compile(MSDP_VAL)
# Msdp object handler # Msdp object handler
class Telnet_OOB(object): class TelnetOOB(object):
""" """
Implements the MSDP and GMCP protocols. Implements the MSDP and GMCP protocols.
""" """
@ -110,26 +112,27 @@ class Telnet_OOB(object):
cmdname *args -> cmdname MSDP_ARRAY cmdname *args -> cmdname MSDP_ARRAY
cmdname **kwargs -> cmdname MSDP_TABLE cmdname **kwargs -> cmdname MSDP_TABLE
OBS - whereas there are also definitions for making arrays and tables in # send 'raw' data structures
the specification, these are not actually used in the default MSDP_ARRAY *args -> MSDP_ARRAY
msdp commands -- returns are implemented as simple lists or MSDP_TABLE **kwargs -> MSDP_TABLE
named lists (our name for them here, these un-bounded
structures are not named in the specification). So for now,
this routine will not explicitly create arrays nor tables,
although there are helper methods ready should it be needed in
the future.
""" """
msdp_string = "" msdp_string = ""
if args: if args:
if len(args) == 1: if cmdname == "MSDP_ARRAY":
msdp_string = "%s %s" % (cmdname.upper(), args[0]) msdp_string = "".join(["%s%s" % (MSDP_VAL, val) for val in args])
else: else:
msdp_string = "%s%s%s%s" % (MSDP_VAR, cmdname.upper(), "".join( msdp_string = "%s%s%s" % (MSDP_VAR, cmdname.upper(), "".join(
"%s%s" % (MSDP_VAL, val) for val in args)) "%s%s" % (MSDP_VAL, val) for val in args))
elif kwargs: elif kwargs:
msdp_string = "%s%s%s" % (MSDP_VAR. cmdname.upper(), "".join( if cmdname == "MSDP_TABLE":
msdp_string = "".join(["%s%s%s%s" % (MSDP_VAR, key, MSDP_VAL, val)
for key, val in kwargs.items()])
else:
msdp_string = "%s%s%s" % (MSDP_VAR. cmdname.upper(), "".join(
["%s%s%s%s" % (MSDP_VAR, key, MSDP_VAL, val) for key, val in kwargs.items()])) ["%s%s%s%s" % (MSDP_VAR, key, MSDP_VAL, val) for key, val in kwargs.items()]))
return msdp_string print "encode msdp result:", cmdname, args, kwargs, "->", msdp_string
return force_str(msdp_string)
def encode_gmcp(self, cmdname, *args, **kwargs): def encode_gmcp(self, cmdname, *args, **kwargs):
""" """
@ -142,11 +145,18 @@ class Telnet_OOB(object):
cmdname is generally recommended to be a string on the form cmdname is generally recommended to be a string on the form
Module.Submodule.Function Module.Submodule.Function
""" """
if cmdname in ("SEND", "ECHO", "REPORT", "UNREPORT", "LIST"):
# we wrap the standard MSDP commands in a MSDP. submodule
# here as far as GMCP is concerned.
cmdname = "MSDP.%s" % cmdname
elif cmdname in ("MSDP_ARRAY", "MSDP_TABLE"):
# no cmdname should accompany these, just the MSDP wrapper
cmdname = "MSDP"
if args: if args:
gmcp_string = "%s %s" % (cmdname, json.dumps(args)) gmcp_string = "%s %s" % (cmdname, json.dumps(args))
elif kwargs: elif kwargs:
gmcp_string = "%s %s" % (cmdname, json.dumps(kwargs)) gmcp_string = "%s %s" % (cmdname, json.dumps(kwargs))
return gmcp_string return force_str(gmcp_string).strip()
def decode_msdp(self, data): def decode_msdp(self, data):
""" """
@ -182,6 +192,8 @@ class Telnet_OOB(object):
parts = msdp_regex_val.split(varval) parts = msdp_regex_val.split(varval)
variables[parts[0].upper()] = tuple(parts[1:]) if len(parts) > 1 else ("", ) variables[parts[0].upper()] = tuple(parts[1:]) if len(parts) > 1 else ("", )
print "OOB: MSDP decode:", data, "->", variables, arrays, tables
# send to the sessionhandler # send to the sessionhandler
if data: if data:
for varname, var in variables.items(): for varname, var in variables.items():
@ -221,10 +233,11 @@ class Telnet_OOB(object):
Return a msdp-valid subnegotiation across the protocol. Return a msdp-valid subnegotiation across the protocol.
""" """
if self.MSDP: if self.MSDP:
encoded_oob = force_str(self.encode_msdp(cmdname, *args, **kwargs)) encoded_oob = self.encode_msdp(cmdname, *args, **kwargs)
print "data_out:", encoded_oob
self.protocol._write(IAC + SB + MSDP + encoded_oob + IAC + SE) self.protocol._write(IAC + SB + MSDP + encoded_oob + IAC + SE)
else: else:
encoded_oob = force_str(self.encode_gmcp(cmdname, *args, **kwargs)) encoded_oob = self.encode_gmcp(cmdname, *args, **kwargs)
self.protocol._write(IAC + SB + GMCP + encoded_oob + IAC + SE) self.protocol._write(IAC + SB + GMCP + encoded_oob + IAC + SE)
def data_in(self, data): def data_in(self, data):

View file

@ -438,6 +438,7 @@ class ServerSessionHandler(SessionHandler):
if not _OOB_HANDLER: if not _OOB_HANDLER:
from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER from evennia.server.oobhandler import OOB_HANDLER as _OOB_HANDLER
funcname, args, kwargs = kwargs.pop("oob") funcname, args, kwargs = kwargs.pop("oob")
print "OOB sessionhandler.data_in:", funcname, args, kwargs
if funcname: if funcname:
_OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs) _OOB_HANDLER.execute_cmd(session, funcname, *args, **kwargs)