@@ -943,118 +943,6 @@ async def get_platform_statistics_from_files() -> Dict[str, Any]:
943943 "total_rules_analyzed" : 0 ,
944944 "source" : "mongodb_empty" ,
945945 }
946-
947- # Load and analyze all rules
948- platform_data = defaultdict (
949- lambda : {
950- "name" : "" ,
951- "version" : "" ,
952- "rules" : [],
953- "categories" : defaultdict (int ),
954- "frameworks" : set (),
955- "total_rules" : 0 ,
956- }
957- )
958-
959- total_rules = 0
960-
961- # Process all JSON files
962- for json_file in rules_path .glob ("*.json" ):
963- try :
964- with open (json_file , "r" , encoding = "utf-8" ) as f :
965- rule = json .load (f )
966-
967- # Extract platform implementations
968- platform_impls = rule .get ("platform_implementations" , {})
969-
970- for platform_key , impl_data in platform_impls .items ():
971- # Map platform keys to display names
972- platform_display_name = {
973- "rhel" : "RHEL" ,
974- "ubuntu" : "Ubuntu" ,
975- "windows" : "Windows Server" ,
976- "centos" : "CentOS" ,
977- "debian" : "Debian" ,
978- }.get (platform_key , platform_key .upper ())
979-
980- platform_data [platform_key ]["name" ] = platform_display_name
981-
982- # Get latest version
983- versions = impl_data .get ("versions" , [])
984- if versions :
985- platform_data [platform_key ]["version" ] = versions [- 1 ]
986-
987- # Track this rule
988- platform_data [platform_key ]["rules" ].append (rule ["rule_id" ])
989- platform_data [platform_key ]["total_rules" ] += 1
990-
991- # Count category
992- category = rule .get ("category" , "other" )
993- platform_data [platform_key ]["categories" ][category ] += 1
994-
995- # Track frameworks
996- frameworks = rule .get ("frameworks" , {})
997- for framework in frameworks .keys ():
998- platform_data [platform_key ]["frameworks" ].add (framework )
999-
1000- total_rules += 1
1001-
1002- except Exception as e :
1003- logger .debug (f"Error processing { json_file } : { e } " )
1004- continue
1005-
1006- # Generate platform statistics
1007- platforms = []
1008-
1009- for platform_key , data in platform_data .items ():
1010- if data ["total_rules" ] == 0 :
1011- continue
1012-
1013- # Convert categories to list with percentages
1014- categories = []
1015- for category , count in data ["categories" ].items ():
1016- percentage = round ((count / data ["total_rules" ]) * 100 , 1 )
1017- categories .append (
1018- {
1019- "name" : category .replace ("_" , " " ).title (),
1020- "count" : count ,
1021- "percentage" : percentage ,
1022- }
1023- )
1024-
1025- # Sort by count and take top categories
1026- categories .sort (key = lambda x : x ["count" ], reverse = True )
1027-
1028- # Calculate coverage (simplified heuristic)
1029- coverage = min (95 , 50 + (data ["total_rules" ] / 20 ))
1030-
1031- platform_stat = {
1032- "name" : data ["name" ],
1033- "version" : data ["version" ],
1034- "ruleCount" : data ["total_rules" ],
1035- "categories" : categories [:6 ], # Top 6 categories
1036- "frameworks" : sorted (list (data ["frameworks" ])),
1037- "coverage" : round (coverage , 1 ),
1038- }
1039-
1040- platforms .append (platform_stat )
1041-
1042- # Sort platforms by rule count
1043- platforms .sort (key = lambda x : x ["ruleCount" ], reverse = True )
1044-
1045- result = {
1046- "platforms" : platforms ,
1047- "total_platforms" : len (platforms ),
1048- "total_rules_analyzed" : total_rules ,
1049- "source" : "converted_files_analysis" ,
1050- }
1051-
1052- logger .info (
1053- f"Generated platform statistics from files: { len (platforms )} platforms, { total_rules } total rules"
1054- )
1055- return result
1056-
1057-
1058946async def get_framework_statistics_from_files () -> Dict [str , Any ]:
1059947 """
1060948 DEPRECATED: Return empty framework statistics when MongoDB is empty.
@@ -1069,137 +957,4 @@ async def get_framework_statistics_from_files() -> Dict[str, Any]:
1069957 "source" : "mongodb_empty" ,
1070958 }
1071959
1072- # Load and analyze all rules
1073- framework_data = defaultdict (
1074- lambda : {
1075- "name" : "" ,
1076- "version" : "" ,
1077- "rules" : set (),
1078- "categories" : defaultdict (int ),
1079- "platforms" : set (),
1080- "total_rules" : 0 ,
1081- "versions" : set (),
1082- }
1083- )
1084-
1085- total_rules = 0
1086-
1087- # Process all JSON files
1088- for json_file in rules_path .glob ("*.json" ):
1089- try :
1090- with open (json_file , "r" , encoding = "utf-8" ) as f :
1091- rule = json .load (f )
1092-
1093- # Extract frameworks
1094- frameworks = rule .get ("frameworks" , {})
1095-
1096- for framework_key , framework_versions in frameworks .items ():
1097- if not framework_versions : # Skip empty frameworks
1098- continue
1099-
1100- # Map framework keys to display names
1101- framework_display_name = {
1102- "nist" : "NIST" ,
1103- "cis" : "CIS" ,
1104- "stig" : "STIG" ,
1105- "pci_dss" : "PCI-DSS" ,
1106- "iso27001" : "ISO 27001" ,
1107- "hipaa" : "HIPAA" ,
1108- }.get (framework_key , framework_key .upper ())
1109-
1110- framework_data [framework_key ]["name" ] = framework_display_name
1111-
1112- # Get framework versions
1113- if isinstance (framework_versions , dict ):
1114- for version in framework_versions .keys ():
1115- framework_data [framework_key ]["versions" ].add (version )
1116-
1117- # Track this rule (using set to avoid duplicates)
1118- framework_data [framework_key ]["rules" ].add (rule ["rule_id" ])
1119-
1120- # Count category
1121- category = rule .get ("category" , "other" )
1122- framework_data [framework_key ]["categories" ][category ] += 1
1123-
1124- # Track platforms
1125- platform_impls = rule .get ("platform_implementations" , {})
1126- for platform in platform_impls .keys ():
1127- framework_data [framework_key ]["platforms" ].add (platform )
1128-
1129- total_rules += 1
1130-
1131- except Exception as e :
1132- logger .debug (f"Error processing { json_file } : { e } " )
1133- continue
1134-
1135- # Generate framework statistics
1136- frameworks = []
1137-
1138- for framework_key , data in framework_data .items ():
1139- if len (data ["rules" ]) == 0 :
1140- continue
1141-
1142- # Update total rules count
1143- data ["total_rules" ] = len (data ["rules" ])
1144-
1145- # Get latest version
1146- versions_list = sorted (list (data ["versions" ]))
1147- latest_version = versions_list [- 1 ] if versions_list else "1.0"
1148-
1149- # Convert categories to list with percentages
1150- categories = []
1151- for category , count in data ["categories" ].items ():
1152- percentage = round ((count / data ["total_rules" ]) * 100 , 1 )
1153- categories .append (
1154- {
1155- "name" : category .replace ("_" , " " ).title (),
1156- "count" : count ,
1157- "percentage" : percentage ,
1158- }
1159- )
1160-
1161- # Sort by count and take top categories
1162- categories .sort (key = lambda x : x ["count" ], reverse = True )
1163-
1164- # Map platforms to display names
1165- platform_names = []
1166- for platform in sorted (data ["platforms" ]):
1167- platform_display = {
1168- "rhel" : "RHEL" ,
1169- "ubuntu" : "Ubuntu" ,
1170- "windows" : "Windows" ,
1171- "centos" : "CentOS" ,
1172- "debian" : "Debian" ,
1173- }.get (platform , platform .upper ())
1174- platform_names .append (platform_display )
1175-
1176- # Calculate coverage based on rule count and platform support
1177- base_coverage = min (90 , 60 + (data ["total_rules" ] / 30 ))
1178- platform_bonus = min (15 , len (data ["platforms" ]) * 3 )
1179- coverage = min (95 , base_coverage + platform_bonus )
1180-
1181- framework_stat = {
1182- "name" : data ["name" ],
1183- "version" : latest_version ,
1184- "ruleCount" : data ["total_rules" ],
1185- "categories" : categories [:6 ], # Top 6 categories
1186- "platforms" : platform_names ,
1187- "coverage" : round (coverage , 1 ),
1188- }
1189-
1190- frameworks .append (framework_stat )
1191-
1192- # Sort frameworks by rule count
1193- frameworks .sort (key = lambda x : x ["ruleCount" ], reverse = True )
1194-
1195- result = {
1196- "frameworks" : frameworks ,
1197- "total_frameworks" : len (frameworks ),
1198- "total_rules_analyzed" : total_rules ,
1199- "source" : "converted_files_analysis" ,
1200- }
1201-
1202- logger .info (
1203- f"Generated framework statistics from files: { len (frameworks )} frameworks, { total_rules } total rules"
1204- )
1205960 return result
0 commit comments