regscale-cli 6.16.0.0__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.

Potentially problematic release.


This version of regscale-cli might be problematic. Click here for more details.

Files changed (481) hide show
  1. regscale/__init__.py +1 -0
  2. regscale/airflow/__init__.py +9 -0
  3. regscale/airflow/azure/__init__.py +9 -0
  4. regscale/airflow/azure/cli.py +89 -0
  5. regscale/airflow/azure/upload_dags.py +116 -0
  6. regscale/airflow/click_dags.py +127 -0
  7. regscale/airflow/click_mixins.py +82 -0
  8. regscale/airflow/config.py +25 -0
  9. regscale/airflow/factories/__init__.py +0 -0
  10. regscale/airflow/factories/connections.py +58 -0
  11. regscale/airflow/factories/workflows.py +78 -0
  12. regscale/airflow/hierarchy.py +88 -0
  13. regscale/airflow/operators/__init__.py +0 -0
  14. regscale/airflow/operators/click.py +36 -0
  15. regscale/airflow/sensors/__init__.py +0 -0
  16. regscale/airflow/sensors/sql.py +107 -0
  17. regscale/airflow/sessions/__init__.py +0 -0
  18. regscale/airflow/sessions/sql/__init__.py +3 -0
  19. regscale/airflow/sessions/sql/queries.py +64 -0
  20. regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
  21. regscale/airflow/tasks/__init__.py +0 -0
  22. regscale/airflow/tasks/branches.py +22 -0
  23. regscale/airflow/tasks/cli.py +116 -0
  24. regscale/airflow/tasks/click.py +73 -0
  25. regscale/airflow/tasks/debugging.py +9 -0
  26. regscale/airflow/tasks/groups.py +116 -0
  27. regscale/airflow/tasks/init.py +60 -0
  28. regscale/airflow/tasks/states.py +47 -0
  29. regscale/airflow/tasks/workflows.py +36 -0
  30. regscale/ansible/__init__.py +9 -0
  31. regscale/core/__init__.py +0 -0
  32. regscale/core/app/__init__.py +3 -0
  33. regscale/core/app/api.py +571 -0
  34. regscale/core/app/application.py +665 -0
  35. regscale/core/app/internal/__init__.py +136 -0
  36. regscale/core/app/internal/admin_actions.py +230 -0
  37. regscale/core/app/internal/assessments_editor.py +873 -0
  38. regscale/core/app/internal/catalog.py +316 -0
  39. regscale/core/app/internal/comparison.py +459 -0
  40. regscale/core/app/internal/control_editor.py +571 -0
  41. regscale/core/app/internal/encrypt.py +79 -0
  42. regscale/core/app/internal/evidence.py +1240 -0
  43. regscale/core/app/internal/file_uploads.py +151 -0
  44. regscale/core/app/internal/healthcheck.py +66 -0
  45. regscale/core/app/internal/login.py +305 -0
  46. regscale/core/app/internal/migrations.py +240 -0
  47. regscale/core/app/internal/model_editor.py +1701 -0
  48. regscale/core/app/internal/poam_editor.py +632 -0
  49. regscale/core/app/internal/workflow.py +105 -0
  50. regscale/core/app/logz.py +74 -0
  51. regscale/core/app/utils/XMLIR.py +258 -0
  52. regscale/core/app/utils/__init__.py +0 -0
  53. regscale/core/app/utils/api_handler.py +358 -0
  54. regscale/core/app/utils/app_utils.py +1110 -0
  55. regscale/core/app/utils/catalog_utils/__init__.py +0 -0
  56. regscale/core/app/utils/catalog_utils/common.py +91 -0
  57. regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
  58. regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
  59. regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
  60. regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
  61. regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
  62. regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
  63. regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
  64. regscale/core/app/utils/file_utils.py +238 -0
  65. regscale/core/app/utils/parser_utils.py +81 -0
  66. regscale/core/app/utils/pickle_file_handler.py +57 -0
  67. regscale/core/app/utils/regscale_utils.py +319 -0
  68. regscale/core/app/utils/report_utils.py +119 -0
  69. regscale/core/app/utils/variables.py +226 -0
  70. regscale/core/decorators.py +31 -0
  71. regscale/core/lazy_group.py +65 -0
  72. regscale/core/login.py +63 -0
  73. regscale/core/server/__init__.py +0 -0
  74. regscale/core/server/flask_api.py +473 -0
  75. regscale/core/server/helpers.py +373 -0
  76. regscale/core/server/rest.py +64 -0
  77. regscale/core/server/static/css/bootstrap.css +6030 -0
  78. regscale/core/server/static/css/bootstrap.min.css +6 -0
  79. regscale/core/server/static/css/main.css +176 -0
  80. regscale/core/server/static/images/regscale-cli.svg +49 -0
  81. regscale/core/server/static/images/regscale.svg +38 -0
  82. regscale/core/server/templates/base.html +74 -0
  83. regscale/core/server/templates/index.html +43 -0
  84. regscale/core/server/templates/login.html +28 -0
  85. regscale/core/server/templates/make_base64.html +22 -0
  86. regscale/core/server/templates/upload_STIG.html +109 -0
  87. regscale/core/server/templates/upload_STIG_result.html +26 -0
  88. regscale/core/server/templates/upload_ssp.html +144 -0
  89. regscale/core/server/templates/upload_ssp_result.html +128 -0
  90. regscale/core/static/__init__.py +0 -0
  91. regscale/core/static/regex.py +14 -0
  92. regscale/core/utils/__init__.py +117 -0
  93. regscale/core/utils/click_utils.py +13 -0
  94. regscale/core/utils/date.py +238 -0
  95. regscale/core/utils/graphql.py +254 -0
  96. regscale/core/utils/urls.py +23 -0
  97. regscale/dev/__init__.py +6 -0
  98. regscale/dev/analysis.py +454 -0
  99. regscale/dev/cli.py +235 -0
  100. regscale/dev/code_gen.py +492 -0
  101. regscale/dev/dirs.py +69 -0
  102. regscale/dev/docs.py +384 -0
  103. regscale/dev/monitoring.py +26 -0
  104. regscale/dev/profiling.py +216 -0
  105. regscale/exceptions/__init__.py +4 -0
  106. regscale/exceptions/license_exception.py +7 -0
  107. regscale/exceptions/validation_exception.py +9 -0
  108. regscale/integrations/__init__.py +1 -0
  109. regscale/integrations/commercial/__init__.py +486 -0
  110. regscale/integrations/commercial/ad.py +433 -0
  111. regscale/integrations/commercial/amazon/__init__.py +0 -0
  112. regscale/integrations/commercial/amazon/common.py +106 -0
  113. regscale/integrations/commercial/aqua/__init__.py +0 -0
  114. regscale/integrations/commercial/aqua/aqua.py +91 -0
  115. regscale/integrations/commercial/aws/__init__.py +6 -0
  116. regscale/integrations/commercial/aws/cli.py +322 -0
  117. regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
  118. regscale/integrations/commercial/aws/inventory/base.py +64 -0
  119. regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
  120. regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
  121. regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
  122. regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
  123. regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
  124. regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
  125. regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
  126. regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
  127. regscale/integrations/commercial/aws/scanner.py +823 -0
  128. regscale/integrations/commercial/azure/__init__.py +0 -0
  129. regscale/integrations/commercial/azure/common.py +32 -0
  130. regscale/integrations/commercial/azure/intune.py +488 -0
  131. regscale/integrations/commercial/azure/scanner.py +49 -0
  132. regscale/integrations/commercial/burp.py +78 -0
  133. regscale/integrations/commercial/cpe.py +144 -0
  134. regscale/integrations/commercial/crowdstrike.py +1117 -0
  135. regscale/integrations/commercial/defender.py +1511 -0
  136. regscale/integrations/commercial/dependabot.py +210 -0
  137. regscale/integrations/commercial/durosuite/__init__.py +0 -0
  138. regscale/integrations/commercial/durosuite/api.py +1546 -0
  139. regscale/integrations/commercial/durosuite/process_devices.py +101 -0
  140. regscale/integrations/commercial/durosuite/scanner.py +637 -0
  141. regscale/integrations/commercial/durosuite/variables.py +21 -0
  142. regscale/integrations/commercial/ecr.py +90 -0
  143. regscale/integrations/commercial/gcp/__init__.py +237 -0
  144. regscale/integrations/commercial/gcp/auth.py +96 -0
  145. regscale/integrations/commercial/gcp/control_tests.py +238 -0
  146. regscale/integrations/commercial/gcp/variables.py +18 -0
  147. regscale/integrations/commercial/gitlab.py +332 -0
  148. regscale/integrations/commercial/grype.py +165 -0
  149. regscale/integrations/commercial/ibm.py +90 -0
  150. regscale/integrations/commercial/import_all/__init__.py +0 -0
  151. regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
  152. regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
  153. regscale/integrations/commercial/jira.py +1046 -0
  154. regscale/integrations/commercial/mappings/__init__.py +0 -0
  155. regscale/integrations/commercial/mappings/csf_controls.json +713 -0
  156. regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
  157. regscale/integrations/commercial/nessus/__init__.py +0 -0
  158. regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
  159. regscale/integrations/commercial/nessus/scanner.py +416 -0
  160. regscale/integrations/commercial/nexpose.py +90 -0
  161. regscale/integrations/commercial/okta.py +798 -0
  162. regscale/integrations/commercial/opentext/__init__.py +0 -0
  163. regscale/integrations/commercial/opentext/click.py +99 -0
  164. regscale/integrations/commercial/opentext/scanner.py +143 -0
  165. regscale/integrations/commercial/prisma.py +91 -0
  166. regscale/integrations/commercial/qualys.py +1462 -0
  167. regscale/integrations/commercial/salesforce.py +980 -0
  168. regscale/integrations/commercial/sap/__init__.py +0 -0
  169. regscale/integrations/commercial/sap/click.py +31 -0
  170. regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
  171. regscale/integrations/commercial/sap/sysdig/click.py +57 -0
  172. regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
  173. regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
  174. regscale/integrations/commercial/sap/tenable/click.py +49 -0
  175. regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
  176. regscale/integrations/commercial/servicenow.py +1756 -0
  177. regscale/integrations/commercial/sicura/__init__.py +0 -0
  178. regscale/integrations/commercial/sicura/api.py +855 -0
  179. regscale/integrations/commercial/sicura/commands.py +73 -0
  180. regscale/integrations/commercial/sicura/scanner.py +481 -0
  181. regscale/integrations/commercial/sicura/variables.py +16 -0
  182. regscale/integrations/commercial/snyk.py +90 -0
  183. regscale/integrations/commercial/sonarcloud.py +260 -0
  184. regscale/integrations/commercial/sqlserver.py +369 -0
  185. regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
  186. regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
  187. regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
  188. regscale/integrations/commercial/stigv2/__init__.py +0 -0
  189. regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
  190. regscale/integrations/commercial/stigv2/click_commands.py +95 -0
  191. regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
  192. regscale/integrations/commercial/synqly/__init__.py +0 -0
  193. regscale/integrations/commercial/synqly/assets.py +46 -0
  194. regscale/integrations/commercial/synqly/ticketing.py +132 -0
  195. regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
  196. regscale/integrations/commercial/synqly_jira.py +840 -0
  197. regscale/integrations/commercial/tenablev2/__init__.py +0 -0
  198. regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
  199. regscale/integrations/commercial/tenablev2/click.py +1584 -0
  200. regscale/integrations/commercial/tenablev2/scanner.py +504 -0
  201. regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
  202. regscale/integrations/commercial/tenablev2/utils.py +78 -0
  203. regscale/integrations/commercial/tenablev2/variables.py +17 -0
  204. regscale/integrations/commercial/trivy.py +162 -0
  205. regscale/integrations/commercial/veracode.py +96 -0
  206. regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
  207. regscale/integrations/commercial/wizv2/__init__.py +0 -0
  208. regscale/integrations/commercial/wizv2/click.py +429 -0
  209. regscale/integrations/commercial/wizv2/constants.py +1001 -0
  210. regscale/integrations/commercial/wizv2/issue.py +361 -0
  211. regscale/integrations/commercial/wizv2/models.py +112 -0
  212. regscale/integrations/commercial/wizv2/parsers.py +339 -0
  213. regscale/integrations/commercial/wizv2/sbom.py +115 -0
  214. regscale/integrations/commercial/wizv2/scanner.py +416 -0
  215. regscale/integrations/commercial/wizv2/utils.py +796 -0
  216. regscale/integrations/commercial/wizv2/variables.py +39 -0
  217. regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
  218. regscale/integrations/commercial/xray.py +91 -0
  219. regscale/integrations/integration/__init__.py +2 -0
  220. regscale/integrations/integration/integration.py +26 -0
  221. regscale/integrations/integration/inventory.py +17 -0
  222. regscale/integrations/integration/issue.py +100 -0
  223. regscale/integrations/integration_override.py +149 -0
  224. regscale/integrations/public/__init__.py +103 -0
  225. regscale/integrations/public/cisa.py +641 -0
  226. regscale/integrations/public/criticality_updater.py +70 -0
  227. regscale/integrations/public/emass.py +411 -0
  228. regscale/integrations/public/emass_slcm_import.py +697 -0
  229. regscale/integrations/public/fedramp/__init__.py +0 -0
  230. regscale/integrations/public/fedramp/appendix_parser.py +548 -0
  231. regscale/integrations/public/fedramp/click.py +479 -0
  232. regscale/integrations/public/fedramp/components.py +714 -0
  233. regscale/integrations/public/fedramp/docx_parser.py +259 -0
  234. regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
  235. regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
  236. regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
  237. regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
  238. regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
  239. regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
  240. regscale/integrations/public/fedramp/import_workbook.py +495 -0
  241. regscale/integrations/public/fedramp/inventory_items.py +244 -0
  242. regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
  243. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
  244. regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
  245. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
  246. regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
  247. regscale/integrations/public/fedramp/mappings/user.py +175 -0
  248. regscale/integrations/public/fedramp/mappings/values.py +141 -0
  249. regscale/integrations/public/fedramp/markdown_parser.py +150 -0
  250. regscale/integrations/public/fedramp/metadata.py +689 -0
  251. regscale/integrations/public/fedramp/models/__init__.py +59 -0
  252. regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
  253. regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
  254. regscale/integrations/public/fedramp/parts_mapper.py +107 -0
  255. regscale/integrations/public/fedramp/poam/__init__.py +0 -0
  256. regscale/integrations/public/fedramp/poam/scanner.py +851 -0
  257. regscale/integrations/public/fedramp/properties.py +201 -0
  258. regscale/integrations/public/fedramp/reporting.py +84 -0
  259. regscale/integrations/public/fedramp/resources.py +496 -0
  260. regscale/integrations/public/fedramp/rosetta.py +110 -0
  261. regscale/integrations/public/fedramp/ssp_logger.py +87 -0
  262. regscale/integrations/public/fedramp/system_characteristics.py +922 -0
  263. regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
  264. regscale/integrations/public/fedramp/system_implementation.py +190 -0
  265. regscale/integrations/public/fedramp/xml_utils.py +87 -0
  266. regscale/integrations/public/nist_catalog.py +275 -0
  267. regscale/integrations/public/oscal.py +1946 -0
  268. regscale/integrations/public/otx.py +169 -0
  269. regscale/integrations/scanner_integration.py +2692 -0
  270. regscale/integrations/variables.py +25 -0
  271. regscale/models/__init__.py +7 -0
  272. regscale/models/app_models/__init__.py +5 -0
  273. regscale/models/app_models/catalog_compare.py +213 -0
  274. regscale/models/app_models/click.py +252 -0
  275. regscale/models/app_models/datetime_encoder.py +21 -0
  276. regscale/models/app_models/import_validater.py +321 -0
  277. regscale/models/app_models/mapping.py +260 -0
  278. regscale/models/app_models/pipeline.py +37 -0
  279. regscale/models/click_models.py +413 -0
  280. regscale/models/config.py +154 -0
  281. regscale/models/email_style.css +67 -0
  282. regscale/models/hierarchy.py +8 -0
  283. regscale/models/inspect_models.py +79 -0
  284. regscale/models/integration_models/__init__.py +0 -0
  285. regscale/models/integration_models/amazon_models/__init__.py +0 -0
  286. regscale/models/integration_models/amazon_models/inspector.py +262 -0
  287. regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
  288. regscale/models/integration_models/aqua.py +247 -0
  289. regscale/models/integration_models/azure_alerts.py +255 -0
  290. regscale/models/integration_models/base64.py +23 -0
  291. regscale/models/integration_models/burp.py +433 -0
  292. regscale/models/integration_models/burp_models.py +128 -0
  293. regscale/models/integration_models/cisa_kev_data.json +19333 -0
  294. regscale/models/integration_models/defender_data.py +93 -0
  295. regscale/models/integration_models/defenderimport.py +143 -0
  296. regscale/models/integration_models/drf.py +443 -0
  297. regscale/models/integration_models/ecr_models/__init__.py +0 -0
  298. regscale/models/integration_models/ecr_models/data.py +69 -0
  299. regscale/models/integration_models/ecr_models/ecr.py +239 -0
  300. regscale/models/integration_models/flat_file_importer.py +1079 -0
  301. regscale/models/integration_models/grype_import.py +247 -0
  302. regscale/models/integration_models/ibm.py +126 -0
  303. regscale/models/integration_models/implementation_results.py +85 -0
  304. regscale/models/integration_models/nexpose.py +140 -0
  305. regscale/models/integration_models/prisma.py +202 -0
  306. regscale/models/integration_models/qualys.py +720 -0
  307. regscale/models/integration_models/qualys_scanner.py +160 -0
  308. regscale/models/integration_models/sbom/__init__.py +0 -0
  309. regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
  310. regscale/models/integration_models/send_reminders.py +620 -0
  311. regscale/models/integration_models/snyk.py +155 -0
  312. regscale/models/integration_models/synqly_models/__init__.py +0 -0
  313. regscale/models/integration_models/synqly_models/capabilities.json +1 -0
  314. regscale/models/integration_models/synqly_models/connector_types.py +22 -0
  315. regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
  316. regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
  317. regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
  318. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
  319. regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
  320. regscale/models/integration_models/synqly_models/param.py +72 -0
  321. regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
  322. regscale/models/integration_models/synqly_models/tenants.py +39 -0
  323. regscale/models/integration_models/tenable_models/__init__.py +0 -0
  324. regscale/models/integration_models/tenable_models/integration.py +187 -0
  325. regscale/models/integration_models/tenable_models/models.py +513 -0
  326. regscale/models/integration_models/trivy_import.py +231 -0
  327. regscale/models/integration_models/veracode.py +217 -0
  328. regscale/models/integration_models/xray.py +135 -0
  329. regscale/models/locking.py +100 -0
  330. regscale/models/platform.py +110 -0
  331. regscale/models/regscale_models/__init__.py +67 -0
  332. regscale/models/regscale_models/assessment.py +570 -0
  333. regscale/models/regscale_models/assessment_plan.py +52 -0
  334. regscale/models/regscale_models/asset.py +567 -0
  335. regscale/models/regscale_models/asset_mapping.py +190 -0
  336. regscale/models/regscale_models/case.py +42 -0
  337. regscale/models/regscale_models/catalog.py +261 -0
  338. regscale/models/regscale_models/cci.py +46 -0
  339. regscale/models/regscale_models/change.py +167 -0
  340. regscale/models/regscale_models/checklist.py +372 -0
  341. regscale/models/regscale_models/comment.py +49 -0
  342. regscale/models/regscale_models/compliance_settings.py +112 -0
  343. regscale/models/regscale_models/component.py +412 -0
  344. regscale/models/regscale_models/component_mapping.py +65 -0
  345. regscale/models/regscale_models/control.py +38 -0
  346. regscale/models/regscale_models/control_implementation.py +1128 -0
  347. regscale/models/regscale_models/control_objective.py +261 -0
  348. regscale/models/regscale_models/control_parameter.py +100 -0
  349. regscale/models/regscale_models/control_test.py +34 -0
  350. regscale/models/regscale_models/control_test_plan.py +75 -0
  351. regscale/models/regscale_models/control_test_result.py +52 -0
  352. regscale/models/regscale_models/custom_field.py +245 -0
  353. regscale/models/regscale_models/data.py +109 -0
  354. regscale/models/regscale_models/data_center.py +40 -0
  355. regscale/models/regscale_models/deviation.py +203 -0
  356. regscale/models/regscale_models/email.py +97 -0
  357. regscale/models/regscale_models/evidence.py +47 -0
  358. regscale/models/regscale_models/evidence_mapping.py +40 -0
  359. regscale/models/regscale_models/facility.py +59 -0
  360. regscale/models/regscale_models/file.py +382 -0
  361. regscale/models/regscale_models/filetag.py +37 -0
  362. regscale/models/regscale_models/form_field_value.py +94 -0
  363. regscale/models/regscale_models/group.py +169 -0
  364. regscale/models/regscale_models/implementation_objective.py +335 -0
  365. regscale/models/regscale_models/implementation_option.py +275 -0
  366. regscale/models/regscale_models/implementation_role.py +33 -0
  367. regscale/models/regscale_models/incident.py +177 -0
  368. regscale/models/regscale_models/interconnection.py +43 -0
  369. regscale/models/regscale_models/issue.py +1176 -0
  370. regscale/models/regscale_models/leveraged_authorization.py +125 -0
  371. regscale/models/regscale_models/line_of_inquiry.py +52 -0
  372. regscale/models/regscale_models/link.py +205 -0
  373. regscale/models/regscale_models/meta_data.py +64 -0
  374. regscale/models/regscale_models/mixins/__init__.py +0 -0
  375. regscale/models/regscale_models/mixins/parent_cache.py +124 -0
  376. regscale/models/regscale_models/module.py +224 -0
  377. regscale/models/regscale_models/modules.py +191 -0
  378. regscale/models/regscale_models/objective.py +14 -0
  379. regscale/models/regscale_models/parameter.py +87 -0
  380. regscale/models/regscale_models/ports_protocol.py +81 -0
  381. regscale/models/regscale_models/privacy.py +89 -0
  382. regscale/models/regscale_models/profile.py +50 -0
  383. regscale/models/regscale_models/profile_link.py +68 -0
  384. regscale/models/regscale_models/profile_mapping.py +124 -0
  385. regscale/models/regscale_models/project.py +63 -0
  386. regscale/models/regscale_models/property.py +278 -0
  387. regscale/models/regscale_models/question.py +85 -0
  388. regscale/models/regscale_models/questionnaire.py +87 -0
  389. regscale/models/regscale_models/questionnaire_instance.py +177 -0
  390. regscale/models/regscale_models/rbac.py +132 -0
  391. regscale/models/regscale_models/reference.py +86 -0
  392. regscale/models/regscale_models/regscale_model.py +1643 -0
  393. regscale/models/regscale_models/requirement.py +29 -0
  394. regscale/models/regscale_models/risk.py +274 -0
  395. regscale/models/regscale_models/sbom.py +54 -0
  396. regscale/models/regscale_models/scan_history.py +436 -0
  397. regscale/models/regscale_models/search.py +53 -0
  398. regscale/models/regscale_models/security_control.py +132 -0
  399. regscale/models/regscale_models/security_plan.py +204 -0
  400. regscale/models/regscale_models/software_inventory.py +159 -0
  401. regscale/models/regscale_models/stake_holder.py +64 -0
  402. regscale/models/regscale_models/stig.py +647 -0
  403. regscale/models/regscale_models/supply_chain.py +152 -0
  404. regscale/models/regscale_models/system_role.py +188 -0
  405. regscale/models/regscale_models/system_role_external_assignment.py +40 -0
  406. regscale/models/regscale_models/tag.py +37 -0
  407. regscale/models/regscale_models/tag_mapping.py +19 -0
  408. regscale/models/regscale_models/task.py +133 -0
  409. regscale/models/regscale_models/threat.py +196 -0
  410. regscale/models/regscale_models/user.py +175 -0
  411. regscale/models/regscale_models/user_group.py +55 -0
  412. regscale/models/regscale_models/vulnerability.py +242 -0
  413. regscale/models/regscale_models/vulnerability_mapping.py +162 -0
  414. regscale/models/regscale_models/workflow.py +55 -0
  415. regscale/models/regscale_models/workflow_action.py +34 -0
  416. regscale/models/regscale_models/workflow_instance.py +269 -0
  417. regscale/models/regscale_models/workflow_instance_step.py +114 -0
  418. regscale/models/regscale_models/workflow_template.py +58 -0
  419. regscale/models/regscale_models/workflow_template_step.py +45 -0
  420. regscale/regscale.py +815 -0
  421. regscale/utils/__init__.py +7 -0
  422. regscale/utils/b64conversion.py +14 -0
  423. regscale/utils/click_utils.py +118 -0
  424. regscale/utils/decorators.py +48 -0
  425. regscale/utils/dict_utils.py +59 -0
  426. regscale/utils/files.py +79 -0
  427. regscale/utils/fxns.py +30 -0
  428. regscale/utils/graphql_client.py +113 -0
  429. regscale/utils/lists.py +16 -0
  430. regscale/utils/numbers.py +12 -0
  431. regscale/utils/shell.py +148 -0
  432. regscale/utils/string.py +121 -0
  433. regscale/utils/synqly_utils.py +165 -0
  434. regscale/utils/threading/__init__.py +8 -0
  435. regscale/utils/threading/threadhandler.py +131 -0
  436. regscale/utils/threading/threadsafe_counter.py +47 -0
  437. regscale/utils/threading/threadsafe_dict.py +242 -0
  438. regscale/utils/threading/threadsafe_list.py +83 -0
  439. regscale/utils/version.py +104 -0
  440. regscale/validation/__init__.py +0 -0
  441. regscale/validation/address.py +37 -0
  442. regscale/validation/record.py +48 -0
  443. regscale/visualization/__init__.py +5 -0
  444. regscale/visualization/click.py +34 -0
  445. regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
  446. regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
  447. regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
  448. regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
  449. regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
  450. regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
  451. tests/fixtures/__init__.py +2 -0
  452. tests/fixtures/api.py +87 -0
  453. tests/fixtures/models.py +91 -0
  454. tests/fixtures/test_fixture.py +144 -0
  455. tests/mocks/__init__.py +0 -0
  456. tests/mocks/objects.py +3 -0
  457. tests/mocks/response.py +32 -0
  458. tests/mocks/xml.py +13 -0
  459. tests/regscale/__init__.py +0 -0
  460. tests/regscale/core/__init__.py +0 -0
  461. tests/regscale/core/test_api.py +232 -0
  462. tests/regscale/core/test_app.py +406 -0
  463. tests/regscale/core/test_login.py +37 -0
  464. tests/regscale/core/test_logz.py +66 -0
  465. tests/regscale/core/test_sbom_generator.py +87 -0
  466. tests/regscale/core/test_validation_utils.py +163 -0
  467. tests/regscale/core/test_version.py +78 -0
  468. tests/regscale/models/__init__.py +0 -0
  469. tests/regscale/models/test_asset.py +71 -0
  470. tests/regscale/models/test_config.py +26 -0
  471. tests/regscale/models/test_control_implementation.py +27 -0
  472. tests/regscale/models/test_import.py +97 -0
  473. tests/regscale/models/test_issue.py +36 -0
  474. tests/regscale/models/test_mapping.py +52 -0
  475. tests/regscale/models/test_platform.py +31 -0
  476. tests/regscale/models/test_regscale_model.py +346 -0
  477. tests/regscale/models/test_report.py +32 -0
  478. tests/regscale/models/test_tenable_integrations.py +118 -0
  479. tests/regscale/models/test_user_model.py +121 -0
  480. tests/regscale/test_about.py +19 -0
  481. tests/regscale/test_authorization.py +65 -0
@@ -0,0 +1,322 @@
1
+ """AWS CLI integration module."""
2
+
3
+ import json
4
+ import logging
5
+ import os
6
+ from datetime import datetime
7
+ from typing import Optional
8
+
9
+ import click
10
+
11
+ from regscale.models.integration_models.flat_file_importer import FlatFileImporter
12
+
13
+ logger = logging.getLogger("regscale")
14
+
15
+
16
+ @click.group(name="aws")
17
+ def awsv2():
18
+ """AWS Integrations."""
19
+ pass
20
+
21
+
22
+ @awsv2.command(name="sync_assets")
23
+ @click.option(
24
+ "--region",
25
+ type=str,
26
+ default=os.environ.get("AWS_REGION", "us-east-1"),
27
+ help="AWS region to collect inventory from",
28
+ )
29
+ @click.option(
30
+ "--regscale_id",
31
+ "--id",
32
+ type=click.INT,
33
+ help="RegScale will create and update assets as children of this record.",
34
+ required=True,
35
+ )
36
+ @click.option(
37
+ "--aws_access_key_id",
38
+ type=str,
39
+ required=False,
40
+ help="AWS access key ID",
41
+ envvar="AWS_ACCESS_KEY_ID",
42
+ )
43
+ @click.option(
44
+ "--aws_secret_access_key",
45
+ type=str,
46
+ required=False,
47
+ help="AWS secret access key",
48
+ default=os.getenv("AWS_SECRET_ACCESS_KEY"),
49
+ )
50
+ @click.option(
51
+ "--aws_session_token",
52
+ type=click.STRING,
53
+ required=False,
54
+ help="AWS Session ID",
55
+ default=os.environ.get("AWS_SESSION_TOKEN"),
56
+ )
57
+ def sync_assets(
58
+ region: str,
59
+ regscale_id: int,
60
+ aws_access_key_id: Optional[str] = None,
61
+ aws_secret_access_key: Optional[str] = None,
62
+ aws_session_token: Optional[str] = None,
63
+ ) -> None:
64
+ """
65
+ Sync AWS resources to RegScale assets.
66
+
67
+ This command collects AWS resources and creates/updates corresponding assets in RegScale:
68
+ - EC2 instances
69
+ - S3 buckets
70
+ - RDS instances
71
+ - Lambda functions
72
+ - DynamoDB tables
73
+ - VPCs and networking resources
74
+ - Container resources
75
+ - And more...
76
+ """
77
+ try:
78
+ logger.info("Starting AWS asset sync to RegScale...")
79
+ from .scanner import AWSInventoryIntegration
80
+
81
+ scanner = AWSInventoryIntegration(plan_id=regscale_id)
82
+ scanner.sync_assets(
83
+ plan_id=regscale_id,
84
+ region=region,
85
+ aws_access_key_id=aws_access_key_id,
86
+ aws_secret_access_key=aws_secret_access_key,
87
+ aws_session_token=aws_session_token,
88
+ )
89
+ logger.info("AWS asset sync completed successfully.")
90
+ except Exception as e:
91
+ logger.error(f"Error syncing AWS assets: {e}", exc_info=True)
92
+ raise click.ClickException(str(e))
93
+
94
+
95
+ @awsv2.group()
96
+ def inventory():
97
+ """AWS resource inventory commands."""
98
+ pass
99
+
100
+
101
+ @inventory.command(name="collect")
102
+ @click.option(
103
+ "--region",
104
+ type=str,
105
+ default=os.getenv("AWS_REGION", "us-east-1"),
106
+ help="AWS region to collect inventory from. Default is us-east-1.",
107
+ )
108
+ @click.option(
109
+ "--aws_access_key_id",
110
+ type=str,
111
+ required=False,
112
+ help="AWS access key ID",
113
+ envvar="AWS_ACCESS_KEY_ID",
114
+ )
115
+ @click.option(
116
+ "--aws_secret_access_key",
117
+ type=str,
118
+ required=False,
119
+ help="AWS secret access key",
120
+ envvar="AWS_SECRET_ACCESS_KEY",
121
+ )
122
+ @click.option(
123
+ "--aws_session_token",
124
+ type=click.STRING,
125
+ required=False,
126
+ help="AWS Session ID",
127
+ default=os.environ.get("AWS_SESSION_TOKEN"),
128
+ )
129
+ @click.option(
130
+ "--output",
131
+ type=click.Path(dir_okay=False, writable=True),
132
+ help="Output file path (JSON format)",
133
+ required=False,
134
+ )
135
+ def collect_inventory(
136
+ region: str,
137
+ aws_access_key_id: Optional[str],
138
+ aws_secret_access_key: Optional[str],
139
+ aws_session_token: Optional[str],
140
+ output: Optional[str],
141
+ ) -> None:
142
+ """
143
+ Collect AWS resource inventory.
144
+
145
+ This command collects information about various AWS resources including:
146
+ - EC2 instances
147
+ - S3 buckets
148
+ - RDS instances
149
+ - Lambda functions
150
+ - And more...
151
+
152
+ The inventory can be displayed to stdout or saved to a JSON file.
153
+ """
154
+ try:
155
+ from .inventory import collect_all_inventory
156
+ from regscale.models import DateTimeEncoder
157
+
158
+ logger.info("Collecting AWS inventory...")
159
+ aws_inventory = collect_all_inventory(
160
+ region=region,
161
+ aws_access_key_id=aws_access_key_id,
162
+ aws_secret_access_key=aws_secret_access_key,
163
+ aws_session_token=aws_session_token,
164
+ )
165
+ logger.info(
166
+ "AWS inventory collected successfully. Received %s resource(s).",
167
+ sum(len(resources) for resources in aws_inventory.values()),
168
+ )
169
+
170
+ if output:
171
+ with open(output, "w") as f:
172
+ json.dump(aws_inventory, f, indent=2, cls=DateTimeEncoder)
173
+ logger.info(f"Inventory saved to {output}")
174
+ else:
175
+ click.echo(json.dumps(aws_inventory, indent=2, cls=DateTimeEncoder))
176
+
177
+ except Exception as e:
178
+ logger.error(f"Error collecting AWS inventory: {e}")
179
+ raise click.ClickException(str(e))
180
+
181
+
182
+ @awsv2.group(help="Sync AWS Inspector Scans to RegScale.")
183
+ def inspector():
184
+ """Sync AWS Inspector scans."""
185
+
186
+
187
+ @inspector.command(name="import_scans")
188
+ @FlatFileImporter.common_scanner_options(
189
+ message="File path to the folder containing AWS Inspector files to process to RegScale.",
190
+ prompt="File path for AWS Inspector files (CSV or JSON)",
191
+ import_name="aws_inspector",
192
+ )
193
+ def import_scans(
194
+ folder_path: os.PathLike[str],
195
+ regscale_ssp_id: int,
196
+ scan_date: datetime,
197
+ mappings_path: click.Path,
198
+ disable_mapping: bool,
199
+ s3_bucket: str,
200
+ s3_prefix: str,
201
+ aws_profile: str,
202
+ upload_file: Optional[bool] = True,
203
+ ) -> None:
204
+ """
205
+ Import AWS Inspector scans to a System Security Plan in RegScale as assets and vulnerabilities.
206
+ """
207
+ import_aws_scans(
208
+ folder_path=folder_path,
209
+ regscale_ssp_id=regscale_ssp_id,
210
+ scan_date=scan_date,
211
+ mappings_path=mappings_path,
212
+ disable_mapping=disable_mapping,
213
+ s3_bucket=s3_bucket,
214
+ s3_prefix=s3_prefix,
215
+ aws_profile=aws_profile,
216
+ upload_file=upload_file,
217
+ )
218
+
219
+
220
+ def import_aws_scans(
221
+ folder_path: os.PathLike[str],
222
+ regscale_ssp_id: int,
223
+ mappings_path: click.Path,
224
+ scan_date: datetime,
225
+ s3_bucket: str,
226
+ s3_prefix: str,
227
+ aws_profile: str,
228
+ disable_mapping: Optional[bool] = False,
229
+ upload_file: Optional[bool] = True,
230
+ ) -> None:
231
+ """
232
+ Function to import AWS Inspector scans to RegScale as assets and vulnerabilities
233
+
234
+ :param os.PathLike[str] folder_path: Path to the folder containing AWS Inspector files
235
+ :param int regscale_ssp_id: RegScale System Security Plan ID
236
+ :param datetime.date scan_date: Date of the scan
237
+ :param click.Path mappings_path: Path to the header mapping file
238
+ :param str s3_bucket: The S3 bucket to download the files from
239
+ :param str s3_prefix: The S3 prefix to download the files from
240
+ :param str aws_profile: The AWS profile to use for S3 access
241
+ :param bool disable_mapping: Disable header mapping
242
+ :param bool upload_file: Upload the file to RegScale after processing, defaults to True
243
+ :rtype: None
244
+ """
245
+ from regscale.models.integration_models.amazon_models.inspector_scan import InspectorScan
246
+
247
+ FlatFileImporter.import_files(
248
+ import_type=InspectorScan,
249
+ import_name="AWS Inspector",
250
+ file_types=[".csv", ".json"],
251
+ folder_path=folder_path,
252
+ regscale_ssp_id=regscale_ssp_id,
253
+ scan_date=scan_date,
254
+ mappings_path=mappings_path,
255
+ disable_mapping=disable_mapping,
256
+ s3_bucket=s3_bucket,
257
+ s3_prefix=s3_prefix,
258
+ aws_profile=aws_profile,
259
+ upload_file=upload_file,
260
+ )
261
+
262
+
263
+ @awsv2.command(name="sync_findings")
264
+ @click.option(
265
+ "--region",
266
+ type=str,
267
+ default=os.environ.get("AWS_REGION", "us-east-1"),
268
+ help="AWS region to collect inventory from. Default is us-east-1.",
269
+ )
270
+ @click.option(
271
+ "--regscale_id",
272
+ "--id",
273
+ type=click.INT,
274
+ help="RegScale will create and update assets as children of this record.",
275
+ required=True,
276
+ )
277
+ @click.option(
278
+ "--aws_access_key_id",
279
+ type=str,
280
+ required=False,
281
+ help="AWS access key ID",
282
+ envvar="AWS_ACCESS_KEY_ID",
283
+ )
284
+ @click.option(
285
+ "--aws_secret_access_key",
286
+ type=str,
287
+ required=False,
288
+ help="AWS secret access key",
289
+ envvar="AWS_SECRET_ACCESS_KEY",
290
+ )
291
+ @click.option(
292
+ "--aws_session_token",
293
+ type=click.STRING,
294
+ required=False,
295
+ help="AWS Session ID",
296
+ default=os.environ.get("AWS_SESSION_TOKEN"),
297
+ )
298
+ def sync_findings(
299
+ region: str,
300
+ regscale_id: int,
301
+ aws_access_key_id: Optional[str] = None,
302
+ aws_secret_access_key: Optional[str] = None,
303
+ aws_session_token: Optional[str] = None,
304
+ ) -> None:
305
+ """Sync AWS Security Hub Findings."""
306
+ try:
307
+ logger.info("Starting AWS findings sync to RegScale...")
308
+ from .scanner import AWSInventoryIntegration
309
+
310
+ scanner = AWSInventoryIntegration(plan_id=regscale_id)
311
+ scanner.sync_findings(
312
+ plan_id=regscale_id,
313
+ region=region,
314
+ aws_access_key_id=aws_access_key_id,
315
+ aws_secret_access_key=aws_secret_access_key,
316
+ aws_session_token=aws_session_token,
317
+ )
318
+ if not scanner.errors:
319
+ logger.info("AWS finding sync completed successfully.")
320
+ except Exception as e:
321
+ logger.error(f"Error syncing AWS finding(s): {e}", exc_info=True)
322
+ raise click.ClickException(str(e))
@@ -0,0 +1,110 @@
1
+ """AWS resource inventory collection module."""
2
+
3
+ import os
4
+ from typing import Dict, Any, Optional
5
+
6
+ from regscale.integrations.commercial.aws.inventory.base import BaseCollector
7
+ from regscale.integrations.commercial.aws.inventory.resources.compute import ComputeCollector
8
+ from regscale.integrations.commercial.aws.inventory.resources.containers import ContainerCollector
9
+ from regscale.integrations.commercial.aws.inventory.resources.database import DatabaseCollector
10
+ from regscale.integrations.commercial.aws.inventory.resources.integration import IntegrationCollector
11
+ from regscale.integrations.commercial.aws.inventory.resources.networking import NetworkingCollector
12
+ from regscale.integrations.commercial.aws.inventory.resources.security import SecurityCollector
13
+ from regscale.integrations.commercial.aws.inventory.resources.storage import StorageCollector
14
+
15
+
16
+ class AWSInventoryCollector:
17
+ """Collects inventory of AWS resources."""
18
+
19
+ def __init__(
20
+ self,
21
+ region: str = os.getenv("AWS_REGION", "us-east-1"),
22
+ aws_access_key_id: Optional[str] = None,
23
+ aws_secret_access_key: Optional[str] = None,
24
+ aws_session_token: Optional[str] = None,
25
+ ):
26
+ """
27
+ Initialize the AWS inventory collector.
28
+
29
+ :param str region: AWS region to collect inventory from
30
+ :param str aws_access_key_id: Optional AWS access key ID
31
+ :param str aws_secret_access_key: Optional AWS secret access key
32
+ :param str aws_session_token: Optional AWS session ID
33
+ """
34
+ import boto3
35
+
36
+ self.region = region
37
+ self.session = boto3.Session(
38
+ aws_access_key_id=aws_access_key_id,
39
+ aws_secret_access_key=aws_secret_access_key,
40
+ region_name=region,
41
+ aws_session_token=aws_session_token,
42
+ )
43
+
44
+ # Initialize collectors
45
+ self.compute = ComputeCollector(self.session, self.region)
46
+ self.storage = StorageCollector(self.session, self.region)
47
+ self.database = DatabaseCollector(self.session, self.region)
48
+ self.networking = NetworkingCollector(self.session, self.region)
49
+ self.security = SecurityCollector(self.session, self.region)
50
+ self.integration = IntegrationCollector(self.session, self.region)
51
+ self.containers = ContainerCollector(self.session, self.region)
52
+
53
+ def collect_all(self) -> Dict[str, Any]:
54
+ """
55
+ Collect all AWS resources.
56
+
57
+ :return: Dictionary containing all AWS resource information
58
+ :rtype: Dict[str, Any]
59
+ """
60
+ inventory = {}
61
+ collectors = [
62
+ self.compute,
63
+ self.storage,
64
+ self.database,
65
+ self.networking,
66
+ self.security,
67
+ self.integration,
68
+ self.containers,
69
+ ]
70
+
71
+ for collector in collectors:
72
+ try:
73
+ resources = collector.collect()
74
+ inventory.update(resources)
75
+ except Exception as e:
76
+ from regscale.core.app.utils.app_utils import create_logger
77
+
78
+ # Handle or log the exception as needed
79
+ create_logger().error(f"Error collecting resource(s) from {collector.__class__.__name__}: {e}")
80
+
81
+ return inventory
82
+
83
+
84
+ def collect_all_inventory(
85
+ region: str = os.getenv("AWS_REGION", "us-east-1"),
86
+ aws_access_key_id: Optional[str] = None,
87
+ aws_secret_access_key: Optional[str] = None,
88
+ aws_session_token: Optional[str] = None,
89
+ ) -> Dict[str, Any]:
90
+ """
91
+ Collect inventory of all AWS resources.
92
+
93
+ :param str region: AWS region to collect inventory from
94
+ :param str aws_access_key_id: Optional AWS access key ID
95
+ :param str aws_secret_access_key: Optional AWS secret access key
96
+ :param str aws_session_token: Optional AWS session ID
97
+ :return: Dictionary containing all AWS resource information
98
+ :rtype: Dict[str, Any]
99
+ """
100
+ collector = AWSInventoryCollector(region, aws_access_key_id, aws_secret_access_key, aws_session_token)
101
+ return collector.collect_all()
102
+
103
+
104
+ if __name__ == "__main__":
105
+ collect_all_inventory(
106
+ region="us-east-1",
107
+ aws_access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),
108
+ aws_secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),
109
+ aws_session_token=os.getenv("AWS_SESSION_TOKEN"),
110
+ )
@@ -0,0 +1,64 @@
1
+ """Base classes for AWS resource collection."""
2
+
3
+ import datetime
4
+ import json
5
+ import logging
6
+ from typing import Any, Dict, TYPE_CHECKING
7
+
8
+ from botocore.exceptions import ClientError
9
+
10
+ if TYPE_CHECKING:
11
+ import boto3
12
+
13
+ logger = logging.getLogger("regscale")
14
+
15
+
16
+ class BaseCollector:
17
+ """Base class for AWS resource collectors."""
18
+
19
+ def __init__(self, session: "boto3.Session", region: str):
20
+ """
21
+ Initialize the base collector.
22
+
23
+ :param boto3.Session session: AWS session to use for API calls
24
+ :param str region: AWS region to collect from
25
+ """
26
+ self.session = session
27
+ self.region = region
28
+
29
+ def _get_client(self, service_name: str) -> Any:
30
+ """
31
+ Get a boto3 client for the specified service.
32
+
33
+ :param str service_name: Name of the AWS service
34
+ :return: Boto3 client for the service
35
+ :rtype: Any
36
+ """
37
+ return self.session.client(service_name)
38
+
39
+ def _handle_error(self, error: Exception, resource_type: str) -> None:
40
+ """
41
+ Handle and log AWS API errors.
42
+
43
+ :param Exception error: The error that occurred
44
+ :param str resource_type: Type of resource being collected
45
+ """
46
+ if isinstance(error, ClientError):
47
+ if error.response["Error"]["Code"] == "AccessDeniedException":
48
+ logger.warning(f"Access denied to {resource_type} in {self.region}")
49
+ else:
50
+ logger.error(f"Error collecting {resource_type} in {self.region}: {error}")
51
+ logger.debug(error, exc_info=True)
52
+ else:
53
+ logger.error(f"Unexpected error collecting {resource_type} in {self.region}: {error}")
54
+ logger.debug(error, exc_info=True)
55
+
56
+ def collect(self) -> Dict[str, Any]:
57
+ """
58
+ Collect resources. Must be implemented by subclasses.
59
+
60
+ :return: Dictionary containing resource information
61
+ :rtype: Dict[str, Any]
62
+ :raises NotImplementedError: If not implemented by subclass
63
+ """
64
+ raise NotImplementedError("Subclasses must implement collect()")
@@ -0,0 +1,19 @@
1
+ """AWS resource collectors package."""
2
+
3
+ from .compute import ComputeCollector
4
+ from .storage import StorageCollector
5
+ from .database import DatabaseCollector
6
+ from .networking import NetworkingCollector
7
+ from .security import SecurityCollector
8
+ from .integration import IntegrationCollector
9
+ from .containers import ContainerCollector
10
+
11
+ __all__ = [
12
+ "ComputeCollector",
13
+ "StorageCollector",
14
+ "DatabaseCollector",
15
+ "NetworkingCollector",
16
+ "SecurityCollector",
17
+ "IntegrationCollector",
18
+ "ContainerCollector",
19
+ ]