Download scripts/generate_report.py from AbdulElahGwaith/Auto-Guardian-Core: direct link, hf CLI and curl.
- Browser
- Download file 5.81 kB
-
https://huggingface.co/AbdulElahGwaith/Auto-Guardian-Core/resolve/main/scripts/generate_report.py
- Command line
-
hf download hf://AbdulElahGwaith/Auto-Guardian-Core/scripts/generate_report.py
-
curl -L -o generate_report.py https://huggingface.co/AbdulElahGwaith/Auto-Guardian-Core/resolve/main/scripts/generate_report.py
5.81 kB
| #!/usr/bin/env python3 | |
| # سكريبت إنشاء تقارير الأمان | |
| import json | |
| import os | |
| from datetime import datetime | |
| def load_json_file(filepath): | |
| """تحميل ملف JSON""" | |
| if os.path.exists(filepath): | |
| with open(filepath, 'r', encoding='utf-8') as f: | |
| return json.load(f) | |
| return None | |
| def generate_markdown_report(data): | |
| """إنشاء تقرير Markdown""" | |
| if not data: | |
| return None | |
| summary = data.get('summary', {}) | |
| findings = data.get('findings', []) | |
| metadata = data.get('metadata', {}) | |
| # تصنيف المشاكل حسب الشدة | |
| critical = [f for f in findings if f.get('severity') == 'CRITICAL'] | |
| high = [f for f in findings if f.get('severity') == 'HIGH'] | |
| medium = [f for f in findings if f.get('severity') == 'MEDIUM'] | |
| low = [f for f in findings if f.get('severity') == 'LOW'] | |
| report = f"""# تقرير الأمان - Auto-Guardian | |
| ## معلومات التقرير | |
| - **تاريخ الفحص:** {metadata.get('timestamp', 'غير متوفر')} | |
| - **الالتزام:** {metadata.get('git', {}).get('commit_sha', 'غير متوفر')} | |
| - **الفرع:** {metadata.get('git', {}).get('branch', 'غير متوفر')} | |
| - **إصدار الأداة:** {metadata.get('version', '1.0.0')} | |
| --- | |
| ## ملخص النتائج | |
| | المقياس | القيمة | | |
| |---------|--------| | |
| | **نتيجة الأمان** | {summary.get('security_score', 0)}/100 | | |
| | **التقدير** | {summary.get('grade', '-')} | | |
| | **إجمالي المشاكل** | {summary.get('total_issues', 0)} | | |
| | **ملفات مفحوصة** | {summary.get('files_scanned', 0)} | | |
| | **مشاكل حرجة** | {len(critical)} | | |
| | **مشاكل عالية** | {len(high)} | | |
| | **مشاكل متوسطة** | {len(medium)} | | |
| | **مشاكل منخفضة** | {len(low)} | | |
| --- | |
| ## المشاكل الحرجة ({len(critical)}) | |
| """ | |
| if critical: | |
| for i, finding in enumerate(critical, 1): | |
| report += f"""### {i}. {finding.get('rule_name', finding.get('rule_id', 'غير معروف'))} | |
| - **الملف:** `{finding.get('file', 'غير معروف')}:{finding.get('line', 0)}` | |
| - **الأداة:** {finding.get('tool_name', finding.get('tool', 'غير معروف'))} | |
| - **الوصف:** {finding.get('message', finding.get('description', 'غير متوفر'))} | |
| - **مستوى الثقة:** {finding.get('confidence', 'غير معروف')} | |
| - **اللغة:** {finding.get('language', 'غير معروفة')} | |
| """ | |
| else: | |
| report += "لا توجد مشاكل حرجة! ممتاز! 🎉\n\n" | |
| report += f"""--- | |
| ## المشاكل العالية ({len(high)}) | |
| """ | |
| if high: | |
| for i, finding in enumerate(high, 1): | |
| report += f"""### {i}. {finding.get('rule_name', finding.get('rule_id', 'غير معروف'))} | |
| - **الملف:** `{finding.get('file', 'غير معروف')}:{finding.get('line', 0)}` | |
| - **الأداة:** {finding.get('tool_name', finding.get('tool', 'غير معروف'))} | |
| - **الوصف:** {finding.get('message', finding.get('description', 'غير متوفر'))} | |
| """ | |
| else: | |
| report += "لا توجد مشاكل عالية! 🎉\n\n" | |
| report += f"""--- | |
| ## التوصيات | |
| """ | |
| # إضافة توصيات بناءً على النتائج | |
| if len(critical) > 0: | |
| report += "1. **أولوية قصوى:** معالجة المشاكل الحرجة المكتشفة فوراً.\n" | |
| if len(high) > 0: | |
| report += "2. **أولوية عالية:** حل المشاكل العالية في أقرب وقت ممكن.\n" | |
| if len(medium) > 0: | |
| report += "3. **أولوية متوسطة:** جدولة حل المشاكل المتوسطة في الدورة القادمة.\n" | |
| if len(low) > 0: | |
| report += "4. **أولوية منخفضة:** يمكن معالجة المشاكل منخفضة عند توفر الوقت.\n" | |
| report += """ | |
| --- | |
| ## اللغات المفحوصة | |
| """ | |
| languages = data.get('languages', {}) | |
| for lang in languages.get('detected', []): | |
| lines = languages.get('lines_of_code', {}).get(lang, 0) | |
| tools = languages.get('tools_used', {}).get(lang, {}) | |
| report += f"- **{lang}:** {lines:,} سطر من الكود (فحص بـ {tools.get('issues', 0)} مشاكل)\n" | |
| report += f""" | |
| --- | |
| ## أدوات الفحص المستخدمة | |
| """ | |
| tools_used = languages.get('tools_used', {}) | |
| for tool, info in tools_used.items(): | |
| report += f"- **{tool}:** {info.get('issues', 0)} مشاكل مكتشفة (الحالة: {info.get('status', 'غير معروف')})\n" | |
| report += f""" | |
| --- | |
| *تم إنشاء هذا التقرير تلقائياً بواسطة Auto-Guardian في {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}* | |
| """ | |
| return report | |
| def main(): | |
| """الدالة الرئيسية""" | |
| print("=" * 50) | |
| print("Auto-Guardian: إنشاء تقرير الأمان") | |
| print("=" * 50) | |
| # تحميل بيانات الفحص | |
| data = load_json_file('scan_results.json') | |
| if not data: | |
| print("❌ لم يتم العثور على بيانات الفحص!") | |
| print(" يرجى تشغيل aggregate_results.py أولاً") | |
| return | |
| # إنشاء التقرير | |
| report = generate_markdown_report(data) | |
| if report: | |
| # حفظ التقرير | |
| output_file = 'reports/security_report.md' | |
| os.makedirs('reports', exist_ok=True) | |
| with open(output_file, 'w', encoding='utf-8') as f: | |
| f.write(report) | |
| print(f"✅ تم إنشاء التقرير بنجاح!") | |
| print(f" الملف: {output_file}") | |
| print("=" * 50) | |
| else: | |
| print("❌ فشل في إنشاء التقرير") | |
| if __name__ == "__main__": | |
| main() | |