Пример #1
0
    class SessionRunner(object):
        def __init__(self, SessionClass, config):
            self.reaktor = None
            self.app = None
            self.session = None
            self._SessionClass = SessionClass
            self._config = config

        def _run(self, conn, args):
            self.reaktor = Reaktor()
            parent_link = ConnectedTransport(self.reaktor, conn)
            self.app = SessionApp(parent_link)

            self.session = self._SessionClass(self.reaktor)
            for key, val in self._config.items():
                self.session.set_conf(key, val)
            self.session.linkup(self.app)
            self.app.linkdown(self.session)
            self.app.start()
            self.session.start(args)
            signal.signal(signal.SIGTERM, self.reaktor.sigterm)
            save_path = self._config.get('session_state_file', '')
            savelist = []
            if save_path:
                savelist = [(self.session, save_path)]
            self.reaktor.run(savelist=savelist, exc_handler=self._exc_handler)
            
        def __call__(self, conn, args):
            self._run(conn, args)

        def _sigterm(self, signo, frame):
            self.reaktor.stop()

        def _exc_handler(self, ex):
            if isinstance(ex, exc.SessionError):
                self.app.send(ex)
                return True
            return False