File size: 5,806 Bytes
7270c96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/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()