def copy_discussion(source_config, dest_config, source_slug, dest_slug, delete=False, debug=False, permissions=None): if (session_maker_is_initialized() and abspath(source_config) == get_config()["__file__"]): # not running from script dest_session = get_session_maker()() dest_metadata = get_metadata() else: dest_metadata, dest_session = engine_from_settings( dest_config, True) dest_tables = dest_metadata.sorted_tables if source_config != dest_config: from assembl.lib.sqla import _session_maker temp = _session_maker assert temp == dest_session source_metadata, source_session = engine_from_settings( source_config, False) source_tables_by_name = { table.name: table.tometadata(source_metadata, source_metadata.schema) for table in dest_tables } _session_maker = dest_session else: source_metadata, source_session = dest_metadata, dest_session try: init_key_for_classes(dest_session) from assembl.models import Discussion discussion = source_session.query(Discussion).filter_by( slug=source_slug).one() assert discussion, "No discussion named " + source_slug permissions = [x.split('+') for x in permissions or ()] for (role, permission) in permissions: assert role in SYSTEM_ROLES assert permission in ASSEMBL_PERMISSIONS existing = dest_session.query(Discussion).filter_by(slug=dest_slug).first() if existing: if delete: print("deleting", dest_slug) with transaction.manager: delete_discussion(dest_session, existing.id) else: print("Discussion", dest_slug), print("already exists! Add -d to delete it.") exit(0) from assembl.models import Role, Permission, DiscussionPermission with dest_session.no_autoflush: copy = clone_discussion( source_session, discussion.id, dest_session, dest_slug) for (role, permission) in permissions: role = dest_session.query(Role).filter_by(name=role).one() permission = dest_session.query(Permission).filter_by( name=permission).one() # assumption: Not already defined. dest_session.add(DiscussionPermission( discussion=copy, role=role, permission=permission)) except Exception: traceback.print_exc() if debug: pdb.post_mortem() capture_exception() return dest_session
def on_message(self, msg): try: if getattr(self, 'socket', None): print("closing old socket") self.loop.add_callback(self.do_close) return if msg.startswith('discussion:') and self.valid: self.discussion = msg.split(':', 1)[1] if msg.startswith('token:') and self.valid: try: self.token = decode_token( msg.split(':', 1)[1], TOKEN_SECRET) self.userId = 'local:AgentProfile/' + str( self.token['userId']) except TokenInvalid: pass if self.token and self.discussion: # Check if token authorizes discussion r = requests.get( '%s/api/v1/discussion/%s/permissions/read/u/%s' % (SERVER_URL, self.discussion, self.token['userId'])) print(r.text) if r.text != 'true': return self.socket = context.socket(zmq.SUB) self.socket.connect(INTERNAL_SOCKET) self.socket.setsockopt(zmq.SUBSCRIBE, '*') self.socket.setsockopt(zmq.SUBSCRIBE, str(self.discussion)) self.loop = zmqstream.ZMQStream(self.socket, io_loop=io_loop) self.loop.on_recv(self.on_recv) print("connected") self.send('[{"@type":"Connection"}]') except Exception: capture_exception() self.do_close()
def copy_discussion(source_config, dest_config, source_slug, dest_slug, delete=False, debug=False, permissions=None): if (session_maker_is_initialized() and abspath(source_config) == get_config()["__file__"]): # not running from script dest_session = get_session_maker()() dest_metadata = get_metadata() else: dest_metadata, dest_session = engine_from_settings( dest_config, True) dest_tables = dest_metadata.sorted_tables if source_config != dest_config: from assembl.lib.sqla import _session_maker temp = _session_maker assert temp == dest_session source_metadata, source_session = engine_from_settings( source_config, False) source_tables_by_name = { table.name: table.tometadata(source_metadata, source_metadata.schema) for table in dest_tables } _session_maker = dest_session else: source_metadata, source_session = dest_metadata, dest_session try: init_key_for_classes(dest_session) from assembl.models import Discussion discussion = source_session.query(Discussion).filter_by( slug=source_slug).one() assert discussion, "No discussion named " + source_slug permissions = [x.split('+') for x in permissions or ()] for (role, permission) in permissions: assert role in SYSTEM_ROLES assert permission in ASSEMBL_PERMISSIONS existing = dest_session.query(Discussion).filter_by(slug=dest_slug).first() if existing: if delete: print "deleting", dest_slug with transaction.manager: delete_discussion(dest_session, existing.id) else: print "Discussion", dest_slug, print "already exists! Add -d to delete it." exit(0) from assembl.models import Role, Permission, DiscussionPermission with dest_session.no_autoflush: copy = clone_discussion( source_session, discussion.id, dest_session, dest_slug) for (role, permission) in permissions: role = dest_session.query(Role).filter_by(name=role).one() permission = dest_session.query(Permission).filter_by( name=permission).one() # assumption: Not already defined. dest_session.add(DiscussionPermission( discussion=copy, role=role, permission=permission)) except Exception: traceback.print_exc() if debug: pdb.post_mortem() capture_exception() return dest_session
def decorator(*args, **kwargs): try: return fn(*args, **kwargs) except Exception: import transaction transaction.abort() capture_exception() raise
def on_close(self): if self.closing: return try: print "closing" self.do_close() except Exception: capture_exception() raise
def on_close(self): if self.closing: return try: print("closing") self.do_close() except Exception: capture_exception() raise
def error_view(exc, request): _ = TranslationStringFactory('assembl') error_code = exc.code.replace("f", "") capture_exception(getattr(request, "exc_info", None)) context = get_default_context(request) return dict( context, debate_link="/", error_code=error_code, error=_("error"), text=_("Our server has encountered a problem. The page you have requested is not accessible."), excuse=_("We apologize for the inconvenience"), home_button=_("Homepage") )
def decorator(*args, **kwargs): try: return fn(*args, **kwargs) except DataError: transaction.abort() capture_exception() request = get_current_request() error = request.localizer.translate( _("An error occurred. Please contact the administrator.")) raise Exception(error) except Exception: transaction.abort() capture_exception() raise
def on_recv(self, data): try: data = data[-1] if '@private' in data: jsondata = json.loads(data) jsondata = [x for x in jsondata if x.get('@private', self.userId) == self.userId] if not jsondata: return data = json.dumps(jsondata) self.send(data) except Exception: capture_exception() self.do_close()
def error_view(exc, request): _ = TranslationStringFactory('assembl') error_code = exc.code.replace("f", "") capture_exception(getattr(request, "exc_info", None)) context = get_default_context(request) return dict( context, debate_link="/", error_code=error_code, error=_("error"), text= _("Our server has encountered a problem. The page you have requested is not accessible." ), excuse=_("We apologize for the inconvenience"), home_button=_("Homepage"))
def new_error(self, reader_error, status=None, expected=True): import traceback from assembl.models import ContentSource log.error(traceback.format_exc()) if not expected: capture_exception() status = status or reader_error.status if status != self.last_error_status: # Counter-intuitive, but either lighter or more severe errors # reset the count. self.error_count = 1 elif status == self.last_error_status: self.error_count += 1 # escalate errors with repetition if status == ReaderStatus.TRANSIENT_ERROR: if self.error_count > self.transient_error_numlimit: status = ReaderStatus.CLIENT_ERROR self.error_count = 1 elif status == ReaderStatus.CLIENT_ERROR: if self.error_count > self.client_error_numlimit: status = ReaderStatus.IRRECOVERABLE_ERROR self.error_count = 1 else: assert False if status == ReaderStatus.TRANSIENT_ERROR: error_backoff = self.transient_error_backoff elif status == ReaderStatus.CLIENT_ERROR: error_backoff = self.client_error_backoff elif status == ReaderStatus.IRRECOVERABLE_ERROR: error_backoff = self.irrecoverable_error_backoff else: assert False # double backoff every time error_backoff *= 2 ** (self.error_count - 1) self.last_error_status = status self.source.db.rollback() self.refresh_source() self.source.connection_error = status.value self.source.error_description = str(reader_error) if (status > ReaderStatus.TRANSIENT_ERROR and self.status != ReaderStatus.SHUTDOWN): self.set_status(status) self.reimporting = False self.error_backoff_until = datetime.utcnow() + error_backoff self.source.error_backoff_until = self.error_backoff_until self.source.db.commit() self.refresh_source()
def new_error(self, reader_error, status=None, expected=True): import traceback from assembl.models import ContentSource log.error(traceback.format_exc()) if not expected: capture_exception() status = status or reader_error.status if status != self.last_error_status: # Counter-intuitive, but either lighter or more severe errors # reset the count. self.error_count = 1 elif status == self.last_error_status: self.error_count += 1 # escalate errors with repetition if status == ReaderStatus.TRANSIENT_ERROR: if self.error_count > self.transient_error_numlimit: status = ReaderStatus.CLIENT_ERROR self.error_count = 1 elif status == ReaderStatus.CLIENT_ERROR: if self.error_count > self.client_error_numlimit: status = ReaderStatus.IRRECOVERABLE_ERROR self.error_count = 1 else: assert False if status == ReaderStatus.TRANSIENT_ERROR: error_backoff = self.transient_error_backoff elif status == ReaderStatus.CLIENT_ERROR: error_backoff = self.client_error_backoff elif status == ReaderStatus.IRRECOVERABLE_ERROR: error_backoff = self.irrecoverable_error_backoff else: assert False # double backoff every time error_backoff *= 2**(self.error_count - 1) self.last_error_status = status self.source.db.rollback() self.refresh_source() self.source.connection_error = status.value self.source.error_description = str(reader_error) if (status > ReaderStatus.TRANSIENT_ERROR and self.status != ReaderStatus.SHUTDOWN): self.set_status(status) self.reimporting = False self.error_backoff_until = datetime.utcnow() + error_backoff self.source.error_backoff_until = self.error_backoff_until self.source.db.commit() self.refresh_source()
def on_recv(self, data): try: data = data[-1] if '@private' in data: jsondata = json.loads(data) jsondata = [ x for x in jsondata if x.get('@private', self.userId) == self.userId ] if not jsondata: return data = json.dumps(jsondata) self.send(data) except Exception: capture_exception() self.do_close()
def on_message(self, msg): try: if getattr(self, 'socket', None): print "closing old socket" self.loop.add_callback(self.do_close) return if msg.startswith('discussion:') and self.valid: self.discussion = msg.split(':', 1)[1] if msg.startswith('token:') and self.valid: try: self.token = decode_token( msg.split(':', 1)[1], TOKEN_SECRET) self.userId = 'local:AgentProfile/' + str( self.token['userId']) except TokenInvalid: pass if self.token and self.discussion: # Check if token authorizes discussion r = requests.get( '%s/api/v1/discussion/%s/permissions/read/u/%s' % (SERVER_URL, self.discussion, self.token['userId'])) print r.text if r.text != 'true': return self.socket = context.socket(zmq.SUB) self.socket.connect(INTERNAL_SOCKET) self.socket.setsockopt(zmq.SUBSCRIBE, '*') self.socket.setsockopt(zmq.SUBSCRIBE, str(self.discussion)) self.loop = zmqstream.ZMQStream(self.socket, io_loop=io_loop) self.loop.on_recv(self.on_recv) print "connected" self.send('[{"@type":"Connection"}]') except Exception: capture_exception() self.do_close()
user_settings={"websocket_allow_origin": SERVER_URL}) routes = sockjs_router.urls web_app = web.Application(routes, debug=False) def term(*_ignore): web_server.stop() io_loop.add_timeout(time.time() + 0.3, io_loop.stop) signal.signal(signal.SIGTERM, term) web_server = HTTPServer(web_app) web_server.listen(WEBSERVER_PORT) try: if CHANGES_SOCKET.startswith('ipc://'): sname = CHANGES_SOCKET[6:] for i in range(5): if exists(sname): break sleep(0.1) else: raise RuntimeError("could not create socket " + sname) if not access(sname, R_OK | W_OK): raise RuntimeError(sname + " cannot be accessed") io_loop.start() except KeyboardInterrupt: term() except Exception: capture_exception() raise
routes = sockjs_router.urls web_app = web.Application(routes, debug=False) def term(*_ignore): web_server.stop() io_loop.add_timeout(time.time() + 0.3, io_loop.stop) signal.signal(signal.SIGTERM, term) web_server = HTTPServer(web_app) web_server.listen(WEBSERVER_PORT) try: if CHANGES_SOCKET.startswith('ipc://'): sname = CHANGES_SOCKET[6:] for i in range(5): if exists(sname): break sleep(0.1) else: raise RuntimeError("could not create socket " + sname) if not access(sname, R_OK | W_OK): raise RuntimeError(sname + " cannot be accessed") io_loop.start() except KeyboardInterrupt: term() except Exception: capture_exception() raise