#!/usr/bin/env python3 import os from flask import Flask, request, jsonify, render_template_string, send_file import json from datetime import datetime import argparse app = Flask(__name__) BASE_PATH = 'crash_reports' @app.route('/', methods=['GET']) def list_reports(): try: if not os.path.exists(BASE_PATH): return jsonify({"error": "No reports directory found"}), 404 # Get page number from query parameters, default to 1 page = int(request.args.get('page', 1)) per_page = 10 reports = os.listdir(BASE_PATH) if not reports: return render_template_string("""
No crash reports found.
""") # Build report pairs with metadata report_pairs = [] for report in reports: if not report.endswith('.info'): info_file = f"{report}.info" if info_file in reports: try: dump_path = os.path.join(BASE_PATH, report) timestamp = os.path.getctime(dump_path) upload_time = datetime.fromtimestamp(timestamp) with open(os.path.join(BASE_PATH, info_file), 'r') as f: metadata = json.load(f) report_pairs.append({ 'dump_file': report, 'info_file': info_file, 'metadata': metadata, 'sort_key': f"{metadata.get('client_sha', '')}-{metadata.get('jamicore_sha', '')}", 'download_name': f"{metadata.get('client_sha', 'unknown')}-{metadata.get('jamicore_sha', 'unknown')}-{metadata.get('platform', 'unknown').replace(' ', '_')}", 'upload_time': upload_time }) except json.JSONDecodeError: print(f"Error parsing metadata file: {info_file}") continue # Sort reports by upload time (most recent first), then by SHA report_pairs.sort(key=lambda x: (-x['upload_time'].timestamp(), x['sort_key'])) # Calculate pagination values total_reports = len(report_pairs) total_pages = (total_reports + per_page - 1) // per_page page = min(max(1, page), total_pages or 1) # Handle case when total_pages is 0 start_idx = (page - 1) * per_page end_idx = start_idx + per_page # Get current page's reports current_page_reports = report_pairs[start_idx:end_idx] return render_template_string("""Platform: | {{ report['metadata']['platform'] }} |
Client SHA: | {{ report['metadata']['client_sha'] }} |
Jami Core SHA: | {{ report['metadata']['jamicore_sha'] }} |
Build ID: | {{ report['metadata']['build_id'] }} |
GUID: | {{ report['metadata']['guid'] }} |