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,275 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """RegScale Implementation Option Model"""
4
+ import warnings
5
+ from typing import Optional, List
6
+ from urllib.parse import urljoin
7
+
8
+ import requests
9
+ from pydantic import Field, ConfigDict, model_validator, BaseModel
10
+
11
+ from regscale.core.app.api import Api
12
+ from regscale.core.app.application import Application
13
+ from regscale.core.app.logz import create_logger
14
+ from regscale.core.app.utils.app_utils import get_current_datetime
15
+ from regscale.models.regscale_models.implementation_objective import ImplementationStatus
16
+ from regscale.models.regscale_models.objective import Objective
17
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
18
+ from regscale.models.regscale_models.search import Search
19
+
20
+
21
+ class ImplementationOption(RegScaleModel):
22
+ """RegScale Implementation Option Model"""
23
+
24
+ _module_slug = "implementationOptions"
25
+ _unique_fields = [
26
+ ["securityControlId", "name"],
27
+ ]
28
+ _parent_id_field = "securityControlId"
29
+
30
+ id: int = Field(default=0)
31
+ uuid: str = Field(default="")
32
+ name: str = Field(..., description="Name of the implementation option")
33
+ description: str = Field(..., description="Description of the implementation option")
34
+ acceptability: str = Field(
35
+ ImplementationStatus.NOT_IMPLEMENTED, description="Acceptability status of the implementation option"
36
+ )
37
+ otherId: Optional[str] = Field(default=None, description="An optional other identifier")
38
+ securityControlId: Optional[int] = Field(default=None, description="Foreign Key SecurityControls.id")
39
+ objectiveId: Optional[int] = Field(default=None, description="Foreign Key ControlObjective.id")
40
+ archived: bool = Field(default=False, description="Archival status of the implementation option")
41
+ createdById: Optional[str] = Field(default=None, description="Foreign Key AspNetUsers.id")
42
+ dateCreated: str = Field(
43
+ default_factory=get_current_datetime, description="Creation date of the implementation option"
44
+ )
45
+ lastUpdatedById: Optional[str] = Field(default=None, description="Foreign Key AspNetUsers.id")
46
+ dateLastUpdated: str = Field(
47
+ default_factory=get_current_datetime, description="Last update date of the implementation option"
48
+ )
49
+ tenantsId: Optional[int] = Field(default=None, description="Foreign Key Tenants.id")
50
+ isPublic: bool = Field(default=False, description="Public visibility of the implementation option")
51
+ restricted: bool = Field(default=False, description="Restriction status of the implementation option")
52
+ restrictedSecurityPlanId: Optional[int] = Field(
53
+ default=None, description="Associated restricted security plan ID if any"
54
+ )
55
+ responsibility: Optional[str] = Field(default=None, description="Who is responsible for the implementation option")
56
+
57
+ @staticmethod
58
+ def _get_additional_endpoints() -> ConfigDict:
59
+ """
60
+ Get additional endpoints for the ImplementationOption model.
61
+
62
+ :return: A dictionary of additional endpoints
63
+ :rtype: ConfigDict
64
+ """
65
+ return ConfigDict( # type: ignore
66
+ get_all_by_parent="/api/{model_slug}/getByControl/{intParentID}/{securityPlanId}",
67
+ get_by_control="/api/{model_slug}/getByControl/{intControl}/{securityPlanId}",
68
+ batch_create="/api/{model_slug}/batchCreate",
69
+ )
70
+
71
+ @classmethod
72
+ def get_all_by_parent(
73
+ cls,
74
+ parent_id: int,
75
+ parent_module: Optional[str] = None,
76
+ search: Optional[Search] = None,
77
+ plan_id: Optional[int] = None,
78
+ ) -> List["ImplementationOption"]:
79
+ """
80
+ Get a list of objects by parent.
81
+
82
+ :param int parent_id: The ID of the parent
83
+ :param Optional[str] parent_module: The parent module
84
+ :param Optional[Search] search: The search object
85
+ :param Optional[int] plan_id: The ID of the security plan
86
+ :return: A list of objects
87
+ :rtype: List["ImplementationOption"]
88
+ """
89
+ return cls._handle_list_response(
90
+ cls._get_api_handler().get(
91
+ endpoint=cls.get_endpoint("get_all_by_parent").format(
92
+ intParentID=parent_id,
93
+ securityPlanId=plan_id,
94
+ )
95
+ )
96
+ )
97
+
98
+ @classmethod
99
+ def get_by_control(cls, security_control_id: int, security_plan_id: int) -> list["ImplementationOption"]:
100
+ """
101
+ Get a list of implementation options by control id and security plan id
102
+
103
+ :param int security_control_id: Security Control ID
104
+ :param int security_plan_id: Security Plan ID
105
+ :return: A list of Implementation Options as a dictionary from RegScale via API
106
+ :rtype: list[ImplementationOption]
107
+ """
108
+ return cls._handle_list_response(
109
+ cls._get_api_handler().get(
110
+ endpoint=cls.get_endpoint("get_by_control").format(
111
+ intControl=security_control_id, securityPlanId=security_plan_id
112
+ ),
113
+ )
114
+ )
115
+
116
+
117
+ class ImplementationOptionDeprecated(BaseModel, Objective):
118
+ """RegScale Implementation Option"""
119
+
120
+ _module_slug = "implementationoptions"
121
+
122
+ id: int = 0
123
+ uuid: str = ""
124
+ name: str # Required
125
+ description: str # Required
126
+ status: Optional[str] = None
127
+ acceptability: Optional[str] = (
128
+ None # Required for create but not returned on get by control ??? api is inconsistent
129
+ )
130
+ otherId: Optional[str] = None
131
+ securityControlId: Optional[int] = None
132
+ objectiveId: Optional[int] = None
133
+ restricted: bool = False
134
+ restrictedSecurityPlanId: Optional[int] = None
135
+ createdById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
136
+ lastUpdatedById: Optional[str] = Field(default_factory=RegScaleModel.get_user_id)
137
+ dateCreated: str = Field(default_factory=get_current_datetime)
138
+ dateLastUpdated: str = Field(default_factory=get_current_datetime)
139
+ archived: bool = False
140
+ isPublic: bool = True
141
+
142
+ def __getitem__(
143
+ self, other: "ImplementationOptionDeprecated"
144
+ ) -> str: # this allows getting an element (overrided method)
145
+ return self.name and self.description and self.objectiveId and self.securityControlId
146
+
147
+ @model_validator(mode="after")
148
+ def correct_control_id(self):
149
+ """
150
+ Correct the acceptability value for the implementation option as it is not returned
151
+ by the API on get by control but is return in field status which is not a valid field for the model
152
+ """
153
+ if self.acceptability is None and self.status is not None:
154
+ self.acceptability = self.status
155
+
156
+ @staticmethod
157
+ def _get_additional_endpoints() -> ConfigDict:
158
+ """
159
+ Get additional endpoints for the ImplementationOptions model, using {model_slug} as a placeholder for the model slug.
160
+
161
+ :return: A dictionary of additional endpoints
162
+ :rtype: ConfigDict
163
+ """
164
+ return ConfigDict( # type: ignore
165
+ get_by_control="/api/{model_slug}/getByControl/{intControl}/{securityPlanId}",
166
+ batch_create="/api/{model_slug}/batchCreate",
167
+ )
168
+
169
+ def __eq__(self, other: "ImplementationOptionDeprecated") -> bool:
170
+ """
171
+ Check if two ImplementationOption objects are equal
172
+
173
+ :param ImplementationOptionDeprecated other: ImplementationOption object to compare
174
+ :return: True if equal, False if not
175
+ :rtype: bool
176
+ """
177
+ return (
178
+ self.name == other.name
179
+ and self.description == other.description
180
+ and self.objectiveId == other.objectiveId
181
+ and self.securityControlId == other.securityControlId
182
+ )
183
+
184
+ def __hash__(self) -> hash:
185
+ """
186
+ Hash a ImplementationOption object
187
+
188
+ :return: Hashed ImplementationOption object
189
+ :rtype: hash
190
+ """
191
+ return hash((self.name, self.description, self.objectiveId, self.securityControlId))
192
+
193
+ @classmethod
194
+ def get_by_control(cls, security_control_id: int, security_plan_id: int) -> list["ImplementationOption"]:
195
+ """
196
+ Get a list of implementation options by control id and security plan id
197
+
198
+ :param int security_control_id: Security Control ID
199
+ :param int security_plan_id: Security Plan ID
200
+ :return: A list of Implementation Options as a dictionary from RegScale via API
201
+ :rtype: list[ImplementationOption]
202
+ """
203
+ return cls._handle_list_response(
204
+ cls._get_api_handler().get(
205
+ endpoint=cls.get_endpoint("get_by_control").format(
206
+ intControl=security_control_id, securityPlanId=security_plan_id
207
+ ),
208
+ )
209
+ )
210
+
211
+ @staticmethod
212
+ def fetch_implementation_options(app: Application, control_id: int) -> list["ImplementationOptionDeprecated"]:
213
+ """
214
+ Fetch list of implementation objectives by control id
215
+
216
+ :param Application app: Application Instance
217
+ :param int control_id: Security Control ID
218
+ :return: A list of Implementation Objectives as a dictionary from RegScale via API
219
+ :rtype: list[ImplementationOptionDeprecated]
220
+ """
221
+ warnings.warn(
222
+ "The 'fetch_implemetation_options method is deprecated, use 'get_by_control' method instead",
223
+ DeprecationWarning,
224
+ )
225
+ results = []
226
+ logger = create_logger()
227
+ api = Api()
228
+ res = api.get(url=app.config["domain"] + f"/api/implementationoptions/getByControl/{control_id}")
229
+ if res.ok:
230
+ try:
231
+ results = [ImplementationOptionDeprecated(**opt) for opt in res.json()]
232
+ except requests.RequestException.JSONDecodeError:
233
+ logger.warning("Unable to find control implementation objectives.")
234
+ return results
235
+
236
+ def insert(self, api: Api) -> requests.Response:
237
+ """
238
+ Insert implementation option into RegScale
239
+
240
+ :param Api api: The API instance
241
+ :return: API Response
242
+ :rtype: requests.Response
243
+ """
244
+ warnings.warn(
245
+ "The 'insert_parameter' method is deprecated, use 'create' method instead",
246
+ DeprecationWarning,
247
+ )
248
+ response = api.post(
249
+ url=urljoin(api.config["domain"], "/api/implementationOptions"),
250
+ json=self.dict(),
251
+ )
252
+ api.logger.debug(
253
+ "ImplementationOption insertion Response: %s=%s",
254
+ response.status_code,
255
+ response.text,
256
+ )
257
+ if response.status_code == 400 and "Duplicate" in response.text:
258
+ # rev 5 contains multiple parts for each control with implemention options
259
+ # there will be duplicates (which is ok)
260
+ # do not log a message.
261
+ return response
262
+ if response.status_code == 422 and "Duplicate" in response.text:
263
+ # rev 5 contains multiple parts for each control with implemention options
264
+ # there will be duplicates (which is ok)
265
+ # do not log a message.
266
+ return response
267
+
268
+ if not response.ok or response.status_code != 200:
269
+ api.logger.error(
270
+ "Unable to insert Implementation Option into RegScale.\n%s:%s %s",
271
+ response.status_code,
272
+ response.reason,
273
+ response.text,
274
+ )
275
+ return response
@@ -0,0 +1,33 @@
1
+ import logging
2
+ from typing import Optional
3
+
4
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
5
+
6
+ logger = logging.getLogger("regscale")
7
+
8
+
9
+ class ImplementationRole(RegScaleModel):
10
+ """Class for a RegScale SystemRoles"""
11
+
12
+ _module_slug = "implementingRoles"
13
+
14
+ id: Optional[int] = None
15
+ uuid: Optional[str] = None
16
+ parentId: int # Required Field
17
+ parentModule: str # Required Field
18
+ roleId: int # Required Field
19
+ isPublic: bool = True
20
+
21
+ @staticmethod
22
+ def add_role(role_id: int, control_implementation_id: int, parent_module: str) -> "ImplementationRole":
23
+ """
24
+ Add a role to a control implementation
25
+
26
+ :param int role_id: The ID of the role to add
27
+ :param int control_implementation_id: The ID of the control implementation to add the role to
28
+ :param str parent_module: The parent module of the role
29
+ :return: The new role
30
+ :rtype: ImplementationRole
31
+ """
32
+ role = ImplementationRole(roleId=role_id, parentId=control_implementation_id, parentModule=parent_module)
33
+ return role.create()
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """RegScale Incident Model"""
4
+
5
+ from typing import Optional, Any
6
+
7
+ import requests
8
+ from pydantic import ConfigDict, field_validator
9
+
10
+ from regscale.core.app.api import Api
11
+ from regscale.core.app.application import Application
12
+ from regscale.core.app.utils.app_utils import camel_case, snake_case
13
+ from .regscale_model import RegScaleModel
14
+
15
+
16
+ class Incident(RegScaleModel):
17
+ """RegScale Incident
18
+
19
+ :raises ValueError: Validation Error
20
+ :return: RegScale Incident
21
+ """
22
+
23
+ _module_slug = "incidents"
24
+
25
+ category: str # Required
26
+ detectionMethod: str # Required
27
+ dateDetected: str # Required
28
+ phase: str # Required
29
+ title: str # Required
30
+ incidentPOCId: str # Required
31
+ id: int = 0
32
+ attackVector: Optional[str] = None
33
+ compromiseDate: Optional[str] = None
34
+ cost: float = 0
35
+ dateResolved: Optional[str] = None
36
+ description: Optional[str] = None
37
+ ioc: Optional[str] = None
38
+ impact: Optional[str] = None
39
+ parentId: Optional[int] = None
40
+ responseActions: Optional[str] = None
41
+ sourceCause: Optional[str] = None
42
+ createdById: Optional[str] = None
43
+ dateCreated: Optional[str] = None
44
+ dateLastUpdated: Optional[str] = None
45
+ lastUpdatedById: Optional[str] = None
46
+ parentModule: Optional[str] = None
47
+ tenantsId: Optional[int] = None
48
+ facilityId: Optional[int] = None
49
+ # post_incident: Optional[str]
50
+ uuid: Optional[str] = None
51
+ isPublic: bool = True
52
+ orgId: Optional[int] = None
53
+ containmentSteps: Optional[str] = None
54
+ eradicationSteps: Optional[str] = None
55
+ recoverySteps: Optional[str] = None
56
+ severity: Optional[str] = None
57
+
58
+ @staticmethod
59
+ def _get_additional_endpoints() -> ConfigDict:
60
+ """
61
+ Get additional endpoints for the Incidents model.
62
+
63
+ :return: A dictionary of additional endpoints
64
+ :rtype: ConfigDict
65
+ """
66
+ return ConfigDict(
67
+ get_count="/api/{model_slug}/getCount",
68
+ get_all_by_parent="/api/{model_slug}/getAllByParent/{intParentID}/{strModule}",
69
+ get_filtered_list="/api/{model_slug}/getFilteredList/{strFind}",
70
+ graph="/api/{model_slug}/graph",
71
+ graph_by_date="/api/{model_slug}/graphByDate/{strGroupBy}/{year}",
72
+ main_dashboard="/api/{model_slug}/mainDashboard/{intYear}",
73
+ main_dashboard_chart="/api/{model_slug}/mainDashboardChart/{year}",
74
+ filter_incidents="/api/{model_slug}/filterIncidents",
75
+ query_by_custom_field="/api/{model_slug}/queryByCustomField/{strFieldName}/{strValue}",
76
+ report="/api/{model_slug}/report/{strReport}",
77
+ schedule="/api/{model_slug}/schedule/{year}/{dvar}",
78
+ graph_due_date="/api/{model_slug}/graphDueDate/{year}",
79
+ dashboard="/api/{model_slug}/dashboard/{strGroupBy}",
80
+ dashboard_by_parent="/api/{model_slug}/dashboardByParent/{strGroupBy}/{intId}/{strModule}",
81
+ )
82
+
83
+ @classmethod
84
+ @field_validator("category")
85
+ def check_category(cls, value: Any) -> str:
86
+ """
87
+ Validate Category
88
+
89
+ :param Any value: An incident category
90
+ :raises ValueError: Validation Error if category is not in list
91
+ :return: An incident category
92
+ :rtype: str
93
+ """
94
+ categories = [
95
+ "CAT 0 - Exercise/Network Defense Testing",
96
+ "CAT 1 - Unauthorized Access",
97
+ "CAT 2 - Denial of Service (DoS)",
98
+ "CAT 3 - Malicious Code",
99
+ "CAT 4 - Improper Usage",
100
+ "CAT 5 - Scans/Probes/Attempted Access",
101
+ "CAT 6 - Investigation",
102
+ ]
103
+ if value not in categories:
104
+ cats = "\n".join(categories)
105
+ raise ValueError(f"Category must be one of the following:\n{cats}")
106
+ return value
107
+
108
+ @classmethod
109
+ @field_validator("phase")
110
+ def check_phases(cls, value: str) -> str:
111
+ """Validate Phases
112
+
113
+ :raises ValueError: Validation Error for Incident Phase
114
+ :param str value: An incident phase
115
+ :return: An incident phase
116
+ :rtype: str
117
+ """
118
+ phases = [
119
+ "Analysis",
120
+ "Closed",
121
+ "Containment",
122
+ "Detection",
123
+ "Eradication",
124
+ "Recovery",
125
+ ]
126
+ if value not in phases:
127
+ phas = "\n".join(phases)
128
+ raise ValueError(f"Phase must be one of the following:\n{phas}")
129
+ return value
130
+
131
+ @staticmethod
132
+ def post_incident(incident: "Incident") -> requests.Response:
133
+ """
134
+ Post Incident to RegScale via API
135
+
136
+ :param Incident incident: An instance of Incident
137
+ :return: Response object from API post to RegScale
138
+ :rtype: requests.Response
139
+ """
140
+ app = Application()
141
+ config = app.config
142
+ api = Api()
143
+ url = config["domain"] + "/api/incidents"
144
+ incident.id = 0 # ID must be 0 for POST
145
+ incident_d = incident.dict()
146
+ response = api.post(url=url, json=incident_d)
147
+ return response
148
+
149
+ @staticmethod
150
+ def get_incident(incident_id: int) -> "Incident":
151
+ """
152
+ Get Incident from RegScale with provided ID
153
+
154
+ :param int incident_id: An Incident ID
155
+ :return: RegScale incident object
156
+ :rtype: Incident
157
+ """
158
+ app = Application()
159
+ config = app.config
160
+ api = Api()
161
+ url = config["domain"] + "/api/incidents/" + str(incident_id)
162
+ response = api.get(url=url)
163
+ dat = response.json()
164
+ convert = {
165
+ snake_case(camel_case(key)).lower().replace("pocid", "poc_id"): value for (key, value) in dat.items()
166
+ }
167
+ return Incident(**convert)
168
+
169
+ def to_dict(self) -> dict:
170
+ """
171
+ Convert Incident object RegScale friendly dict, used in flask_api application
172
+
173
+ :return: RegScale friendly dict for posting to API
174
+ :rtype: dict
175
+ """
176
+ dat = self.dict()
177
+ return {camel_case(key): value for (key, value) in dat.items()}
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for Interconnect in the application"""
4
+
5
+ from typing import Optional
6
+
7
+ from regscale.models.regscale_models.regscale_model import RegScaleModel
8
+
9
+
10
+ class InterConnection(RegScaleModel):
11
+ """RegScale Interconnects model"""
12
+
13
+ _module_slug = "interconnections"
14
+
15
+ id: int = 0
16
+ authorizationType: str
17
+ categorization: str
18
+ connectionType: str
19
+ name: str
20
+ organization: str
21
+ status: str
22
+ aOId: str
23
+ interconnectOwnerId: str
24
+ parentId: int = 0
25
+ parentModule: Optional[str] = None
26
+ isPublic: bool = True
27
+ agreementDate: Optional[str] = None
28
+ expirationDate: Optional[str] = None
29
+ description: Optional[str] = None
30
+ createdById: Optional[str] = None
31
+ dateCreated: Optional[str] = None
32
+ dateLastUpdated: Optional[str] = None
33
+ lastUpdatedById: Optional[str] = None
34
+ tenantsId: Optional[int] = None
35
+ uuid: Optional[str] = None
36
+ dataDirection: Optional[str] = None
37
+ externalEmail: Optional[str] = None
38
+ externalFQDN: Optional[str] = None
39
+ externalIpAddress: Optional[str] = None
40
+ externalPOC: Optional[str] = None
41
+ externalPhone: Optional[str] = None
42
+ sourceFQDN: Optional[str] = None
43
+ sourceIpAddress: Optional[str] = None