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()
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))
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()
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
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()