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,57 @@
1
+ """
2
+ Description: A class to handle reading and writing data to a pickle file in a thread-safe manner.
3
+ """
4
+
5
+ import logging
6
+ import pickle
7
+ import threading
8
+ from os import PathLike
9
+ from pickle import UnpicklingError
10
+ from typing import Any, Generator
11
+
12
+ from pathlib import Path
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class PickleFileHandler:
18
+ """
19
+ A class to handle reading and writing data to a pickle file in a thread-safe manner.
20
+
21
+ :param PathLike[str] file_path: The path to the pickle file.
22
+ """
23
+
24
+ def __init__(self, file_path: PathLike[str]):
25
+ self.file_path: Path = Path(file_path)
26
+ self.lock = threading.Lock()
27
+
28
+ def write(self, data: Any):
29
+ """
30
+ Writes data to the pickle file in a thread-safe manner.
31
+
32
+ :param Any data: The data to be pickled and written to the file.
33
+ """
34
+ with self.lock:
35
+ with open(self.file_path, "wb") as file:
36
+ pickle.dump(data, file)
37
+
38
+ def read(self) -> Generator[Any, None, None]:
39
+ """
40
+ Reads data from the pickle file in a thread-safe manner and returns a generator.
41
+
42
+ :returns: A generator yielding the data read from the pickle file.
43
+ :yields: Any -- The data read from the pickle file.
44
+ """
45
+ with open(self.file_path, "rb") as file:
46
+ data = None
47
+ try:
48
+ data = pickle.load(file)
49
+ except EOFError:
50
+ pass
51
+ except UnpicklingError as e:
52
+ logger.debug("Error reading pickle file: %s", e)
53
+ if data:
54
+ if isinstance(data, list):
55
+ yield from data
56
+ else:
57
+ yield data
@@ -0,0 +1,319 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Functions used to interact with RegScale API"""
4
+
5
+ # standard imports
6
+ import json
7
+ import os
8
+ import re
9
+ from typing import Any, Optional
10
+ from urllib.parse import urljoin
11
+
12
+ from requests import JSONDecodeError
13
+
14
+ from regscale.core.app.api import Api
15
+ from regscale.core.app.application import Application
16
+ from regscale.core.app.logz import create_logger
17
+ from regscale.core.app.utils.app_utils import convert_to_string, error_and_exit, get_file_name, get_file_type
18
+ from regscale.models import Data
19
+ from regscale.models.regscale_models.modules import Modules
20
+ import warnings
21
+
22
+
23
+ logger = create_logger()
24
+
25
+
26
+ def send_email(_: Api, __: str, payload: dict) -> bool:
27
+ """
28
+ Function to use the RegScale email API and send an email, returns bool on whether API call was successful
29
+
30
+ :param Api _: API object
31
+ :param str __: RegScale URL of instance
32
+ :param dict payload: email payload
33
+ :return: Boolean if RegScale api was successful
34
+ :rtype: bool
35
+ """
36
+ warnings.warn(
37
+ "This function is deprecated and will be removed in a future release. Use Email().send instead.",
38
+ DeprecationWarning,
39
+ stacklevel=2,
40
+ )
41
+ from regscale.models import Email
42
+
43
+ email = Email(**payload)
44
+ # use the api to post the dict payload passed
45
+ return email.send() is not None
46
+
47
+
48
+ def update_regscale_config(str_param: str, val: Any, app: Application = None) -> str:
49
+ """
50
+ Update config in init.yaml
51
+
52
+ :param str str_param: config parameter to update
53
+ :param Any val: config parameter value to update
54
+ :param Application app: Application object, defaults to None
55
+ :return: Verification message
56
+ :rtype: str
57
+ """
58
+ if not app:
59
+ app = Application()
60
+ config = app.config
61
+ # update config param
62
+ # existing params will be overwritten, new params will be added
63
+ config[str_param] = val
64
+ # write the changes back to file
65
+ app.save_config(config)
66
+ logger.debug(f"Parameter '{str_param}' set to '{val}'.")
67
+ return "Config updated"
68
+
69
+
70
+ def create_regscale_assessment(_: str, new_assessment: dict, __: Api) -> Optional[int]:
71
+ """
72
+ Function to create a new assessment in RegScale and returns the new assessment's ID
73
+
74
+ :param str _: RegScale instance URL to create the assessment
75
+ :param dict new_assessment: API assessment payload
76
+ :param Api __: API object
77
+ :return: New RegScale assessment ID
78
+ :rtype: int
79
+ """
80
+ warnings.warn(
81
+ "This function is deprecated and will be removed in a future release. Use Assessment().create.id instead.",
82
+ DeprecationWarning,
83
+ stacklevel=2,
84
+ )
85
+ from regscale.models import Assessment
86
+
87
+ new_assessment = Assessment(**new_assessment)
88
+ if created_assessment := new_assessment.create():
89
+ return created_assessment.id
90
+ return None
91
+
92
+
93
+ def check_module_id(parent_id: int, parent_module: str) -> bool:
94
+ """
95
+ Verify object exists in RegScale
96
+
97
+ :param int parent_id: RegScale parent ID
98
+ :param str parent_module: RegScale module
99
+ :return: True or False if the object exists in RegScale
100
+ :rtype: bool
101
+ """
102
+ api = Api()
103
+ modules = Modules()
104
+ key = (list(modules.dict().keys())[list(modules.dict().values()).index(parent_module)]) + "s"
105
+
106
+ body = """
107
+ query {
108
+ NAMEOFTABLE(take: 50, skip: 0) {
109
+ items {
110
+ id
111
+ },
112
+ pageInfo {
113
+ hasNextPage
114
+ }
115
+ ,totalCount
116
+ }
117
+ }""".replace(
118
+ "NAMEOFTABLE", key
119
+ )
120
+
121
+ items = api.graph(query=body)
122
+
123
+ if parent_id in set(obj["id"] for obj in items[key]["items"]):
124
+ return True
125
+ return False
126
+
127
+
128
+ def verify_provided_module(module: str) -> None:
129
+ """
130
+ Function to check the provided module is a valid RegScale module and will display the acceptable RegScale modules
131
+
132
+ :param str module: desired module
133
+ :rtype: None
134
+ """
135
+ if module not in Modules().api_names():
136
+ Modules().to_table()
137
+ error_and_exit("Please provide an option from the Accepted Value column.")
138
+
139
+
140
+ def get_all_from_module(api: Api, module: str, timeout: int = 300) -> list[dict]:
141
+ """
142
+ Function to retrieve all records for the provided Module in RegScale via GraphQl
143
+
144
+ :param Api api: API object
145
+ :param str module: RegScale Module, accepts issues, assessments, and risks
146
+ :param int timeout: Timeout for the API call, defaults to 300 seconds
147
+ :return: list of objects from RegScale API of the provided module
148
+ :rtype: list[dict]
149
+ """
150
+ original_timeout = api.timeout
151
+ # adjust timeout to the provided timeout if it is greater than the default
152
+ api.timeout = max(timeout, original_timeout)
153
+
154
+ regscale_data = []
155
+ if module == "assessments":
156
+ from regscale.models.regscale_models.assessment import Assessment
157
+
158
+ all_assessments = Assessment().fetch_all_assessments(api.app)
159
+ regscale_data = [assessment.dict() for assessment in all_assessments]
160
+ elif module == "issues":
161
+ from regscale.models.regscale_models.issue import Issue
162
+
163
+ all_issues = Issue().fetch_all_issues(api.app)
164
+ regscale_data = [issue.dict() for issue in all_issues]
165
+ elif module == "risks":
166
+ from regscale.models.regscale_models.risk import Risk
167
+
168
+ all_risks = Risk().fetch_all_risks(api.app)
169
+ regscale_data = [risk.dict() for risk in all_risks]
170
+ else:
171
+ logger.warning(
172
+ "%s is not a valid module.\nPlease provide a valid module: issues, assessments, or risks.",
173
+ module,
174
+ )
175
+ return regscale_data
176
+
177
+
178
+ def format_control(control: str) -> str:
179
+ """Convert a verbose control id to a regscale friendly control id,
180
+ e.g. AC-2 (1) becomes ac-2.1
181
+ AC-2(1) becomes ac-2.1
182
+
183
+ :param str control: Verbose Control
184
+ :return: RegScale friendly control
185
+ :rtype: str
186
+ """
187
+ # Define a regular expression pattern to match the parts of the string
188
+ pattern = r"^([A-Z]{2})-(\d+)\s?\((\d+)\)$"
189
+
190
+ # Use re.sub() to replace the matched parts of the string with the desired format
191
+ new_string = re.sub(pattern, r"\1-\2.\3", control)
192
+
193
+ return new_string.lower() # Output: ac-2.1
194
+
195
+
196
+ def get_user(_: Api, user_id: str) -> dict:
197
+ """
198
+ Function to get the provided user_id from RegScale via API
199
+
200
+ :param Api _: API Object
201
+ :param str user_id: the RegScale user's GUID
202
+ :return: Dictionary containing the user's information
203
+ :rtype: dict
204
+ """
205
+ warnings.warn(
206
+ "This function is deprecated and will be removed in a future release. Use User.get_user_by_id() instead.",
207
+ DeprecationWarning,
208
+ stacklevel=2,
209
+ )
210
+ from regscale.models import User
211
+
212
+ user = User.get_user_by_id(user_id)
213
+ return user.dict()
214
+
215
+
216
+ def get_threats(_: Api) -> list[dict]:
217
+ """
218
+ Function to get all threats from RegScale via GraphQL
219
+
220
+ :param Api _: API Object
221
+ :return: List containing threat descriptions
222
+ :rtype: list[dict]
223
+ """
224
+ warnings.warn(
225
+ "This function is deprecated and will be removed in a future release. Use Threat.fetch_all_threats() instead.",
226
+ DeprecationWarning,
227
+ stacklevel=2,
228
+ )
229
+ from regscale.models import Threat
230
+
231
+ threats = Threat.fetch_all_threats()
232
+ return [threat.dict() for threat in threats] or []
233
+
234
+
235
+ def create_new_data_submodule(
236
+ parent_id: int, parent_module: str, file_path: str, raw_data: dict = None, is_file: bool = True
237
+ ) -> Optional[dict]:
238
+ """
239
+ Function to create a new data record in the data submodule in RegScale
240
+
241
+ :param int parent_id: RegScale parent ID to associate the data record
242
+ :param str parent_module: RegScale parent module to associate the data record
243
+ :param str file_path: Path to the file to read and upload
244
+ :param dict raw_data: Raw data to upload, defaults to None
245
+ :param bool is_file: Boolean to indicate if the file is a file or a directory, defaults to True
246
+ :return: dictionary of the posted data or None if the API call was unsuccessful
247
+ :rtype: Optional[dict]
248
+ """
249
+ if is_file:
250
+ # check if the file exists
251
+ if not os.path.isfile(file_path):
252
+ error_and_exit(f"Unable to upload file because the file does not exist: {file_path}")
253
+
254
+ with open(file_path, "r", encoding="utf-8") as in_file:
255
+ raw_data = in_file.read()
256
+ data_source = get_file_name(file_path)
257
+ data_type = get_file_type(file_path)[1:].upper()
258
+ else:
259
+ data_source = raw_data["source"] if "source" in raw_data else ""
260
+ data_type = raw_data["type"] if "type" in raw_data else "JSON"
261
+
262
+ new_data = Data(
263
+ dataSource=data_source,
264
+ dataType=data_type,
265
+ rawData=raw_data,
266
+ parentId=parent_id,
267
+ parentModule=parent_module,
268
+ )
269
+ if isinstance(raw_data, dict):
270
+ # Create a string
271
+ new_data.rawData = json.dumps(raw_data)
272
+ # post the data to RegScale
273
+ if new_data.create():
274
+ return new_data.dict()
275
+ return None
276
+
277
+
278
+ def create_properties(
279
+ _: Api,
280
+ data: dict,
281
+ parent_id: int,
282
+ parent_module: str,
283
+ __: Optional[int] = 3,
284
+ label: Optional[str] = None,
285
+ ) -> bool:
286
+ """
287
+ Create a list of properties and upload them to RegScale for the provided asset
288
+
289
+ :param Api _: API Object to post the data in RegScale
290
+ :param dict data: Dictionary of data to parse and create properties from
291
+ :param int parent_id: ID to create properties for
292
+ :param str parent_module: Parent module to create properties for
293
+ :param Optional[int] __: Number of times to retry the API call if it fails, defaults to 3
294
+ :param Optional[str] label: Label to use for the properties, defaults to None
295
+ :return: If batch update was successful
296
+ :rtype: bool
297
+ """
298
+ from regscale.models import Property
299
+
300
+ warnings.warn(
301
+ "This function is deprecated and will be removed in a future release. Use Property.batch_create() instead.",
302
+ DeprecationWarning,
303
+ stacklevel=2,
304
+ )
305
+ properties: list = []
306
+ for key, value in data.items():
307
+ # evaluate the value and convert it to a string
308
+ value = convert_to_string(value)
309
+ prop = Property(
310
+ key=key,
311
+ value=value or "NULL",
312
+ label=label or None,
313
+ parentId=parent_id,
314
+ parentModule=parent_module,
315
+ )
316
+ properties.append(prop)
317
+
318
+ new_props = Property.batch_create(properties)
319
+ return len(new_props) > 0
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """A class for generating simple CLI reports"""
4
+ import csv
5
+ from typing import List, TypeVar
6
+
7
+ import rich.errors
8
+ from pathlib import Path
9
+ from rich.console import Console
10
+ from rich.table import Table
11
+
12
+ from regscale.core.app.api import Api
13
+ from regscale.core.app.utils.app_utils import error_and_exit, get_current_datetime, check_file_path
14
+ from regscale.models.regscale_models.file import File
15
+
16
+ T = TypeVar("T")
17
+
18
+
19
+ class ReportGenerator:
20
+ """
21
+ A class for generating simple CLI reports
22
+ """
23
+
24
+ def __init__(self, objects: List[T], to_file: bool = False, report_name: str = "", **kwargs):
25
+ self.console = Console()
26
+ self.objects = objects
27
+ self.to_file = to_file
28
+ self.report_name = report_name
29
+ self.regscale_id = kwargs.get("regscale_id")
30
+ self.regscale_module = kwargs.get("regscale_module")
31
+ reportable_attrs = []
32
+ if objects:
33
+ # Basic attributes for a generic report
34
+ reportable_attrs = [
35
+ "id",
36
+ "dateCreated",
37
+ "lastUpdatedById",
38
+ "dateLastUpdated",
39
+ "name",
40
+ "title",
41
+ "description",
42
+ "created_at",
43
+ "updated_at",
44
+ "parent_id",
45
+ "parent_module",
46
+ "status",
47
+ ]
48
+ self.attributes = reportable_attrs
49
+ self.generate_report()
50
+
51
+ def report_data(self):
52
+ """
53
+ Return the data for the report
54
+ """
55
+ return self.objects
56
+
57
+ def generate_report(self):
58
+ """
59
+ Generate a report for the objects in the list
60
+ """
61
+ if not self.objects:
62
+ return
63
+ report_data = []
64
+ class_name = self.objects[0].__class__.__name__
65
+ report_name = f"{class_name} Report" if not self.report_name else self.report_name
66
+ table = Table(title=report_name)
67
+ valid_attr = []
68
+ for attribute in self.attributes:
69
+ try:
70
+ if getattr(self.objects[0], attribute):
71
+ table.add_column(attribute)
72
+ valid_attr.append(attribute)
73
+ except rich.errors.NotRenderableError:
74
+ self.console.print(f"[bold red]Attribute {attribute} is not renderable[/bold red]")
75
+ except AttributeError:
76
+ pass
77
+ for obj in self.objects:
78
+ row = []
79
+ for attr in valid_attr:
80
+ row.append(str(getattr(obj, attr)))
81
+ table.add_row(*row)
82
+ report_data.append(",".join(row))
83
+ if self.to_file:
84
+ self.save_report(report_name, valid_attr, report_data)
85
+ else:
86
+ self.console.print(table)
87
+
88
+ def save_report(self, report_name: str, valid_attr: list, report_data: list):
89
+ """
90
+ Save the report to a file
91
+
92
+ :param str report_name: The name of the report
93
+ :param list valid_attr: The valid attributes for the report
94
+ :param list report_data: The data for the report
95
+ """
96
+ try:
97
+ posix_name = report_name.lower() + "_" + get_current_datetime()
98
+ file_name = (f"{posix_name}.csv").lower().replace(" ", "_").replace(":", "_")
99
+ file_path = Path("./artifacts") / file_name
100
+ check_file_path("artifacts", False)
101
+ with open(file_path, "w", newline="", encoding="utf-8") as file:
102
+ writer = csv.writer(file)
103
+ writer.writerow(valid_attr)
104
+ for row in report_data:
105
+ # write a comma delimited row to csv
106
+ writer.writerow(row.split(","))
107
+ except IOError as e:
108
+ error_and_exit(f"An error occurred while opening the file: {str(e)}")
109
+ except csv.Error as e:
110
+ error_and_exit(f"An error occurred while writing to the file: {str(e)}")
111
+
112
+ if self.regscale_id and self.regscale_module:
113
+ api = Api()
114
+ File.upload_file_to_regscale(
115
+ file_name=file_path.absolute(),
116
+ parent_id=self.regscale_id,
117
+ parent_module=self.regscale_module,
118
+ api=api,
119
+ )