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,361 @@
1
+ """Wiz Issue Integration class"""
2
+
3
+ import logging
4
+ import re
5
+ from typing import List, Dict, Any, Iterator, Optional
6
+
7
+ from regscale.core.app.utils.parser_utils import safe_datetime_str
8
+ from regscale.integrations.scanner_integration import issue_due_date, IntegrationFinding
9
+ from regscale.utils.dict_utils import get_value
10
+ from .constants import (
11
+ get_wiz_issue_queries,
12
+ WizVulnerabilityType,
13
+ )
14
+ from .scanner import WizVulnerabilityIntegration
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class WizIssue(WizVulnerabilityIntegration):
20
+ """
21
+ Wiz Issue class
22
+ """
23
+
24
+ title = "Wiz-Issue"
25
+ asset_identifier_field = "wizId"
26
+ issue_identifier_field = "wizId"
27
+
28
+ def get_query_types(self, project_id: str) -> List[Dict[str, Any]]:
29
+ """Get the query types for issue scanning.
30
+
31
+ :param str project_id: The project ID to get queries for
32
+ :return: List of query types
33
+ :rtype: List[Dict[str, Any]]
34
+ """
35
+ return get_wiz_issue_queries(project_id=project_id)
36
+
37
+ def parse_findings(
38
+ self, nodes: List[Dict[str, Any]], vulnerability_type: WizVulnerabilityType
39
+ ) -> Iterator[IntegrationFinding]:
40
+ """
41
+ Parse the Wiz issues into IntegrationFinding objects
42
+ :param nodes:
43
+ :param vulnerability_type:
44
+ :return:
45
+ """
46
+ for node in nodes:
47
+ finding = self.parse_finding(node, vulnerability_type)
48
+ if finding:
49
+ yield finding
50
+
51
+ def _parse_security_subcategories(self, source_rule: Dict[str, Any]) -> List[str]:
52
+ """
53
+ Parse security subcategories from a source rule.
54
+
55
+ :param Dict[str, Any] source_rule: The source rule containing security subcategories
56
+ :return: List of formatted security subcategories
57
+ :rtype: List[str]
58
+ """
59
+ if not source_rule or "securitySubCategories" not in source_rule:
60
+ return []
61
+
62
+ subcategories = []
63
+ for subcat in source_rule.get("securitySubCategories", []):
64
+ if control_id := self._extract_nist_control_id(subcat):
65
+ subcategories.append(control_id)
66
+
67
+ return subcategories
68
+
69
+ def _extract_nist_control_id(self, subcat: Dict[str, Any]) -> Optional[str]:
70
+ """
71
+ Extract and format NIST control ID from a security subcategory.
72
+
73
+ :param Dict[str, Any] subcat: The security subcategory data
74
+ :return: Formatted control ID or None if invalid
75
+ :rtype: Optional[str]
76
+ """
77
+ framework = subcat.get("category", {}).get("framework", {}).get("name", "")
78
+ external_id = subcat.get("externalId", "")
79
+
80
+ if not external_id or "NIST SP 800-53" not in framework:
81
+ return None
82
+
83
+ return self._format_control_id(external_id.strip())
84
+
85
+ @staticmethod
86
+ def _format_control_id(control_id: str) -> Optional[str]:
87
+ """
88
+ Format a control ID into RegScale format.
89
+
90
+ :param str control_id: The raw control ID
91
+ :return: Formatted control ID or None if invalid
92
+ :rtype: Optional[str]
93
+ """
94
+ match = re.match(r"^([A-Z]{2})-(\d+)(?:\s*\((\d+)\))?$", control_id)
95
+ if not match:
96
+ return None
97
+
98
+ family = match.group(1).lower()
99
+ number = match.group(2)
100
+ enhancement = match.group(3)
101
+
102
+ return f"{family}-{number}" + (f".{enhancement}" if enhancement else "")
103
+
104
+ @staticmethod
105
+ def _get_asset_identifier(wiz_issue: Dict[str, Any]) -> str:
106
+ """
107
+ Get the asset identifier from a Wiz issue.
108
+
109
+ :param Dict[str, Any] wiz_issue: The Wiz issue
110
+ :return: The asset identifier
111
+ :rtype: str
112
+ """
113
+ # Check entitySnapshot first
114
+ if entity_snapshot := wiz_issue.get("entitySnapshot"):
115
+ if entity_id := entity_snapshot.get("id"):
116
+ return entity_id
117
+
118
+ # Check related entities
119
+ if "relatedEntities" in wiz_issue:
120
+ entities = wiz_issue.get("relatedEntities", [])
121
+ if entities and isinstance(entities, list):
122
+ for entity in entities:
123
+ if entity and isinstance(entity, dict) and (entity_id := entity.get("id")):
124
+ return entity_id
125
+
126
+ # Check common asset ID paths
127
+ asset_paths = [
128
+ "vulnerableAsset.id",
129
+ "entity.id",
130
+ "resource.id",
131
+ "relatedEntity.id",
132
+ "sourceEntity.id",
133
+ "target.id",
134
+ ]
135
+
136
+ for path in asset_paths:
137
+ if asset_id := get_value(wiz_issue, path):
138
+ return asset_id
139
+
140
+ # Try source rule as fallback
141
+ if source_rule := wiz_issue.get("sourceRule"):
142
+ if rule_id := source_rule.get("id"):
143
+ return f"wiz-rule-{rule_id}"
144
+
145
+ # Final fallback - use the issue ID
146
+ return f"wiz-issue-{wiz_issue.get('id', 'unknown')}"
147
+
148
+ @staticmethod
149
+ def _format_control_description(control: Dict[str, Any]) -> str:
150
+ """
151
+ Format the control description with additional context.
152
+
153
+ :param Dict[str, Any] control: The control data
154
+ :return: Formatted description
155
+ :rtype: str
156
+ """
157
+ formatted_desc = []
158
+ if description := control.get("controlDescription", ""):
159
+ formatted_desc.append("Description:")
160
+ formatted_desc.append(description)
161
+
162
+ if recommendation := control.get("resolutionRecommendation", ""):
163
+ if formatted_desc:
164
+ formatted_desc.append("\n")
165
+ formatted_desc.append("Resolution Recommendation:")
166
+ formatted_desc.append(recommendation)
167
+
168
+ return "\n".join(formatted_desc) if formatted_desc else "No description available"
169
+
170
+ def _get_plugin_name(self, wiz_issue: Dict[str, Any]) -> str:
171
+ """
172
+ Generate a unique plugin name based on the Wiz issue type and source rule.
173
+
174
+ :param Dict[str, Any] wiz_issue: The Wiz issue data
175
+ :return: A unique plugin name
176
+ :rtype: str
177
+ """
178
+ source_rule = wiz_issue.get("sourceRule", {})
179
+ typename = source_rule.get("__typename", "")
180
+ service_type = source_rule.get("serviceType", "")
181
+ name = source_rule.get("name", "")
182
+
183
+ if not typename:
184
+ return "Wiz-Finding"
185
+
186
+ if typename == "CloudConfigurationRule":
187
+ return self._get_config_plugin_name(name, service_type)
188
+ if typename == "Control":
189
+ return self._get_control_plugin_name(source_rule, name)
190
+ if typename == "CloudEventRule":
191
+ return self._get_event_plugin_name(name, service_type)
192
+
193
+ return "Wiz-Finding"
194
+
195
+ @staticmethod
196
+ def _get_config_plugin_name(name: str, service_type: str) -> str:
197
+ """
198
+ Generate plugin name for CloudConfigurationRule type.
199
+
200
+ :param str name: Rule name
201
+ :param str service_type: Service type
202
+ :return: Plugin name
203
+ :rtype: str
204
+ """
205
+ if not name:
206
+ return f"Wiz-{service_type}-Config"
207
+
208
+ # Simplified regex pattern that just looks for service name at start
209
+ service_match = re.match(r"^([A-Za-z\s]+?)\s+(?:public|private|should|must|needs|to)", name)
210
+ if not service_match:
211
+ return f"Wiz-{service_type}-Config"
212
+
213
+ service_name = service_match.group(1).strip()
214
+ if service_name == "App Configuration":
215
+ return f"Wiz-{service_type}-AppConfiguration"
216
+
217
+ service_name = "".join(word.capitalize() for word in service_name.split())
218
+ return f"Wiz-{service_type}-{service_name}"
219
+
220
+ @staticmethod
221
+ def _get_control_plugin_name(source_rule: Dict[str, Any], name: str) -> str:
222
+ """
223
+ Generate plugin name for Control type.
224
+
225
+ :param Dict[str, Any] source_rule: Source rule data
226
+ :param str name: Rule name
227
+ :return: Plugin name
228
+ :rtype: str
229
+ """
230
+ # Try to get NIST category first
231
+ subcategories = source_rule.get("securitySubCategories", [])
232
+ for subcat in subcategories:
233
+ category = subcat.get("category", {})
234
+ if category.get("framework", {}).get("name", "").lower() == "nist sp 800-53 revision 5":
235
+ category_name = category.get("name", "")
236
+ category_match = re.match(r"^([A-Z]+)\s", category_name)
237
+ if category_match:
238
+ return f"Wiz-Control-{category_match.group(1)}"
239
+ break
240
+
241
+ # Fallback to control name prefix
242
+ if name:
243
+ prefix_match = re.match(r"^([A-Za-z\s]+?)\s+(?:exposed|misconfigured|vulnerable|security|access)", name)
244
+ if prefix_match:
245
+ prefix = "".join(word.capitalize() for word in prefix_match.group(1).strip().split())
246
+ return f"Wiz-Control-{prefix}"
247
+
248
+ return "Wiz-Security-Control"
249
+
250
+ @staticmethod
251
+ def _get_event_plugin_name(name: str, service_type: str) -> str:
252
+ """
253
+ Generate plugin name for CloudEventRule type.
254
+
255
+ :param str name: Rule name
256
+ :param str service_type: Service type
257
+ :return: Plugin name
258
+ :rtype: str
259
+ """
260
+ if not service_type:
261
+ return "Wiz-Event"
262
+ if not name:
263
+ return f"Wiz-{service_type}-Event"
264
+ event_match = re.match(r"^([A-Za-z\s]+?)\s+(?:detection|event|alert|activity)", name)
265
+ if not event_match:
266
+ return f"Wiz-{service_type}-Event"
267
+
268
+ event_type = event_match.group(1).strip()
269
+ if event_type == "Suspicious activity":
270
+ return f"Wiz-{service_type}-SuspiciousActivity"
271
+
272
+ event_type = "".join(word.capitalize() for word in event_type.split())
273
+ return f"Wiz-{service_type}-{event_type}"
274
+
275
+ @staticmethod
276
+ def _get_source_rule_id(source_rule: Dict[str, Any]) -> str:
277
+ """
278
+ Generate a source rule identifier that includes the type and ID.
279
+
280
+ :param Dict[str, Any] source_rule: The source rule data
281
+ :return: A formatted source rule identifier
282
+ :rtype: str
283
+ """
284
+ typename = source_rule.get("__typename", "")
285
+ rule_id = source_rule.get("id", "")
286
+ service_type = source_rule.get("serviceType", "")
287
+
288
+ if typename and rule_id:
289
+ if service_type:
290
+ return f"{typename}-{service_type}-{rule_id}"
291
+ return f"{typename}-{rule_id}"
292
+ return rule_id
293
+
294
+ # noinspection PyMethodOverriding
295
+ def parse_finding(self, wiz_issue: Dict[str, Any], vulnerability_type: WizVulnerabilityType) -> IntegrationFinding:
296
+ """
297
+ Parses a Wiz issue into an IntegrationFinding object.
298
+
299
+ :param Dict[str, Any] wiz_issue: The Wiz issue to parse
300
+ :param WizVulnerabilityType vulnerability_type: The type of vulnerability
301
+ :return: The parsed IntegrationFinding
302
+ :rtype: IntegrationFinding
303
+ """
304
+ wiz_id = wiz_issue.get("id", "N/A")
305
+ severity = self.get_issue_severity(wiz_issue.get("severity", "Low"))
306
+ status = self.map_status_to_issue_status(wiz_issue.get("status", "OPEN"))
307
+ date_created = safe_datetime_str(wiz_issue.get("createdAt"))
308
+ name: str = wiz_issue.get("name", "")
309
+
310
+ # Handle source rule (Control) specific fields
311
+ source_rule = wiz_issue.get("sourceRule", {})
312
+ control_name = source_rule.get("name", "")
313
+
314
+ # Get control labels from security subcategories
315
+ control_labels = self._parse_security_subcategories(source_rule)
316
+
317
+ # Get asset identifier
318
+ asset_id = self._get_asset_identifier(wiz_issue)
319
+
320
+ # Format description with control context
321
+ description = self._format_control_description(source_rule) if source_rule else wiz_issue.get("description", "")
322
+
323
+ # Handle CVE if present
324
+ cve = (
325
+ name
326
+ if name and (name.startswith("CVE") or name.startswith("GHSA")) and not wiz_issue.get("cve")
327
+ else wiz_issue.get("cve")
328
+ )
329
+
330
+ # Get plugin name and source rule ID
331
+ plugin_name = self._get_plugin_name(wiz_issue)
332
+ source_rule_id = self._get_source_rule_id(source_rule)
333
+
334
+ # Get Security Check from plugin name
335
+ security_check = f"Wiz {plugin_name}"
336
+
337
+ return IntegrationFinding(
338
+ control_labels=control_labels,
339
+ category="Wiz Control" if source_rule else "Wiz Vulnerability",
340
+ title=control_name or wiz_issue.get("name") or f"unknown - {wiz_id}",
341
+ security_check=security_check,
342
+ description=description,
343
+ severity=severity,
344
+ status=status,
345
+ asset_identifier=asset_id,
346
+ external_id=wiz_id,
347
+ first_seen=date_created,
348
+ last_seen=safe_datetime_str(wiz_issue.get("lastDetectedAt")),
349
+ remediation=source_rule.get("resolutionRecommendation")
350
+ or f"Update to version {wiz_issue.get('fixedVersion')} or higher",
351
+ cve=cve,
352
+ plugin_name=plugin_name,
353
+ source_rule_id=source_rule_id,
354
+ vulnerability_type=vulnerability_type.value,
355
+ date_created=date_created,
356
+ due_date=issue_due_date(severity, date_created),
357
+ recommendation_for_mitigation=source_rule.get("resolutionRecommendation")
358
+ or wiz_issue.get("description", ""),
359
+ poam_comments=None,
360
+ basis_for_adjustment=None,
361
+ )
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Class for a Wiz.io integration"""
4
+
5
+ # standard python imports
6
+ from enum import Enum
7
+ from typing import Optional
8
+
9
+ from pydantic import BaseModel, Field
10
+ from datetime import datetime
11
+
12
+ from regscale.models import regscale_models
13
+
14
+
15
+ class AssetCategory(Enum):
16
+ """Map Wiz assetTypes with RegScale assetCategories"""
17
+
18
+ SERVICE_USAGE_TECHNOLOGY = regscale_models.AssetCategory.Hardware
19
+ GATEWAY = regscale_models.AssetCategory.Hardware
20
+ SECRET = regscale_models.AssetCategory.Hardware
21
+ BUCKET = regscale_models.AssetCategory.Hardware
22
+ WEB_SERVICE = regscale_models.AssetCategory.Hardware
23
+ DB_SERVER = regscale_models.AssetCategory.Hardware
24
+ LOAD_BALANCER = regscale_models.AssetCategory.Hardware
25
+ CLOUD_ORGANIZATION = regscale_models.AssetCategory.Hardware
26
+ SUBNET = regscale_models.AssetCategory.Hardware
27
+ VIRTUAL_MACHINE = regscale_models.AssetCategory.Hardware
28
+ TECHNOLOGY = regscale_models.AssetCategory.Hardware
29
+ SECRET_CONTAINER = regscale_models.AssetCategory.Hardware
30
+ FILE_SYSTEM_SERVICE = regscale_models.AssetCategory.Hardware
31
+ KUBERNETES_CLUSTER = regscale_models.AssetCategory.Hardware
32
+ ROUTE_TABLE = regscale_models.AssetCategory.Hardware
33
+ COMPUTE_INSTANCE_GROUP = regscale_models.AssetCategory.Hardware
34
+ HOSTED_TECHNOLOGY = regscale_models.AssetCategory.Hardware
35
+ USER_ACCOUNT = regscale_models.AssetCategory.Hardware
36
+ DNS_ZONE = regscale_models.AssetCategory.Hardware
37
+ VOLUME = regscale_models.AssetCategory.Hardware
38
+ SERVICE_ACCOUNT = regscale_models.AssetCategory.Hardware
39
+ RESOURCE_GROUP = regscale_models.AssetCategory.Hardware
40
+ ACCESS_ROLE = regscale_models.AssetCategory.Hardware
41
+ SUBSCRIPTION = regscale_models.AssetCategory.Hardware
42
+ SERVICE_CONFIGURATION = regscale_models.AssetCategory.Hardware
43
+ VIRTUAL_NETWORK = regscale_models.AssetCategory.Hardware
44
+ VIRTUAL_MACHINE_IMAGE = regscale_models.AssetCategory.Hardware
45
+ FIREWALL = regscale_models.AssetCategory.Hardware
46
+ DATABASE = regscale_models.AssetCategory.Hardware
47
+ GOVERNANCE_POLICY_GROUP = regscale_models.AssetCategory.Hardware
48
+ STORAGE_ACCOUNT = regscale_models.AssetCategory.Hardware
49
+ CONFIG_MAP = regscale_models.AssetCategory.Hardware
50
+ NETWORK_ADDRESS = regscale_models.AssetCategory.Hardware
51
+ NETWORK_INTERFACE = regscale_models.AssetCategory.Hardware
52
+ DAEMON_SET = regscale_models.AssetCategory.Hardware
53
+ PRIVATE_ENDPOINT = regscale_models.AssetCategory.Hardware
54
+ ENDPOINT = regscale_models.AssetCategory.Hardware
55
+ DEPLOYMENT = regscale_models.AssetCategory.Hardware
56
+ POD = regscale_models.AssetCategory.Hardware
57
+ KUBERNETES_STORAGE_CLASS = regscale_models.AssetCategory.Hardware
58
+ ACCESS_ROLE_BINDING = regscale_models.AssetCategory.Hardware
59
+ KUBERNETES_INGRESS = regscale_models.AssetCategory.Hardware
60
+ CONTAINER = regscale_models.AssetCategory.Hardware
61
+ CONTAINER_IMAGE = regscale_models.AssetCategory.Hardware
62
+ CONTAINER_REGISTRY = regscale_models.AssetCategory.Hardware
63
+ GOVERNANCE_POLICY = regscale_models.AssetCategory.Hardware
64
+ REPLICA_SET = regscale_models.AssetCategory.Hardware
65
+ KUBERNETES_SERVICE = regscale_models.AssetCategory.Hardware
66
+ KUBERNETES_PERSISTENT_VOLUME_CLAIM = regscale_models.AssetCategory.Hardware
67
+ KUBERNETES_PERSISTENT_VOLUME = regscale_models.AssetCategory.Hardware
68
+ KUBERNETES_NETWORK_POLICY = regscale_models.AssetCategory.Hardware
69
+ KUBERNETES_NODE = regscale_models.AssetCategory.Hardware
70
+
71
+
72
+ class ComplianceCheckStatus(Enum):
73
+ PASS = "Pass"
74
+ FAIL = "Fail"
75
+
76
+
77
+ class ComplianceReport(BaseModel):
78
+ resource_name: str = Field(..., alias="Resource Name")
79
+ cloud_provider_id: str = Field(..., alias="Cloud Provider ID")
80
+ object_type: str = Field(..., alias="Object Type")
81
+ native_type: str = Field(..., alias="Native Type")
82
+ tags: Optional[str] = Field(None, alias="Tags")
83
+ subscription: str = Field(..., alias="Subscription")
84
+ projects: Optional[str] = Field(None, alias="Projects")
85
+ cloud_provider: str = Field(..., alias="Cloud Provider")
86
+ policy_id: str = Field(..., alias="Policy ID")
87
+ policy_short_name: str = Field(..., alias="Policy Short Name")
88
+ policy_description: Optional[str] = Field(None, alias="Policy Description")
89
+ policy_category: Optional[str] = Field(None, alias="Policy Category")
90
+ control_id: Optional[str] = Field(None, alias="Control ID")
91
+ compliance_check: Optional[str] = Field(None, alias="Compliance Check Name (Wiz Subcategory)")
92
+ control_description: Optional[str] = Field(None, alias="Control Description")
93
+ severity: Optional[str] = Field(None, alias="Severity")
94
+ result: str = Field(..., alias="Result")
95
+ framework: Optional[str] = Field(None, alias="Framework")
96
+ remediation_steps: Optional[str] = Field(None, alias="Remediation Steps")
97
+ assessed_at: Optional[datetime] = Field(None, alias="Assessed At")
98
+ created_at: Optional[datetime] = Field(None, alias="Created At")
99
+ updated_at: Optional[datetime] = Field(None, alias="Updated At")
100
+ subscription_name: Optional[str] = Field(None, alias="Subscription Name")
101
+ subscription_provider_id: Optional[str] = Field(None, alias="Subscription Provider ID")
102
+ resource_id: str = Field(..., alias="Resource ID")
103
+ resource_region: Optional[str] = Field(None, alias="Resource Region")
104
+ resource_cloud_platform: Optional[str] = Field(None, alias="Resource Cloud Platform")
105
+
106
+
107
+ # # Attempt to create an instance of the model again
108
+ # example_row = data.iloc[0].to_dict()
109
+ # example_compliance_report = ComplianceReport(**example_row)
110
+ #
111
+ # # Display the instance
112
+ # example_compliance_report.dict()