Add generate, report, and utils modules
This commit is contained in:
95
config_auditor/report.py
Normal file
95
config_auditor/report.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
import json
|
||||||
|
from typing import Any, Callable, Dict, List
|
||||||
|
from config_auditor.rules import Issue
|
||||||
|
|
||||||
|
|
||||||
|
class ReportGenerator:
|
||||||
|
def to_json(self, issues: List[Issue]) -> str:
|
||||||
|
result = {
|
||||||
|
"summary": {
|
||||||
|
"total": len(issues),
|
||||||
|
"critical": sum(1 for i in issues if i.severity == "critical"),
|
||||||
|
"warning": sum(1 for i in issues if i.severity == "warning"),
|
||||||
|
"info": sum(1 for i in issues if i.severity == "info"),
|
||||||
|
},
|
||||||
|
"issues": [
|
||||||
|
{
|
||||||
|
"severity": i.severity,
|
||||||
|
"category": i.category,
|
||||||
|
"message": i.message,
|
||||||
|
"file": str(i.file),
|
||||||
|
"line": i.line,
|
||||||
|
"suggestion": i.suggestion,
|
||||||
|
}
|
||||||
|
for i in issues
|
||||||
|
],
|
||||||
|
}
|
||||||
|
return json.dumps(result, indent=2)
|
||||||
|
|
||||||
|
def to_yaml(self, issues: List[Issue]) -> str:
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"summary": {
|
||||||
|
"total": len(issues),
|
||||||
|
"critical": sum(1 for i in issues if i.severity == "critical"),
|
||||||
|
"warning": sum(1 for i in issues if i.severity == "warning"),
|
||||||
|
"info": sum(1 for i in issues if i.severity == "info"),
|
||||||
|
},
|
||||||
|
"issues": [
|
||||||
|
{
|
||||||
|
"severity": i.severity,
|
||||||
|
"category": i.category,
|
||||||
|
"message": i.message,
|
||||||
|
"file": str(i.file),
|
||||||
|
"line": i.line,
|
||||||
|
"suggestion": i.suggestion,
|
||||||
|
}
|
||||||
|
for i in issues
|
||||||
|
],
|
||||||
|
}
|
||||||
|
return yaml.dump(result, default_flow_style=False)
|
||||||
|
|
||||||
|
def to_text(self, issues: List[Issue], output_func: Callable[[str], None]):
|
||||||
|
critical = [i for i in issues if i.severity == "critical"]
|
||||||
|
warnings = [i for i in issues if i.severity == "warning"]
|
||||||
|
infos = [i for i in issues if i.severity == "info"]
|
||||||
|
|
||||||
|
output_func("\n=== Audit Report ===")
|
||||||
|
output_func(f"Total issues: {len(issues)}")
|
||||||
|
output_func(f" Critical: {len(critical)}")
|
||||||
|
output_func(f" Warnings: {len(warnings)}")
|
||||||
|
output_func(f" Info: {len(infos)}")
|
||||||
|
|
||||||
|
if critical:
|
||||||
|
output_func("\n=== Critical Issues ===")
|
||||||
|
for i in critical:
|
||||||
|
output_func(f"[CRITICAL] {i.file}: {i.message}")
|
||||||
|
if i.suggestion:
|
||||||
|
output_func(f" -> {i.suggestion}")
|
||||||
|
|
||||||
|
if warnings:
|
||||||
|
output_func("\n=== Warnings ===")
|
||||||
|
for i in warnings:
|
||||||
|
output_func(f"[WARNING] {i.file}: {i.message}")
|
||||||
|
if i.suggestion:
|
||||||
|
output_func(f" -> {i.suggestion}")
|
||||||
|
|
||||||
|
if infos:
|
||||||
|
output_func("\n=== Informational ===")
|
||||||
|
for i in infos:
|
||||||
|
output_func(f"[INFO] {i.file}: {i.message}")
|
||||||
|
|
||||||
|
if not issues:
|
||||||
|
output_func("\nNo issues found. Configuration looks good!")
|
||||||
|
|
||||||
|
def generate_summary(self, issues: List[Issue]) -> Dict[str, Any]:
|
||||||
|
return {
|
||||||
|
"total": len(issues),
|
||||||
|
"by_severity": {
|
||||||
|
"critical": sum(1 for i in issues if i.severity == "critical"),
|
||||||
|
"warning": sum(1 for i in issues if i.severity == "warning"),
|
||||||
|
"info": sum(1 for i in issues if i.severity == "info"),
|
||||||
|
},
|
||||||
|
"by_category": {},
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user