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,479 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """standard python imports"""
4
+ import glob
5
+ import logging
6
+ from datetime import datetime, date
7
+ from typing import Literal, Optional
8
+
9
+ import click
10
+ from dateutil.relativedelta import relativedelta
11
+
12
+ from regscale.core.app.utils.regscale_utils import check_module_id
13
+ from regscale.models import regscale_id, regscale_module
14
+
15
+ logger = logging.getLogger("regscale")
16
+
17
+
18
+ @click.group()
19
+ def fedramp():
20
+ """Performs bulk processing of FedRAMP files (Upload trusted data only)."""
21
+
22
+
23
+ # FedRAMP Docx Support
24
+ @fedramp.command(context_settings={"show_default": True})
25
+ @click.option(
26
+ "--file_path",
27
+ "-f",
28
+ type=click.Path(exists=True, dir_okay=False, file_okay=True),
29
+ required=True,
30
+ prompt="Enter the full file path of the FedRAMP (.docx) document to ingest to RegScale.",
31
+ help="RegScale will process and load the FedRAMP document.",
32
+ )
33
+ @click.option(
34
+ "--base_fedramp_profile",
35
+ "-pn",
36
+ type=click.STRING,
37
+ required=False,
38
+ help="Enter the name of the RegScale FedRAMP profile to use.",
39
+ default="FedRAMP - High",
40
+ )
41
+ @click.option(
42
+ "--base_fedramp_profile_id",
43
+ "-p",
44
+ type=click.INT,
45
+ required=False,
46
+ help="Enter the ID of the RegScale FedRAMP profile to use.",
47
+ )
48
+ @click.option(
49
+ "--appendix_a_file_path",
50
+ "-a",
51
+ type=click.Path(exists=True),
52
+ required=False,
53
+ prompt="Enter the full file path of the FedRAMP Appendix A (.docx) document to ingest to RegScale.",
54
+ help="RegScale will process and load the FedRAMP Appendix A document, used during Rev5 version import.",
55
+ )
56
+ @click.option(
57
+ "--save_data",
58
+ type=click.BOOL,
59
+ default=False,
60
+ required=False,
61
+ help="Whether to save the data as a JSON file.",
62
+ )
63
+ @click.option(
64
+ "--add_missing",
65
+ type=click.BOOL,
66
+ default=False,
67
+ required=False,
68
+ help="Whether to create missing controls from profile in the SSP.",
69
+ )
70
+ @click.option(
71
+ "--version",
72
+ "-rev",
73
+ type=click.Choice(["rev4", "rev5", "4", "5"], case_sensitive=False),
74
+ help="FedRAMP revision version.",
75
+ prompt="Rev4 or Rev5",
76
+ required=True,
77
+ )
78
+ def load_fedramp_docx(
79
+ file_path: click.Path,
80
+ base_fedramp_profile: click.STRING,
81
+ base_fedramp_profile_id: Optional[click.STRING],
82
+ save_data: click.BOOL,
83
+ add_missing: click.BOOL,
84
+ appendix_a_file_path: click.Path,
85
+ version: Literal["rev4", "rev5", "4", "5"],
86
+ ):
87
+ """
88
+ Convert a FedRAMP docx file to a RegScale SSP.
89
+ """
90
+ if "4" in version:
91
+ from regscale.integrations.public.fedramp.fedramp_docx import process_fedramp_docx
92
+
93
+ logger.info(f"Processing FedRAMP document {file_path}.")
94
+ process_fedramp_docx(file_path, base_fedramp_profile, base_fedramp_profile_id, save_data, add_missing)
95
+ elif "5" in version:
96
+ from regscale.integrations.public.fedramp.fedramp_five import process_fedramp_docx_v5
97
+
98
+ if not base_fedramp_profile_id:
99
+ from regscale.integrations.public.fedramp.fedramp_common import find_profile_by_name
100
+
101
+ profile = find_profile_by_name(base_fedramp_profile) or {}
102
+ base_fedramp_profile_id = profile.get("id")
103
+ if not base_fedramp_profile_id:
104
+ from regscale.core.app.utils.app_utils import error_and_exit
105
+
106
+ error_and_exit(
107
+ f"Unable to find profile with name {base_fedramp_profile}. Please provide a profile ID "
108
+ "by using the -p flag."
109
+ )
110
+
111
+ process_fedramp_docx_v5(file_path, base_fedramp_profile_id, save_data, add_missing, appendix_a_file_path) # type: ignore
112
+
113
+
114
+ @fedramp.command()
115
+ @click.option(
116
+ "--file_path",
117
+ "-f",
118
+ type=click.Path(exists=True, dir_okay=False, file_okay=True),
119
+ required=True,
120
+ prompt="Enter the file name of the FedRAMP JSON document to process.",
121
+ help="RegScale will process and load the FedRAMP document.",
122
+ )
123
+ @click.option(
124
+ "--submission_date",
125
+ type=click.DateTime(formats=["%Y-%m-%d"]),
126
+ default=str(date.today()),
127
+ required=True,
128
+ prompt="Enter the submission date of this FedRAMP document.",
129
+ help=f"Submission date, default is today: {date.today()}.",
130
+ )
131
+ @click.option(
132
+ "--expiration_date",
133
+ type=click.DateTime(formats=["%Y-%m-%d"]),
134
+ default=str((datetime.now() + relativedelta(years=3)).date()),
135
+ required=True,
136
+ prompt="Enter the expiration date of this FedRAMP document.",
137
+ help=f"Expiration date, default is {str((datetime.now() + relativedelta(years=3)).date())}.",
138
+ )
139
+ def load_fedramp_oscal(file_path, submission_date, expiration_date):
140
+ """
141
+ [BETA] Convert a FedRAMP OSCAL SSP json file to a RegScale SSP.
142
+ """
143
+ from regscale.integrations.public.fedramp.fedramp_common import process_fedramp_oscal_ssp
144
+
145
+ if not expiration_date:
146
+ today_dt = date.today()
147
+ expiration_date = date(today_dt.year + 3, today_dt.month, today_dt.day)
148
+
149
+ process_fedramp_oscal_ssp(file_path, submission_date, expiration_date)
150
+
151
+
152
+ @fedramp.command()
153
+ @click.option(
154
+ "--file-path",
155
+ "-f",
156
+ type=click.Path(exists=True),
157
+ help="File to upload to RegScale.",
158
+ required=True,
159
+ )
160
+ @click.option(
161
+ "--catalogue_id",
162
+ "-c",
163
+ type=click.INT,
164
+ help="The RegScale ID # of the catalogue to use for controls in the profile.",
165
+ required=True,
166
+ )
167
+ def import_fedramp_ssp_xml(file_path: click.Path, catalogue_id: click.INT):
168
+ """
169
+ Import FedRAMP Revision 4/5 SSP XML into RegScale
170
+ """
171
+ from collections import deque
172
+
173
+ from regscale.integrations.public.fedramp.import_fedramp_r4_ssp import parse_and_load_xml_rev4
174
+ from regscale.integrations.public.fedramp.ssp_logger import SSPLogger
175
+
176
+ logger = SSPLogger()
177
+ logger.info(event_msg="Importing FedRAMP SSP XML into RegScale")
178
+ parse_generator = parse_and_load_xml_rev4(None, str(file_path), catalogue_id)
179
+ deque(parse_generator, maxlen=1)
180
+
181
+
182
+ @fedramp.command(context_settings={"show_default": True})
183
+ @click.option(
184
+ "--appendix_a_file_path",
185
+ "-a",
186
+ type=click.Path(exists=True),
187
+ required=False,
188
+ prompt="Enter the full file path of the FedRAMP Appendix A (.docx) document to ingest to RegScale.",
189
+ help="RegScale will process and load the FedRAMP Appendix A document.",
190
+ )
191
+ @click.option(
192
+ "--base_fedramp_profile_id",
193
+ "-p",
194
+ type=click.INT,
195
+ required=True,
196
+ help="The RegScale FedRAMP profile ID to use.",
197
+ )
198
+ @click.option(
199
+ "--add_missing",
200
+ type=click.BOOL,
201
+ default=False,
202
+ required=False,
203
+ help="Whether to create missing controls from profile in the SSP.",
204
+ )
205
+ @click.option("--regscale_id", "-i", help="Regscale id to push inventory to in RegScale.", required=True)
206
+ def load_fedramp_appendix_a(
207
+ appendix_a_file_path: str, base_fedramp_profile_id: int, add_missing: click.BOOL, regscale_id: int # noqa
208
+ ):
209
+ """
210
+ Convert a FedRAMP Appendix A docx file to a RegScale SSP.
211
+ """
212
+ from regscale.integrations.public.fedramp.fedramp_five import load_appendix_a as _load_appendix_a
213
+
214
+ _load_appendix_a(
215
+ appendix_a_file_name=appendix_a_file_path,
216
+ parent_id=regscale_id,
217
+ profile_id=base_fedramp_profile_id,
218
+ add_missing=add_missing,
219
+ )
220
+
221
+
222
+ @fedramp.command(name="import_fedramp_inventory")
223
+ @click.option(
224
+ "--path",
225
+ "-f",
226
+ type=click.Path(exists=True, dir_okay=True),
227
+ help="The File OR Folder Path to the inventory .xlsx files.",
228
+ prompt="Inventory .xlsx folder location",
229
+ required=True,
230
+ )
231
+ @click.option(
232
+ "--sheet_name",
233
+ "-s",
234
+ type=click.STRING,
235
+ help="Sheet name in the inventory .xlsx file to parse.",
236
+ default="Inventory",
237
+ required=False,
238
+ )
239
+ @click.option(
240
+ "--regscale_id",
241
+ "-i",
242
+ type=click.INT,
243
+ help="RegScale Record ID to update.",
244
+ prompt="RegScale Record ID",
245
+ required=True,
246
+ )
247
+ @click.option(
248
+ "--regscale_module",
249
+ "-m",
250
+ type=click.STRING,
251
+ help="RegScale Module for the provided ID.",
252
+ prompt="RegScale Record Module",
253
+ required=True,
254
+ )
255
+ @click.option(
256
+ "--version",
257
+ "-rev",
258
+ type=click.Choice(["rev4", "rev5", "4", "5"], case_sensitive=False),
259
+ help="FedRAMP revision version.",
260
+ prompt="Rev4 or Rev5",
261
+ required=True,
262
+ )
263
+ def import_fedramp_inventory(
264
+ path: click.Path,
265
+ sheet_name: str,
266
+ regscale_id: int,
267
+ regscale_module: str,
268
+ version: Literal["rev4", "rev5", "4", "5"],
269
+ ): # noqa
270
+ """
271
+ Import FedRAMP rev4 or rev5 Inventory Workbook into RegScale
272
+ """
273
+ import os
274
+ from pathlib import Path
275
+
276
+ from regscale.integrations.public.fedramp.import_workbook import upload
277
+
278
+ link_path = Path(path)
279
+ if link_path.is_dir():
280
+ files = glob.glob(str(link_path) + os.sep + "*.xlsx")
281
+ if not files:
282
+ logger.warning("No files found in the folder.")
283
+ return
284
+ for file in files:
285
+ try:
286
+ upload(
287
+ inventory=file,
288
+ sheet_name=sheet_name,
289
+ record_id=regscale_id,
290
+ module=regscale_module,
291
+ version=version,
292
+ )
293
+ except Exception as e:
294
+ logger.error(f"Failed to parse inventory from {file}: {e}")
295
+ continue
296
+ elif link_path.is_file():
297
+ try:
298
+ upload(
299
+ inventory=str(link_path),
300
+ sheet_name=sheet_name,
301
+ record_id=regscale_id,
302
+ module=regscale_module,
303
+ version=version,
304
+ )
305
+ except Exception as e:
306
+ logger.error(f"Failed to parse inventory from {link_path}: {e}")
307
+
308
+
309
+ @fedramp.command(name="import-poam")
310
+ @click.option(
311
+ "--file_path",
312
+ "-f",
313
+ type=click.Path(exists=True, dir_okay=False, file_okay=True),
314
+ required=True,
315
+ prompt="Enter the file path containing FedRAMP (.xlsx) POAM workbook to ingest to RegScale.",
316
+ help="RegScale will process and load the FedRAMP POAMs as RegScale issues.",
317
+ )
318
+ @regscale_id()
319
+ @regscale_module()
320
+ @click.option(
321
+ "--poam_id_column",
322
+ "-pc",
323
+ type=click.STRING,
324
+ help="The column name containing the POAM ID.",
325
+ required=False,
326
+ default="POAM ID",
327
+ )
328
+ @click.option(
329
+ "--resolve_empty_status_date",
330
+ "-rs",
331
+ type=click.Choice(["CURRENT_DATE", "USE_NEIGHBOR"], case_sensitive=False),
332
+ default="CURRENT_DATE",
333
+ help="Choose between 'CURRENT_DATE' (default) or 'USE_NEIGHBOR'.",
334
+ )
335
+ def import_fedramp_poam_template(
336
+ file_path: click.Path, regscale_id: int, regscale_module: str, poam_id_column: str, resolve_empty_status_date: str
337
+ ) -> None:
338
+ """
339
+ Import a FedRamp POA&M document to RegScale issues.
340
+ """
341
+ # suppress UserWarnings from openpyxl
342
+ import warnings
343
+
344
+ from regscale.integrations.public.fedramp.poam.scanner import FedrampPoamIntegration
345
+
346
+ warnings.filterwarnings("ignore", category=UserWarning, module="openpyxl")
347
+
348
+ if not check_module_id(parent_id=regscale_id, parent_module=regscale_module):
349
+ raise ValueError(f"RegScale ID {regscale_id} is not a valid member of {regscale_module}.")
350
+
351
+ # Initialize the FedRAMP integration
352
+ integration = FedrampPoamIntegration(plan_id=regscale_id, file_path=str(file_path))
353
+ integration.poam_id_header = poam_id_column
354
+ integration.file_path = str(file_path)
355
+
356
+ # First sync assets
357
+ integration.sync_assets(
358
+ plan_id=regscale_id,
359
+ file_path=str(file_path),
360
+ poam_sheets=integration.poam_sheets,
361
+ workbook=integration.workbook,
362
+ validators=integration.validators,
363
+ )
364
+
365
+ # Then process the POAM findings
366
+ integration.sync_findings(
367
+ plan_id=regscale_id,
368
+ file_path=str(file_path),
369
+ poam_sheets=integration.poam_sheets,
370
+ workbook=integration.workbook,
371
+ validators=integration.validators,
372
+ resolve_empty_status_date=resolve_empty_status_date,
373
+ close_outdated_findings=False,
374
+ )
375
+
376
+ # Ensure workbook is closed
377
+ if integration.workbook:
378
+ integration.workbook.close()
379
+
380
+
381
+ @fedramp.command(name="import-drf")
382
+ @click.option(
383
+ "--file_path",
384
+ "-f",
385
+ type=click.Path(exists=True, dir_okay=False, file_okay=True),
386
+ required=True,
387
+ prompt="Enter the file path containing FedRAMP (.xlsx) POAM workbook to ingest to RegScale.",
388
+ help="RegScale will process and load the FedRAMP POAMs as RegScale issues.",
389
+ )
390
+ @regscale_id()
391
+ @regscale_module()
392
+ def import_drf(file_path: click.Path, regscale_id: int, regscale_module: str) -> None:
393
+ """
394
+ Import a FedRamp DRF document to RegScale issues.
395
+ """
396
+ # suppress UserWarnings from openpyxl
397
+ import warnings
398
+
399
+ from regscale.models.integration_models.drf import DRF
400
+
401
+ warnings.filterwarnings("ignore", category=UserWarning, module="openpyxl")
402
+
403
+ if not check_module_id(parent_id=regscale_id, parent_module=regscale_module):
404
+ raise ValueError(f"RegScale ID {regscale_id} is not a valid member of {regscale_module}.")
405
+ DRF(file_path=file_path, module_id=regscale_id, module=regscale_module)
406
+
407
+
408
+ @fedramp.command(name="import-cis-crm")
409
+ @click.option(
410
+ "--file_path",
411
+ "-f",
412
+ type=click.Path(exists=True, dir_okay=False, file_okay=True),
413
+ help="The file path to the FedRAMP CIS CRM .xlsx file.",
414
+ prompt="FedRAMP CIS CRM .xlsx file location",
415
+ required=True,
416
+ )
417
+ @click.option(
418
+ "--version",
419
+ "-rev",
420
+ type=click.Choice(["rev4", "rev5", "4", "5"], case_sensitive=False),
421
+ help="FedRAMP revision version.",
422
+ prompt="Rev4 or Rev5",
423
+ required=True,
424
+ )
425
+ @click.option(
426
+ "--cis_sheet_name",
427
+ "-cis",
428
+ type=click.STRING,
429
+ help="CIS sheet name in the FedRAMP CIS CRM .xlsx to parse.",
430
+ prompt="CIS Sheet Name",
431
+ default="CIS Worksheet",
432
+ required=True,
433
+ )
434
+ @click.option(
435
+ "--regscale_ssp_id",
436
+ "-i",
437
+ type=click.INT,
438
+ help="The ID number from RegScale of the System Security Plan.",
439
+ prompt="Enter RegScale System Security Plan ID",
440
+ required=True,
441
+ )
442
+ @click.option(
443
+ "--crm_sheet_name",
444
+ "-crm",
445
+ type=click.STRING,
446
+ help="CRM sheet name in the FedRAMP CIS CRM .xlsx to parse.",
447
+ required=False,
448
+ )
449
+ @click.option(
450
+ "--leveraged_auth_id",
451
+ "-l",
452
+ type=click.INT,
453
+ help="RegScale Leveraged Authorization ID #, if none provided, one will be created.",
454
+ required=False,
455
+ default=0,
456
+ )
457
+ def import_ciscrm(
458
+ file_path: click.Path,
459
+ version: str,
460
+ cis_sheet_name: str,
461
+ crm_sheet_name: Optional[click.STRING],
462
+ regscale_ssp_id: int,
463
+ leveraged_auth_id: int = 0,
464
+ ):
465
+ """
466
+ [BETA] Import FedRAMP Rev5 CIS/CRM Workbook into a RegScale System Security Plan.
467
+ """
468
+
469
+ from regscale.integrations.public.fedramp.fedramp_cis_crm import parse_and_import_ciscrm
470
+
471
+ version_literal: Literal["rev4", "rev5", "4", "5"] = version # type: ignore
472
+ parse_and_import_ciscrm(
473
+ file_path=file_path,
474
+ version=version_literal, # type: ignore
475
+ cis_sheet_name=cis_sheet_name,
476
+ crm_sheet_name=crm_sheet_name,
477
+ regscale_ssp_id=regscale_ssp_id,
478
+ leveraged_auth_id=leveraged_auth_id,
479
+ )