コード例 #1
0
async def fixture_rest_manager(api_port, tmp_path, endpoint):
    config = TriblerConfig()
    config.api.http_enabled = True
    config.api.http_port = api_port
    root_endpoint = RootEndpoint(
        middlewares=[ApiKeyMiddleware(config.api.key), error_middleware])
    root_endpoint.add_endpoint('/events', endpoint)
    rest_manager = RESTManager(config=config.api,
                               root_endpoint=root_endpoint,
                               state_dir=tmp_path)

    await rest_manager.start()
    yield rest_manager
    await rest_manager.stop()
コード例 #2
0
ファイル: extract_swagger.py プロジェクト: xoriole/tribler
async def extract_swagger(destination_fn):
    config = TriblerConfig()
    config.api.key = 'apikey'
    config.api.http_enabled = False
    config.api.https_enabled = False

    root_endpoint = RootEndpoint(
        middlewares=[ApiKeyMiddleware(config.api.key), error_middleware])
    api_manager = RESTManager(config=config.api,
                              root_endpoint=root_endpoint,
                              state_dir=config.state_dir)
    await api_manager.start()

    fp = StringIO()
    proto = aiohttp.web_protocol.RequestHandler(api_manager.runner._server,
                                                loop=get_event_loop())
    proto.connection_made(
        Mock(is_closing=lambda: False, write=lambda b: fp.write(b.decode())))
    proto.data_received(b'GET /docs/swagger.json HTTP/1.1\r\n'
                        b'Connection: close\r\n\r\n')
    await proto.start()
    api_spec = json.loads(fp.getvalue().split('\r\n\r\n')[1])

    # All responses should have a description
    for _, path in api_spec['paths'].items():
        for _, spec in path.items():
            for _, response in spec['responses'].items():
                if 'description' not in response:
                    response['description'] = ''
    # Convert to yaml
    with open(destination_fn, 'w') as destination_fp:
        destination_fp.write(yaml.dump(api_spec))
コード例 #3
0
async def rest_manager(request, tribler_config, api_port, tmp_path):
    config = tribler_config
    api_key_marker = request.node.get_closest_marker("api_key")
    if api_key_marker is not None:
        tribler_config.api.key = api_key_marker.args[0]

    enable_https_marker = request.node.get_closest_marker("enable_https")
    if enable_https_marker:
        tribler_config.api.https_enabled = True
        tribler_config.api.https_port = api_port
        shutil.copy(TESTS_DIR / 'data' / 'certfile.pem', tmp_path)
        config.api.put_path_as_relative('https_certfile', TESTS_DIR / 'data' / 'certfile.pem', tmp_path)
    else:
        tribler_config.api.http_enabled = True
        tribler_config.api.http_port = api_port
    root_endpoint = RootEndpoint(middlewares=[ApiKeyMiddleware(config.api.key), error_middleware])
    root_endpoint.add_endpoint('/settings', SettingsEndpoint(config))
    rest_manager = RESTManager(config=config.api, root_endpoint=root_endpoint, state_dir=tmp_path)
    await rest_manager.start()
    yield rest_manager
    await rest_manager.stop()
コード例 #4
0
    async def run(self):
        await super().run()
        await self.get_component(ReporterComponent)
        session = self.session
        config = session.config
        notifier = session.notifier
        shutdown_event = session.shutdown_event

        log_dir = config.general.get_path_as_absolute('log_dir',
                                                      config.state_dir)
        metadata_store_component = await self.get_component(
            MetadataStoreComponent)

        # pylint: disable=C0301
        key_component = await self.require_component(KeyComponent)
        ipv8_component = await self.maybe_component(Ipv8Component)
        libtorrent_component = await self.maybe_component(LibtorrentComponent)
        resource_monitor_component = await self.maybe_component(
            ResourceMonitorComponent)
        bandwidth_accounting_component = await self.maybe_component(
            BandwidthAccountingComponent)
        gigachannel_component = await self.maybe_component(GigaChannelComponent
                                                           )
        tag_component = await self.maybe_component(TagComponent)
        tunnel_component = await self.maybe_component(TunnelsComponent)
        torrent_checker_component = await self.maybe_component(
            TorrentCheckerComponent)
        gigachannel_manager_component = await self.maybe_component(
            GigachannelManagerComponent)

        self._events_endpoint = EventsEndpoint(
            notifier, public_key=hexlify(key_component.primary_key.key.pk))
        self.root_endpoint = RootEndpoint(
            middlewares=[ApiKeyMiddleware(config.api.key), error_middleware])

        torrent_checker = None if config.gui_test_mode else torrent_checker_component.torrent_checker
        tunnel_community = None if config.gui_test_mode else tunnel_component.community
        gigachannel_manager = None if config.gui_test_mode else gigachannel_manager_component.gigachannel_manager

        # add endpoints
        self.root_endpoint.add_endpoint('/events', self._events_endpoint)
        self.maybe_add('/settings',
                       SettingsEndpoint,
                       config,
                       download_manager=libtorrent_component.download_manager)
        self.maybe_add('/shutdown', ShutdownEndpoint, shutdown_event.set)
        self.maybe_add(
            '/debug',
            DebugEndpoint,
            config.state_dir,
            log_dir,
            tunnel_community=tunnel_community,
            resource_monitor=resource_monitor_component.resource_monitor)
        self.maybe_add('/bandwidth', BandwidthEndpoint,
                       bandwidth_accounting_component.community)
        self.maybe_add('/trustview', TrustViewEndpoint,
                       bandwidth_accounting_component.database)
        self.maybe_add('/downloads',
                       DownloadsEndpoint,
                       libtorrent_component.download_manager,
                       metadata_store=metadata_store_component.mds,
                       tunnel_community=tunnel_community)
        self.maybe_add('/createtorrent', CreateTorrentEndpoint,
                       libtorrent_component.download_manager)
        self.maybe_add('/statistics',
                       StatisticsEndpoint,
                       ipv8=ipv8_component.ipv8,
                       metadata_store=metadata_store_component.mds)
        self.maybe_add('/libtorrent', LibTorrentEndpoint,
                       libtorrent_component.download_manager)
        self.maybe_add('/torrentinfo', TorrentInfoEndpoint,
                       libtorrent_component.download_manager)
        self.maybe_add('/metadata',
                       MetadataEndpoint,
                       torrent_checker,
                       metadata_store_component.mds,
                       tags_db=tag_component.tags_db)
        self.maybe_add('/channels',
                       ChannelsEndpoint,
                       libtorrent_component.download_manager,
                       gigachannel_manager,
                       gigachannel_component.community,
                       metadata_store_component.mds,
                       tags_db=tag_component.tags_db)
        self.maybe_add('/collections',
                       ChannelsEndpoint,
                       libtorrent_component.download_manager,
                       gigachannel_manager,
                       gigachannel_component.community,
                       metadata_store_component.mds,
                       tags_db=tag_component.tags_db)
        self.maybe_add('/search',
                       SearchEndpoint,
                       metadata_store_component.mds,
                       tags_db=tag_component.tags_db)
        self.maybe_add('/remote_query', RemoteQueryEndpoint,
                       gigachannel_component.community,
                       metadata_store_component.mds)
        self.maybe_add('/tags',
                       TagsEndpoint,
                       db=tag_component.tags_db,
                       community=tag_component.community)

        # pylint: enable=C0301
        ipv8_root_endpoint = IPV8RootEndpoint()
        for _, endpoint in ipv8_root_endpoint.endpoints.items():
            endpoint.initialize(ipv8_component.ipv8)
        self.root_endpoint.add_endpoint('/ipv8', ipv8_root_endpoint)

        # Note: AIOHTTP endpoints cannot be added after the app has been started!
        rest_manager = RESTManager(config=config.api,
                                   root_endpoint=self.root_endpoint,
                                   state_dir=config.state_dir)
        await rest_manager.start()
        self.rest_manager = rest_manager

        def report_callback(reported_error: ReportedError):
            self._events_endpoint.on_tribler_exception(reported_error)

        self._core_exception_handler.report_callback = report_callback
        # Reraise the unreported error, if there is one
        if self._core_exception_handler.unreported_error:
            report_callback(self._core_exception_handler.unreported_error)
            self._core_exception_handler.unreported_error = None
コード例 #5
0
class RESTComponent(Component):
    rest_manager: RESTManager = None
    root_endpoint: RootEndpoint = None

    _events_endpoint: EventsEndpoint
    _core_exception_handler: CoreExceptionHandler = default_core_exception_handler

    def maybe_add(self, path: str, endpoint_cls: Type[RESTEndpoint], *args, **kwargs):
        """ Add the corresponding endpoint to the path in case there are no `NoneComponent`
        in *args or **kwargs
        """
        arguments_chain = chain(args, kwargs.values())
        if any(isinstance(arg, NoneComponent) for arg in arguments_chain):
            self.logger.info("Endpoint %s can't load component, skipping init", path)
            return

        self.root_endpoint.add_endpoint(path, endpoint_cls(*args, **kwargs))

    async def run(self):
        await super().run()
        await self.get_component(ReporterComponent)
        session = self.session
        config = session.config
        notifier = session.notifier
        shutdown_event = session.shutdown_event

        log_dir = config.general.get_path_as_absolute('log_dir', config.state_dir)
        metadata_store_component = await self.maybe_component(MetadataStoreComponent)

        key_component = await self.require_component(KeyComponent)
        ipv8_component = await self.maybe_component(Ipv8Component)
        libtorrent_component = await self.maybe_component(LibtorrentComponent)
        resource_monitor_component = await self.maybe_component(ResourceMonitorComponent)
        bandwidth_accounting_component = await self.maybe_component(BandwidthAccountingComponent)
        gigachannel_component = await self.maybe_component(GigaChannelComponent)
        tag_component = await self.maybe_component(TagComponent)
        tunnel_component = await self.maybe_component(TunnelsComponent)
        torrent_checker_component = await self.maybe_component(TorrentCheckerComponent)
        gigachannel_manager_component = await self.maybe_component(GigachannelManagerComponent)

        self._events_endpoint = EventsEndpoint(notifier, public_key=hexlify(key_component.primary_key.key.pk))
        self.root_endpoint = RootEndpoint(middlewares=[ApiKeyMiddleware(config.api.key), error_middleware])

        torrent_checker = None if config.gui_test_mode else torrent_checker_component.torrent_checker
        tunnel_community = None if config.gui_test_mode else tunnel_component.community
        gigachannel_manager = None if config.gui_test_mode else gigachannel_manager_component.gigachannel_manager

        # add endpoints
        self.root_endpoint.add_endpoint('/events', self._events_endpoint)
        self.maybe_add('/settings', SettingsEndpoint, config, download_manager=libtorrent_component.download_manager)
        self.maybe_add('/shutdown', ShutdownEndpoint, shutdown_event.set)
        self.maybe_add('/debug', DebugEndpoint, config.state_dir, log_dir, tunnel_community=tunnel_community,
                       resource_monitor=resource_monitor_component.resource_monitor)
        self.maybe_add('/bandwidth', BandwidthEndpoint, bandwidth_accounting_component.community)
        self.maybe_add('/trustview', TrustViewEndpoint, bandwidth_accounting_component.database)
        self.maybe_add('/downloads', DownloadsEndpoint, libtorrent_component.download_manager,
                       metadata_store=metadata_store_component.mds, tunnel_community=tunnel_community)
        self.maybe_add('/createtorrent', CreateTorrentEndpoint, libtorrent_component.download_manager)
        self.maybe_add('/statistics', StatisticsEndpoint, ipv8=ipv8_component.ipv8,
                       metadata_store=metadata_store_component.mds)
        self.maybe_add('/libtorrent', LibTorrentEndpoint, libtorrent_component.download_manager)
        self.maybe_add('/torrentinfo', TorrentInfoEndpoint, libtorrent_component.download_manager)
        self.maybe_add('/metadata', MetadataEndpoint, torrent_checker, metadata_store_component.mds,
                       tags_db=tag_component.tags_db, tag_rules_processor=tag_component.rules_processor)
        self.maybe_add('/channels', ChannelsEndpoint, libtorrent_component.download_manager, gigachannel_manager,
                       gigachannel_component.community, metadata_store_component.mds, tags_db=tag_component.tags_db,
                       tag_rules_processor=tag_component.rules_processor)
        self.maybe_add('/collections', ChannelsEndpoint, libtorrent_component.download_manager, gigachannel_manager,
                       gigachannel_component.community, metadata_store_component.mds, tags_db=tag_component.tags_db,
                       tag_rules_processor=tag_component.rules_processor)
        self.maybe_add('/search', SearchEndpoint, metadata_store_component.mds, tags_db=tag_component.tags_db)
        self.maybe_add('/remote_query', RemoteQueryEndpoint, gigachannel_component.community,
                       metadata_store_component.mds)
        self.maybe_add('/tags', TagsEndpoint, db=tag_component.tags_db, community=tag_component.community)

        ipv8_root_endpoint = IPV8RootEndpoint()
        for _, endpoint in ipv8_root_endpoint.endpoints.items():
            endpoint.initialize(ipv8_component.ipv8)
        self.root_endpoint.add_endpoint('/ipv8', ipv8_root_endpoint)

        # Note: AIOHTTP endpoints cannot be added after the app has been started!
        rest_manager = RESTManager(config=config.api, root_endpoint=self.root_endpoint, state_dir=config.state_dir)
        await rest_manager.start()
        self.rest_manager = rest_manager

        def report_callback(reported_error: ReportedError):
            self._events_endpoint.on_tribler_exception(reported_error)

        self._core_exception_handler.report_callback = report_callback
        # Reraise the unreported error, if there is one
        if self._core_exception_handler.unreported_error:
            report_callback(self._core_exception_handler.unreported_error)
            self._core_exception_handler.unreported_error = None

    async def shutdown(self):
        await super().shutdown()

        if self._core_exception_handler:
            self._core_exception_handler.report_callback = None

        if self.rest_manager:
            await self.rest_manager.stop()