Fixes & cleanup

* fix pickling under greenlet
* allow overriding config with an external JSON file
* remove useless flashpolicy server (flash is sadly dead)
This commit is contained in:
Jeremy Penner 2020-06-28 10:32:13 -04:00
parent a358579e87
commit 70a7844aae
4 changed files with 57 additions and 23 deletions

View file

@ -1,14 +1,26 @@
import json
import os
def override(fn):
with open(fn, 'rt') as f:
for k, v in json.load(f).iteritems():
globals()[k] = v
# Default configuration options follow - they can be overridden with a JSON file
# Port to run the telnet server on. # Port to run the telnet server on.
PORT_TELNET = 19999 PORT_TELNET = 19999
# Port to run the flash policy server on. Set to None to turn off. # Port to run the command server on. Used to trigger saving.
PORT_FLASHPOLICY = 20001 PORT_CMDSERVER = 20002
# Hostname to bind servers on. Leave as "" for all. # Hostname to bind servers on. Leave as "" for all.
BIND_HOSTNAME = "" BIND_HOSTNAME = ""
# width and height; default 80x25 # width and height; default 80x25
W = 80 W = 80
H = 25 H = 25
# directory to save ANSI pictures to. leave as "." for current directory. no trailing slash required. "" == / # directory to save ANSI pictures to. leave as "." for current directory. no trailing slash required. "" == /
DIR_ANSI = "/home/jeremy/sites/marmots/ansi" DIR_ANSI = "."
# authorization. Options are "Noop" (make up a username, no password), "Drupal" (fetches from MySQL Drupal database), # authorization. Options are "Noop" (make up a username, no password), "Drupal" (fetches from MySQL Drupal database),
#"DrupalBcrypt" (fetches from MySQL Drupal database hacked to bcrypt the md5 hash - basically just Glorious Trainwrecks) #"DrupalBcrypt" (fetches from MySQL Drupal database hacked to bcrypt the md5 hash - basically just Glorious Trainwrecks)
AUTH = "Noop" AUTH = "Noop"
@ -18,5 +30,5 @@ AUTH = "Noop"
#drupaldb_password = "password" #drupaldb_password = "password"
#drupaldb_host = "localhost" #drupaldb_host = "localhost"
# Port to run the command server on. Set to None to turn off. Only set this port for testing: it will allow anyone to take down the server! # Path to the object database to load / save
PORT_CMDSERVER = 20002 ODBPATH = "whiteboard.marm"

View file

@ -158,13 +158,6 @@ class AnsiFactory(ServerFactory):
print "built protocol for ", addr print "built protocol for ", addr
return p return p
class FlashPolicy(basic.LineReceiver):
delimiter = '\0'
def lineReceived(self,line):
if line == "<policy-file-request/>":
self.sendLine("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"" + str(config.PORT_TELNET) + "\" /></cross-domain-policy>")
class CmdProtocol(basic.LineReceiver): class CmdProtocol(basic.LineReceiver):
def connectionMade(self): def connectionMade(self):
if self.transport.getHost().host != "127.0.0.1": if self.transport.getHost().host != "127.0.0.1":
@ -172,7 +165,7 @@ class CmdProtocol(basic.LineReceiver):
self.transport.loseConnection() self.transport.loseConnection()
def lineReceived(self, line): def lineReceived(self, line):
self.transport.write(self.factory.fnCmd(line) + self.delimiter) self.transport.write(self.factory.fnCmd(line).encode('utf-8') + self.delimiter)
class CmdFactory(ServerFactory): class CmdFactory(ServerFactory):
def __init__(self, fnCmd): def __init__(self, fnCmd):
@ -185,13 +178,7 @@ class CmdFactory(ServerFactory):
def RunServer(fnRun): def RunServer(fnRun):
log.startLogging(sys.stdout) log.startLogging(sys.stdout)
factoryPolicy = Factory()
factoryPolicy.protocol = FlashPolicy
reactor.listenTCP(config.PORT_TELNET, AnsiFactory(fnRun), 50, config.BIND_HOSTNAME) reactor.listenTCP(config.PORT_TELNET, AnsiFactory(fnRun), 50, config.BIND_HOSTNAME)
if config.PORT_FLASHPOLICY:
reactor.listenTCP(config.PORT_FLASHPOLICY, factoryPolicy, 50, config.BIND_HOSTNAME)
reactor.run() reactor.run()
def RunCmdServer(fnCmd): def RunCmdServer(fnCmd):

View file

@ -273,3 +273,34 @@ class TPT(clsTuple):
def __reduce__(self): def __reduce__(self):
return (MkTransparent, (tuple([MkPersistable(x) for x in self]),)) return (MkTransparent, (tuple([MkPersistable(x) for x in self]),))
class Partial(object):
def __init__(self, method, *args, **kwargs):
self.method = method
self.args = args
self.kwargs = kwargs
def __call__(self, *args, **kwargs):
mergedkwargs = self.kwargs.copy()
mergedkwargs.update(kwargs)
return self.method(*(self.args + args), **mergedkwargs)
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
import copy_reg
import types
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)

View file

@ -7,6 +7,7 @@ import telnet
import time import time
import login import login
import weakref import weakref
import sys
class Layer(TPrs): class Layer(TPrs):
def InitPersistent(self, ascr, stName): def InitPersistent(self, ascr, stName):
@ -816,13 +817,14 @@ class GameLobby(Game):
game = GameSprEdit(self, drawing) game = GameSprEdit(self, drawing)
else: else:
assert False, "Lobby not prepared to deal with drawing of type " + drawing.StType() assert False, "Lobby not prepared to deal with drawing of type " + drawing.StType()
def KillBoard(): game.rgdgdie.append(Partial(self.KillBoard, drawing))
del self.mpdrawing_game[drawing]
game.rgdgdie.append(KillBoard)
self.mpdrawing_game[drawing] = game self.mpdrawing_game[drawing] = game
return game return game
return self.mpdrawing_game[drawing] return self.mpdrawing_game[drawing]
def KillBoard(self, drawing):
del self.mpdrawing_game[drawing]
def CclientDrawing(self, drawing): def CclientDrawing(self, drawing):
if drawing in self.mpdrawing_game: if drawing in self.mpdrawing_game:
return len(self.mpdrawing_game[drawing].rgclient) return len(self.mpdrawing_game[drawing].rgclient)
@ -892,4 +894,6 @@ class GameSprEdit(GameWB):
return CursorSprite return CursorSprite
if __name__ == "__main__": if __name__ == "__main__":
Run(RunnerWB, "whiteboard.marm") if len(sys.argv) > 1:
config.override(sys.argv[1])
Run(RunnerWB, config.ODBPATH)