def portal_session_sync(self, portalsessions): """ Syncing all session ids of the portal with the ones of the server. This is instantiated by the portal when reconnecting. portalsessions is a dictionary {sessid: {property:value},...} defining each session and the properties in it which should be synced. """ delayed_import() global _ServerSession, _PlayerDB, _ServerConfig, _ScriptDB for sess in self.sessions.values(): # we delete the old session to make sure to catch eventual lingering references. del sess for sessid, sessdict in portalsessions.items(): sess = _ServerSession() sess.sessionhandler = self sess.load_sync_data(sessdict) if sess.uid: sess.player = _PlayerDB.objects.get_player_from_uid(sess.uid) self.sessions[sessid] = sess sess.at_sync() # after sync is complete we force-validate all scripts (this also starts them) init_mode = _ServerConfig.objects.conf("server_restart_mode", default=None) _ScriptDB.objects.validate(init_mode=init_mode) _ServerConfig.objects.conf("server_restart_mode", delete=True) # announce the reconnection self.announce_all(_(" ... Server restarted."))
def portal_connect(self, portalsession): """ Called by Portal when a new session has connected. Creates a new, unlogged-in game session. portalsession is a dictionary of all property:value keys defining the session and which is marked to be synced. """ delayed_import() global _ServerSession, _PlayerDB, _ScriptDB sess = _ServerSession() sess.sessionhandler = self sess.load_sync_data(portalsession) if sess.logged_in and sess.uid: # this can happen in the case of auto-authenticating protocols like SSH sess.player = _PlayerDB.objects.get_player_from_uid(sess.uid) sess.at_sync() # validate all script _ScriptDB.objects.validate() self.sessions[sess.sessid] = sess sess.data_in(CMD_LOGINSTART)
def amp_server_admin(self, sessid, operation, data): """ This allows the portal to perform admin operations on the server. This is executed on the Server. """ data = loads(data) #print "serveradmin (server side):", sessid, operation, data # late import of django-related stuff. This avoids having to # load these also for the portal side. global _ServerConfig, _ScriptDB, _PlayerDB, _ServerSession, _ if not _ServerConfig: from src.server.models import ServerConfig as _ServerConfig if not _ScriptDB: from src.scripts.models import ScriptDB as _ScriptDB if not _PlayerDB: from src.players.models import PlayerDB as _PlayerDB if not _ServerSession: from src.server.serversession import ServerSession as _ServerSession if not _: from django.utils.translation import ugettext as _ if operation == PCONN: #portal_session_connect # create a new session and sync it sess = _ServerSession() sess.sessionhandler = self.factory.server.sessions sess.load_sync_data(data) if sess.logged_in and sess.uid: # this can happen in the case of auto-authenticating protocols like SSH sess.player = _PlayerDB.objects.get_player_from_uid(sess.uid) sess.at_sync() # this runs initialization without acr self.factory.server.sessions.portal_connect(sessid, sess) elif operation == PDISCONN: #'portal_session_disconnect' # session closed from portal side self.factory.server.sessions.portal_disconnect(sessid) elif operation == PSYNC: #'portal_session_sync' # force a resync of sessions when portal reconnects to server (e.g. after a server reboot) # the data kwarg contains a dict {sessid: {arg1:val1,...}} representing the attributes # to sync for each session. sesslist = [] server_sessionhandler = self.factory.server.sessions for sessid, sessdict in data.items(): sess = _ServerSession() sess.sessionhandler = server_sessionhandler sess.load_sync_data(sessdict) if sess.uid: sess.player = _PlayerDB.objects.get_player_from_uid(sess.uid) sesslist.append(sess) # replace sessions on server server_sessionhandler.portal_session_sync(sesslist) # after sync is complete we force-validate all scripts (this starts everything) init_mode = _ServerConfig.objects.conf("server_restart_mode", default=None) _ScriptDB.objects.validate(init_mode=init_mode) _ServerConfig.objects.conf("server_restart_mode", delete=True) # let the server announce the reconnection server_sessionhandler.announce_all(_(" ... Server restarted.")) else: raise Exception("operation %(op)s not recognized." % {'op': operation}) return {}