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)
Beispiel #3
0
    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 {}