regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. regscale/_version.py +1 -1
  2. regscale/airflow/hierarchy.py +2 -2
  3. regscale/core/app/api.py +5 -2
  4. regscale/core/app/application.py +36 -6
  5. regscale/core/app/internal/control_editor.py +73 -21
  6. regscale/core/app/internal/evidence.py +727 -204
  7. regscale/core/app/internal/login.py +4 -2
  8. regscale/core/app/internal/model_editor.py +219 -64
  9. regscale/core/app/utils/app_utils.py +86 -12
  10. regscale/core/app/utils/catalog_utils/common.py +1 -1
  11. regscale/core/login.py +21 -4
  12. regscale/core/utils/async_graphql_client.py +363 -0
  13. regscale/core/utils/date.py +77 -1
  14. regscale/dev/cli.py +26 -0
  15. regscale/dev/code_gen.py +109 -24
  16. regscale/dev/version.py +72 -0
  17. regscale/integrations/commercial/__init__.py +30 -2
  18. regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
  19. regscale/integrations/commercial/aws/cli.py +3107 -54
  20. regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
  21. regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
  22. regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
  23. regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
  24. regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
  25. regscale/integrations/commercial/aws/config_compliance.py +914 -0
  26. regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
  27. regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
  28. regscale/integrations/commercial/aws/evidence_generator.py +283 -0
  29. regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
  30. regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
  31. regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
  32. regscale/integrations/commercial/aws/iam_evidence.py +574 -0
  33. regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
  34. regscale/integrations/commercial/aws/inventory/base.py +107 -5
  35. regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
  36. regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
  37. regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
  38. regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
  39. regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
  40. regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
  41. regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
  42. regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
  43. regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
  44. regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
  45. regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
  46. regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
  47. regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
  48. regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
  49. regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
  50. regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
  51. regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
  52. regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
  53. regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
  54. regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
  55. regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
  56. regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
  57. regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
  58. regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
  59. regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
  60. regscale/integrations/commercial/aws/kms_evidence.py +879 -0
  61. regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
  62. regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
  63. regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
  64. regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
  65. regscale/integrations/commercial/aws/org_evidence.py +666 -0
  66. regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
  67. regscale/integrations/commercial/aws/s3_evidence.py +632 -0
  68. regscale/integrations/commercial/aws/scanner.py +1072 -205
  69. regscale/integrations/commercial/aws/security_hub.py +319 -0
  70. regscale/integrations/commercial/aws/session_manager.py +282 -0
  71. regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
  72. regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
  73. regscale/integrations/commercial/jira.py +489 -153
  74. regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
  75. regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
  76. regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
  77. regscale/integrations/commercial/qualys/__init__.py +167 -68
  78. regscale/integrations/commercial/qualys/scanner.py +305 -39
  79. regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
  80. regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
  81. regscale/integrations/commercial/sicura/api.py +79 -42
  82. regscale/integrations/commercial/sicura/commands.py +8 -2
  83. regscale/integrations/commercial/sicura/scanner.py +83 -44
  84. regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
  85. regscale/integrations/commercial/synqly/assets.py +133 -16
  86. regscale/integrations/commercial/synqly/edr.py +2 -8
  87. regscale/integrations/commercial/synqly/query_builder.py +536 -0
  88. regscale/integrations/commercial/synqly/ticketing.py +27 -0
  89. regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
  90. regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
  91. regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
  92. regscale/integrations/commercial/tenablev2/commands.py +146 -5
  93. regscale/integrations/commercial/tenablev2/scanner.py +1 -3
  94. regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
  95. regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
  96. regscale/integrations/commercial/wizv2/click.py +191 -76
  97. regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
  98. regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
  99. regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
  100. regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
  101. regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
  102. regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
  103. regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
  104. regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
  105. regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
  106. regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
  107. regscale/integrations/commercial/wizv2/issue.py +776 -28
  108. regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
  109. regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
  110. regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
  111. regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
  112. regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
  113. regscale/integrations/commercial/wizv2/reports.py +243 -0
  114. regscale/integrations/commercial/wizv2/sbom.py +1 -1
  115. regscale/integrations/commercial/wizv2/scanner.py +1031 -441
  116. regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
  117. regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
  118. regscale/integrations/commercial/wizv2/variables.py +89 -3
  119. regscale/integrations/compliance_integration.py +1036 -151
  120. regscale/integrations/control_matcher.py +432 -0
  121. regscale/integrations/due_date_handler.py +333 -0
  122. regscale/integrations/milestone_manager.py +291 -0
  123. regscale/integrations/public/__init__.py +14 -0
  124. regscale/integrations/public/cci_importer.py +834 -0
  125. regscale/integrations/public/csam/__init__.py +0 -0
  126. regscale/integrations/public/csam/csam.py +938 -0
  127. regscale/integrations/public/csam/csam_agency_defined.py +179 -0
  128. regscale/integrations/public/csam/csam_common.py +154 -0
  129. regscale/integrations/public/csam/csam_controls.py +432 -0
  130. regscale/integrations/public/csam/csam_poam.py +124 -0
  131. regscale/integrations/public/fedramp/click.py +77 -6
  132. regscale/integrations/public/fedramp/docx_parser.py +10 -1
  133. regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
  134. regscale/integrations/public/fedramp/fedramp_five.py +1 -1
  135. regscale/integrations/public/fedramp/poam/scanner.py +75 -7
  136. regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
  137. regscale/integrations/scanner_integration.py +1961 -430
  138. regscale/models/integration_models/CCI_List.xml +1 -0
  139. regscale/models/integration_models/aqua.py +2 -2
  140. regscale/models/integration_models/cisa_kev_data.json +805 -11
  141. regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
  142. regscale/models/integration_models/nexpose.py +36 -10
  143. regscale/models/integration_models/qualys.py +3 -4
  144. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  145. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
  146. regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
  147. regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
  148. regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
  149. regscale/models/locking.py +12 -8
  150. regscale/models/platform.py +4 -2
  151. regscale/models/regscale_models/__init__.py +7 -0
  152. regscale/models/regscale_models/assessment.py +2 -1
  153. regscale/models/regscale_models/catalog.py +1 -1
  154. regscale/models/regscale_models/compliance_settings.py +251 -1
  155. regscale/models/regscale_models/component.py +1 -0
  156. regscale/models/regscale_models/control_implementation.py +236 -41
  157. regscale/models/regscale_models/control_objective.py +74 -5
  158. regscale/models/regscale_models/file.py +2 -0
  159. regscale/models/regscale_models/form_field_value.py +5 -3
  160. regscale/models/regscale_models/inheritance.py +44 -0
  161. regscale/models/regscale_models/issue.py +301 -102
  162. regscale/models/regscale_models/milestone.py +33 -14
  163. regscale/models/regscale_models/organization.py +3 -0
  164. regscale/models/regscale_models/regscale_model.py +310 -73
  165. regscale/models/regscale_models/security_plan.py +4 -2
  166. regscale/models/regscale_models/vulnerability.py +3 -3
  167. regscale/regscale.py +25 -4
  168. regscale/templates/__init__.py +0 -0
  169. regscale/utils/threading/threadhandler.py +20 -15
  170. regscale/validation/record.py +23 -1
  171. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
  172. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
  173. tests/core/__init__.py +0 -0
  174. tests/core/utils/__init__.py +0 -0
  175. tests/core/utils/test_async_graphql_client.py +472 -0
  176. tests/fixtures/test_fixture.py +13 -8
  177. tests/regscale/core/test_login.py +171 -4
  178. tests/regscale/integrations/commercial/__init__.py +0 -0
  179. tests/regscale/integrations/commercial/aws/__init__.py +0 -0
  180. tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
  181. tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
  182. tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
  183. tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
  184. tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
  185. tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
  186. tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
  187. tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
  188. tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
  189. tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
  190. tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
  191. tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
  192. tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
  193. tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
  194. tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
  195. tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
  196. tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
  197. tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
  198. tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
  199. tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
  200. tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
  201. tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
  202. tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
  203. tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
  204. tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
  205. tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
  206. tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
  207. tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
  208. tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
  209. tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
  210. tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
  211. tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
  212. tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
  213. tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
  214. tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
  215. tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
  216. tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
  217. tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
  218. tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
  219. tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
  220. tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
  221. tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
  222. tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
  223. tests/regscale/integrations/commercial/conftest.py +28 -0
  224. tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
  225. tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
  226. tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
  227. tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
  228. tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
  229. tests/regscale/integrations/commercial/test_aws.py +3742 -0
  230. tests/regscale/integrations/commercial/test_burp.py +48 -0
  231. tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
  232. tests/regscale/integrations/commercial/test_dependabot.py +341 -0
  233. tests/regscale/integrations/commercial/test_gcp.py +1543 -0
  234. tests/regscale/integrations/commercial/test_gitlab.py +549 -0
  235. tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
  236. tests/regscale/integrations/commercial/test_jira.py +2204 -0
  237. tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
  238. tests/regscale/integrations/commercial/test_okta.py +1228 -0
  239. tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
  240. tests/regscale/integrations/commercial/test_sicura.py +349 -0
  241. tests/regscale/integrations/commercial/test_snow.py +423 -0
  242. tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
  243. tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
  244. tests/regscale/integrations/commercial/test_stig.py +33 -0
  245. tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
  246. tests/regscale/integrations/commercial/test_stigv2.py +406 -0
  247. tests/regscale/integrations/commercial/test_wiz.py +1365 -0
  248. tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
  249. tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
  250. tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
  251. tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
  252. tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
  253. tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
  254. tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
  255. tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
  256. tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
  257. tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
  258. tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
  259. tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
  260. tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
  261. tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
  262. tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
  263. tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
  264. tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
  265. tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
  266. tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
  267. tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
  268. tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
  269. tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
  270. tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
  271. tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
  272. tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
  273. tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
  274. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
  275. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
  276. tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
  277. tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
  278. tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
  279. tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
  280. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
  281. tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
  282. tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
  283. tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
  284. tests/regscale/integrations/public/__init__.py +0 -0
  285. tests/regscale/integrations/public/fedramp/__init__.py +1 -0
  286. tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
  287. tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
  288. tests/regscale/integrations/public/test_alienvault.py +220 -0
  289. tests/regscale/integrations/public/test_cci.py +1053 -0
  290. tests/regscale/integrations/public/test_cisa.py +1021 -0
  291. tests/regscale/integrations/public/test_emass.py +518 -0
  292. tests/regscale/integrations/public/test_fedramp.py +1152 -0
  293. tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
  294. tests/regscale/integrations/public/test_file_uploads.py +506 -0
  295. tests/regscale/integrations/public/test_oscal.py +453 -0
  296. tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
  297. tests/regscale/integrations/test_control_matcher.py +1421 -0
  298. tests/regscale/integrations/test_control_matching.py +155 -0
  299. tests/regscale/integrations/test_milestone_manager.py +408 -0
  300. tests/regscale/models/test_control_implementation.py +118 -3
  301. tests/regscale/models/test_form_field_value_integration.py +304 -0
  302. tests/regscale/models/test_issue.py +378 -1
  303. tests/regscale/models/test_module_integration.py +582 -0
  304. tests/regscale/models/test_tenable_integrations.py +811 -105
  305. regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
  306. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
  307. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
  308. regscale/integrations/public/fedramp/parts_mapper.py +0 -107
  309. /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
  310. /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
  311. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
  312. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
  313. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
  314. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
@@ -1,49 +1,52 @@
1
1
  """AWS storage resource collectors."""
2
2
 
3
- from typing import Dict, List, Any
3
+ from typing import Dict, List, Any, Optional
4
4
 
5
+ from regscale.integrations.commercial.aws.inventory.resources.s3 import S3Collector
5
6
  from ..base import BaseCollector
6
7
 
7
8
 
8
9
  class StorageCollector(BaseCollector):
9
- """Collector for AWS storage resources."""
10
+ """Collector for AWS storage resources with filtering support."""
11
+
12
+ def __init__(
13
+ self,
14
+ session: Any,
15
+ region: str,
16
+ account_id: Optional[str] = None,
17
+ tags: Optional[Dict[str, str]] = None,
18
+ enabled_services: Optional[Dict[str, bool]] = None,
19
+ ):
20
+ """
21
+ Initialize storage collector with filtering support.
22
+
23
+ :param session: AWS session to use for API calls
24
+ :param str region: AWS region to collect from
25
+ :param str account_id: Optional AWS account ID to filter resources
26
+ :param dict tags: Optional tag filters (AND logic)
27
+ :param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
28
+ """
29
+ super().__init__(session, region, account_id, tags)
30
+ self.enabled_services = enabled_services or {}
10
31
 
11
32
  def get_s3_buckets(self) -> List[Dict[str, Any]]:
12
33
  """
13
- Get information about S3 buckets.
34
+ Get information about S3 buckets with filtering.
14
35
 
15
36
  :return: List of S3 bucket information
16
37
  :rtype: List[Dict[str, Any]]
17
38
  """
18
- buckets = []
19
39
  try:
20
- s3 = self._get_client("s3")
21
- response = s3.list_buckets()
22
-
23
- for bucket in response.get("Buckets", []):
24
- try:
25
- location = s3.get_bucket_location(Bucket=bucket["Name"])
26
- region = location.get("LocationConstraint") or "us-east-1"
27
-
28
- # Only include buckets in the target region
29
- if region == self.region:
30
- buckets.append(
31
- {
32
- "Region": self.region,
33
- "Name": bucket["Name"],
34
- "CreationDate": str(bucket["CreationDate"]),
35
- "Location": region,
36
- }
37
- )
38
- except Exception as e:
39
- self._handle_error(e, f"S3 bucket {bucket['Name']}")
40
+ s3_collector = S3Collector(self.session, self.region, self.account_id, self.tags)
41
+ result = s3_collector.collect()
42
+ return result.get("Buckets", [])
40
43
  except Exception as e:
41
44
  self._handle_error(e, "S3 buckets")
42
- return buckets
45
+ return []
43
46
 
44
47
  def get_ebs_volumes(self) -> List[Dict[str, Any]]:
45
48
  """
46
- Get information about EBS volumes.
49
+ Get information about EBS volumes with tag filtering.
47
50
 
48
51
  :return: List of EBS volume information
49
52
  :rtype: List[Dict[str, Any]]
@@ -55,6 +58,17 @@ class StorageCollector(BaseCollector):
55
58
 
56
59
  for page in paginator.paginate():
57
60
  for volume in page.get("Volumes", []):
61
+ # Apply tag filtering
62
+ if self.tags and not self._matches_tags(volume.get("Tags", [])):
63
+ continue
64
+
65
+ # Apply account filtering if ARN available
66
+ volume_arn = (
67
+ f"arn:aws:ec2:{self.region}:{volume.get('OwnerId', 'unknown')}:volume/{volume.get('VolumeId')}"
68
+ )
69
+ if not self._matches_account(volume_arn):
70
+ continue
71
+
58
72
  attachments = volume.get("Attachments", [])
59
73
  volumes.append(
60
74
  {
@@ -81,11 +95,256 @@ class StorageCollector(BaseCollector):
81
95
  self._handle_error(e, "EBS volumes")
82
96
  return volumes
83
97
 
98
+ def get_efs_file_systems(self) -> List[Dict[str, Any]]:
99
+ """
100
+ Get information about EFS file systems.
101
+
102
+ :return: List of EFS file system information
103
+ :rtype: List[Dict[str, Any]]
104
+ """
105
+ file_systems = []
106
+ try:
107
+ efs_client = self._get_client("efs")
108
+ paginator = efs_client.get_paginator("describe_file_systems")
109
+
110
+ for page in paginator.paginate():
111
+ for fs in page.get("FileSystems", []):
112
+ fs_arn = fs.get("FileSystemArn", "")
113
+
114
+ if not self._matches_account(fs_arn):
115
+ continue
116
+
117
+ if not self._matches_tags(fs.get("Tags", [])):
118
+ continue
119
+
120
+ file_systems.append(
121
+ {
122
+ "Region": self.region,
123
+ "FileSystemId": fs.get("FileSystemId"),
124
+ "FileSystemArn": fs_arn,
125
+ "Name": fs.get("Name"),
126
+ "CreationTime": fs.get("CreationTime"),
127
+ "LifeCycleState": fs.get("LifeCycleState"),
128
+ "SizeInBytes": fs.get("SizeInBytes"),
129
+ "PerformanceMode": fs.get("PerformanceMode"),
130
+ "ThroughputMode": fs.get("ThroughputMode"),
131
+ "Encrypted": fs.get("Encrypted"),
132
+ "KmsKeyId": fs.get("KmsKeyId"),
133
+ "Tags": fs.get("Tags", []),
134
+ }
135
+ )
136
+ except Exception as e:
137
+ self._handle_error(e, "EFS file systems")
138
+ return file_systems
139
+
140
+ def get_fsx_file_systems(self) -> List[Dict[str, Any]]:
141
+ """
142
+ Get information about FSx file systems (Windows, Lustre, NetApp ONTAP, OpenZFS).
143
+
144
+ :return: List of FSx file system information
145
+ :rtype: List[Dict[str, Any]]
146
+ """
147
+ file_systems = []
148
+ try:
149
+ fsx_client = self._get_client("fsx")
150
+ paginator = fsx_client.get_paginator("describe_file_systems")
151
+
152
+ for page in paginator.paginate():
153
+ for fs in page.get("FileSystems", []):
154
+ fs_arn = fs.get("ResourceARN", "")
155
+
156
+ if not self._matches_account(fs_arn):
157
+ continue
158
+
159
+ if not self._matches_tags(fs.get("Tags", [])):
160
+ continue
161
+
162
+ file_systems.append(
163
+ {
164
+ "Region": self.region,
165
+ "FileSystemId": fs.get("FileSystemId"),
166
+ "FileSystemArn": fs_arn,
167
+ "FileSystemType": fs.get("FileSystemType"),
168
+ "Lifecycle": fs.get("Lifecycle"),
169
+ "StorageCapacity": fs.get("StorageCapacity"),
170
+ "StorageType": fs.get("StorageType"),
171
+ "VpcId": fs.get("VpcId"),
172
+ "SubnetIds": fs.get("SubnetIds", []),
173
+ "CreationTime": fs.get("CreationTime"),
174
+ "Tags": fs.get("Tags", []),
175
+ }
176
+ )
177
+ except Exception as e:
178
+ self._handle_error(e, "FSx file systems")
179
+ return file_systems
180
+
181
+ def get_storage_gateways(self) -> List[Dict[str, Any]]:
182
+ """
183
+ Get information about Storage Gateway gateways.
184
+
185
+ :return: List of Storage Gateway information
186
+ :rtype: List[Dict[str, Any]]
187
+ """
188
+ gateways = []
189
+ try:
190
+ sg_client = self._get_client("storagegateway")
191
+ paginator = sg_client.get_paginator("list_gateways")
192
+
193
+ for page in paginator.paginate():
194
+ for gateway in page.get("Gateways", []):
195
+ gateway_arn = gateway.get("GatewayARN", "")
196
+
197
+ if not self._matches_account(gateway_arn):
198
+ continue
199
+
200
+ try:
201
+ tags_response = sg_client.list_tags_for_resource(ResourceARN=gateway_arn)
202
+ gateway_tags = tags_response.get("Tags", [])
203
+
204
+ if not self._matches_tags(gateway_tags):
205
+ continue
206
+
207
+ gateways.append(
208
+ {
209
+ "Region": self.region,
210
+ "GatewayId": gateway.get("GatewayId"),
211
+ "GatewayARN": gateway_arn,
212
+ "GatewayName": gateway.get("GatewayName"),
213
+ "GatewayType": gateway.get("GatewayType"),
214
+ "GatewayOperationalState": gateway.get("GatewayOperationalState"),
215
+ "Tags": gateway_tags,
216
+ }
217
+ )
218
+ except Exception as tag_error:
219
+ self._handle_error(tag_error, f"Storage Gateway tags for {gateway_arn}")
220
+ continue
221
+
222
+ except Exception as e:
223
+ self._handle_error(e, "Storage Gateways")
224
+ return gateways
225
+
226
+ def get_backup_vaults(self) -> List[Dict[str, Any]]:
227
+ """
228
+ Get information about AWS Backup vaults.
229
+
230
+ :return: List of Backup vault information
231
+ :rtype: List[Dict[str, Any]]
232
+ """
233
+ vaults = []
234
+ try:
235
+ backup_client = self._get_client("backup")
236
+ paginator = backup_client.get_paginator("list_backup_vaults")
237
+
238
+ for page in paginator.paginate():
239
+ for vault in page.get("BackupVaultList", []):
240
+ vault_arn = vault.get("BackupVaultArn", "")
241
+
242
+ if not self._matches_account(vault_arn):
243
+ continue
244
+
245
+ try:
246
+ tags_response = backup_client.list_tags(ResourceArn=vault_arn)
247
+ vault_tags = tags_response.get("Tags", {})
248
+
249
+ if not self._matches_tags(vault_tags):
250
+ continue
251
+
252
+ vaults.append(
253
+ {
254
+ "Region": self.region,
255
+ "BackupVaultName": vault.get("BackupVaultName"),
256
+ "BackupVaultArn": vault_arn,
257
+ "CreationDate": vault.get("CreationDate"),
258
+ "EncryptionKeyArn": vault.get("EncryptionKeyArn"),
259
+ "NumberOfRecoveryPoints": vault.get("NumberOfRecoveryPoints"),
260
+ "Tags": vault_tags,
261
+ }
262
+ )
263
+ except Exception as tag_error:
264
+ self._handle_error(tag_error, f"Backup vault tags for {vault_arn}")
265
+ continue
266
+
267
+ except Exception as e:
268
+ self._handle_error(e, "Backup vaults")
269
+ return vaults
270
+
271
+ def get_backup_plans(self) -> List[Dict[str, Any]]:
272
+ """
273
+ Get information about AWS Backup plans.
274
+
275
+ :return: List of Backup plan information
276
+ :rtype: List[Dict[str, Any]]
277
+ """
278
+ plans = []
279
+ try:
280
+ backup_client = self._get_client("backup")
281
+ paginator = backup_client.get_paginator("list_backup_plans")
282
+
283
+ for page in paginator.paginate():
284
+ for plan in page.get("BackupPlansList", []):
285
+ plan_arn = plan.get("BackupPlanArn", "")
286
+
287
+ if not self._matches_account(plan_arn):
288
+ continue
289
+
290
+ try:
291
+ tags_response = backup_client.list_tags(ResourceArn=plan_arn)
292
+ plan_tags = tags_response.get("Tags", {})
293
+
294
+ if not self._matches_tags(plan_tags):
295
+ continue
296
+
297
+ plans.append(
298
+ {
299
+ "Region": self.region,
300
+ "BackupPlanId": plan.get("BackupPlanId"),
301
+ "BackupPlanArn": plan_arn,
302
+ "BackupPlanName": plan.get("BackupPlanName"),
303
+ "CreationDate": plan.get("CreationDate"),
304
+ "VersionId": plan.get("VersionId"),
305
+ "Tags": plan_tags,
306
+ }
307
+ )
308
+ except Exception as tag_error:
309
+ self._handle_error(tag_error, f"Backup plan tags for {plan_arn}")
310
+ continue
311
+
312
+ except Exception as e:
313
+ self._handle_error(e, "Backup plans")
314
+ return plans
315
+
84
316
  def collect(self) -> Dict[str, Any]:
85
317
  """
86
- Collect all storage resources.
318
+ Collect storage resources based on enabled_services configuration.
87
319
 
88
- :return: Dictionary containing all storage resource information
320
+ :return: Dictionary containing enabled storage resource information
89
321
  :rtype: Dict[str, Any]
90
322
  """
91
- return {"S3Buckets": self.get_s3_buckets(), "EBSVolumes": self.get_ebs_volumes()}
323
+ result = {}
324
+
325
+ # S3 Buckets
326
+ if self.enabled_services.get("s3", True):
327
+ result["S3Buckets"] = self.get_s3_buckets()
328
+
329
+ # EBS Volumes
330
+ if self.enabled_services.get("ebs", True):
331
+ result["EBSVolumes"] = self.get_ebs_volumes()
332
+
333
+ # EFS File Systems
334
+ if self.enabled_services.get("efs", True):
335
+ result["EFSFileSystems"] = self.get_efs_file_systems()
336
+
337
+ # FSx File Systems
338
+ if self.enabled_services.get("fsx", True):
339
+ result["FSxFileSystems"] = self.get_fsx_file_systems()
340
+
341
+ # Storage Gateway
342
+ if self.enabled_services.get("storage_gateway", True):
343
+ result["StorageGateways"] = self.get_storage_gateways()
344
+
345
+ # AWS Backup
346
+ if self.enabled_services.get("backup", True):
347
+ result["BackupVaults"] = self.get_backup_vaults()
348
+ result["BackupPlans"] = self.get_backup_plans()
349
+
350
+ return result