async def command(): c = request.args.get('command') auth = request.headers.get('Authorization', '').replace('Bearer ', '') try: t_jwt = jwt.decode( auth, twitch_ext_secret, algorithms=['HS256'], options={"require": ["channel_id", "opaque_user_id", "role"]}) except (InvalidSignatureError, ExpiredSignatureError, InvalidTokenError, MissingRequiredClaimError): response = Response('') response.status_code = 403 response.headers['Access-Control-Allow-Origin'] = '*' return response if t_jwt: if t_jwt.get('opaque_user_id', '')[0] == 'U': j = json.dumps({ 'e': 'BUTTON_COMMAND', 'd': { 'button': { 'command': c, }, 'user': { 'username': '******', }, }, }) else: app.logger.debug("JWT: " + str(t_jwt)) response = Response('') response.status_code = 403 response.headers['Access-Control-Allow-Origin'] = '*' return response else: app.logger.debug("JWT: " + str(t_jwt)) response = Response('') response.status_code = 403 response.headers['Access-Control-Allow-Origin'] = '*' return response await broadcast( j ) # after the websockets context issue is solved change this to send message only to target robot response = Response('OK') response.headers['Access-Control-Allow-Origin'] = '*' return response
def make_response(self, output: dict, format: str = "json", code: int = 200, meta: str = "meta") -> Response: """ Returns the output string based on format param """ output = self.format_dict(output) if "error" in output and meta not in output: output["timestamp"] = datetime.utcnow() if self.note: if meta not in output: output[meta] = {} output[meta]["note"] = self.note if format == "xml": root = self.report_type.upper() if self.report_type else "AVWX" resp = Response(fxml(output, custom_root=root), mimetype="text/xml") elif format == "yaml": resp = Response(yaml.dump(output, default_flow_style=False), mimetype="text/x-yaml") else: resp = jsonify(output) resp.status_code = code resp.headers["X-Robots-Tag"] = "noindex" return resp
def make_response( self, output: dict, # pylint: disable=redefined-builtin format: str = "json", code: int = 200, meta: str = "meta", root: str = "AVWX", ) -> Response: """Returns the output string based on format param""" output = self.format_output(output) if "error" in output and meta not in output: output["timestamp"] = datetime.now(tz=timezone.utc) if self.note and isinstance(output, dict): if meta not in output: output[meta] = {} output[meta]["note"] = self.note if format == "xml": resp = Response(fxml(output, custom_root=root.upper()), mimetype="text/xml") elif format == "yaml": resp = Response(yaml.dump(output, default_flow_style=False), mimetype="text/x-yaml") else: resp = jsonify(output) resp.status_code = code resp.headers["X-Robots-Tag"] = "noindex" return resp
async def avatar(from_: str, code: str) -> quart.Response: try: etag = request.headers["if-none-match"] except KeyError: etag = None address = base64.urlsafe_b64decode(repad(from_)).decode("utf-8") info = await client.get_avatar(address, metadata_only=True) bin_hash = binascii.a2b_hex(info["sha1"]) new_etag = base64.urlsafe_b64encode(bin_hash).decode("ascii").rstrip("=") cache_ttl = timedelta(seconds=current_app.config.get( "AVATAR_CACHE_TTL", 300, )) response = Response("", mimetype=info["type"]) response.headers["etag"] = new_etag # XXX: It seems to me that quart expects localtime(?!) in this field... response.expires = datetime.now() + cache_ttl response.headers["Content-Security-Policy"] = \ "frame-ancestors 'none'; default-src 'none'; style-src 'unsafe-inline'" if etag is not None and new_etag == etag: response.status_code = 304 return response data = await client.get_avatar_data(address, info["sha1"]) if data is None: response.status_code = 404 return response response.status_code = 200 if request.method == "HEAD": response.content_length = len(data) return response response.set_data(data) return response
async def channels_list(host): chanlist = [] try: for rid in robots_config[host]: chanlist.append({ "name": robots_config[host][rid]["info"]["name"], "id": rid, "chat": robots_config[host][rid]['info']['chat'] }) except KeyError: response = Response('') response.status_code = 404 response.headers['Access-Control-Allow-Origin'] = '*' return response return {"channels": chanlist}
async def get_metrics(): #log.info(request.url) target = request.args.get('target') monitor_data = Perfdata(monitorconnection.MonitorConfig(), target) # Fetch performance data from Monitor start_time = time.monotonic() try: loop = asyncio.get_event_loop() fetch_perfdata_task = loop.create_task( monitor_data.get_service_metrics()) if monitorconnection.MonitorConfig().get_enable_scrape_metadata(): fetch_metadata_task = loop.create_task( monitor_data.get_host_metrics()) await fetch_metadata_task await fetch_perfdata_task scrape_duration = time.monotonic() - start_time monitor_data.add_perfdata( "scrape_duration_seconds", { 'hostname': target, 'server': monitorconnection.MonitorConfig().get_url() }, scrape_duration) log.info("scrape", { 'target': target, 'url': request.url, 'scrape_time': scrape_duration }) target_metrics = monitor_data.prometheus_format() resp = Response(target_metrics) resp.headers['Content-Type'] = CONTENT_TYPE_LATEST # after_request_func(resp) return resp except monitorconnection.ScrapeExecption as err: log.warn( f"{err.message}", { 'target': target, 'url': request.url, 'remote_url': err.url, 'err': err.err }) resp = Response("") resp.status_code = 500 return resp