Example #1
0
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
Example #2
0
 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()
Example #3
0
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
Example #4
0
 def decorator(*args, **kwargs):
     try:
         return fn(*args, **kwargs)
     except Exception:
         import transaction
         transaction.abort()
         capture_exception()
         raise
Example #5
0
 def decorator(*args, **kwargs):
     try:
         return fn(*args, **kwargs)
     except Exception:
         import transaction
         transaction.abort()
         capture_exception()
         raise
Example #6
0
 def on_close(self):
     if self.closing:
         return
     try:
         print "closing"
         self.do_close()
     except Exception:
         capture_exception()
         raise
Example #7
0
 def on_close(self):
     if self.closing:
         return
     try:
         print("closing")
         self.do_close()
     except Exception:
         capture_exception()
         raise
Example #8
0
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")
    )
Example #9
0
 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
Example #10
0
 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()
Example #11
0
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"))
Example #12
0
    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()
Example #13
0
    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()
Example #14
0
 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()
Example #15
0
 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()
Example #16
0
    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
Example #17
0
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