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