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,95 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ RegScale STIG Integration
5
+ """
6
+
7
+ import click
8
+
9
+ from regscale.integrations.commercial.stigv2.stig_integration import StigIntegration
10
+
11
+
12
+ @click.group(name="stigv2")
13
+ def stigv2():
14
+ """STIG Integrations"""
15
+
16
+
17
+ @stigv2.command(name="sync_findings")
18
+ @click.option(
19
+ "-p",
20
+ "--regscale_ssp_id",
21
+ type=click.INT,
22
+ help="The ID number from RegScale of the System Security Plan",
23
+ prompt="Enter RegScale System Security Plan ID",
24
+ required=True,
25
+ )
26
+ @click.option(
27
+ "-d",
28
+ "--stig_directory",
29
+ type=click.Path(),
30
+ help="The directory where STIG files are located",
31
+ prompt="Enter STIG directory",
32
+ required=True,
33
+ )
34
+ def sync_findings(regscale_ssp_id, stig_directory):
35
+ """Sync GCP Findings to RegScale."""
36
+ StigIntegration.sync_findings(plan_id=regscale_ssp_id, path=stig_directory)
37
+
38
+
39
+ @stigv2.command(name="sync_assets")
40
+ @click.option(
41
+ "-p",
42
+ "--regscale_ssp_id",
43
+ type=click.INT,
44
+ help="The ID number from RegScale of the System Security Plan",
45
+ prompt="Enter RegScale System Security Plan ID",
46
+ required=True,
47
+ )
48
+ @click.option(
49
+ "-d",
50
+ "--stig_directory",
51
+ type=click.Path(),
52
+ help="The directory where STIG files are located",
53
+ prompt="Enter STIG directory",
54
+ required=True,
55
+ )
56
+ def sync_assets(regscale_ssp_id, stig_directory):
57
+ """Sync GCP Assets to RegScale."""
58
+ StigIntegration.sync_assets(plan_id=regscale_ssp_id, path=stig_directory)
59
+
60
+
61
+ @stigv2.command(name="process_checklist")
62
+ @click.option(
63
+ "-p",
64
+ "--regscale_ssp_id",
65
+ type=click.INT,
66
+ help="The ID number from RegScale of the System Security Plan",
67
+ prompt="Enter RegScale System Security Plan ID",
68
+ required=True,
69
+ )
70
+ @click.option(
71
+ "-d",
72
+ "--stig_directory",
73
+ type=click.Path(),
74
+ help="The directory where STIG files are located",
75
+ prompt="Enter STIG directory",
76
+ required=True,
77
+ )
78
+ def process_checklist(regscale_ssp_id, stig_directory):
79
+ """Process GCP Checklist."""
80
+ StigIntegration.sync_assets(plan_id=regscale_ssp_id, path=stig_directory)
81
+ StigIntegration.sync_findings(plan_id=regscale_ssp_id, path=stig_directory)
82
+
83
+
84
+ @stigv2.command(name="cci_assessment")
85
+ @click.option(
86
+ "-p",
87
+ "--regscale_ssp_id",
88
+ type=click.INT,
89
+ help="The ID number from RegScale of the System Security Plan",
90
+ prompt="Enter RegScale System Security Plan ID",
91
+ required=True,
92
+ )
93
+ def cci_assessment(regscale_ssp_id):
94
+ """Run CCI Assessment."""
95
+ StigIntegration.cci_assessment(plan_id=regscale_ssp_id)
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ RegScale STIG Integration
5
+ """
6
+ import datetime
7
+ from typing import Iterator, Optional, Generator
8
+
9
+ from pathlib import Path
10
+
11
+ from regscale.core.utils.date import date_str, days_from_today
12
+ from regscale.integrations.commercial.stigv2.ckl_parser import (
13
+ parse_checklist,
14
+ find_stig_files,
15
+ Checklist,
16
+ Vuln,
17
+ STIG,
18
+ )
19
+ from regscale.integrations.scanner_integration import (
20
+ logger,
21
+ ScannerIntegration,
22
+ ScannerIntegrationType,
23
+ )
24
+ from regscale.models import regscale_models
25
+
26
+
27
+ class StigIntegration(ScannerIntegration):
28
+ options_map_assets_to_components = True
29
+
30
+ title = "STIG Integration"
31
+ asset_identifier_field = "fqdn"
32
+ type = ScannerIntegrationType.CHECKLIST
33
+ checklist_status_map = {
34
+ "NotAFinding": regscale_models.ChecklistStatus.PASS,
35
+ "Open": regscale_models.ChecklistStatus.FAIL,
36
+ }
37
+ finding_severity_map = {
38
+ "critical": regscale_models.IssueSeverity.Critical,
39
+ "high": regscale_models.IssueSeverity.High,
40
+ "medium": regscale_models.IssueSeverity.Moderate,
41
+ "low": regscale_models.IssueSeverity.Low,
42
+ }
43
+
44
+ def fetch_findings(self, path: Path, **kwargs) -> Generator["IntegrationFinding", None, None]: # type: ignore
45
+ """
46
+ Fetches GCP findings using the SecurityCenterClient
47
+
48
+ :param Path path: The path to the STIG files, defaults to None
49
+ :yields IntegrationFinding: An IntegrationFinding object for each finding
50
+ :return: A list of parsed findings
51
+ :rtype: Generator[IntegrationFinding, None, None]
52
+ """
53
+
54
+ logger.info("Fetching findings...")
55
+ stig_files = find_stig_files(path)
56
+
57
+ self.num_findings_to_process = 0
58
+ for stig_file in stig_files:
59
+ logger.info(f"Processing '{stig_file}'")
60
+ checklist = parse_checklist(stig_file)
61
+ logger.info(f"Found {len(checklist.stigs[0].vulns)} Vulnerabilities in '{stig_file}'")
62
+ for stig in checklist.stigs:
63
+ for vuln in stig.vulns:
64
+ for finding in self.process_vulnerabilities(checklist, vuln, stig):
65
+ self.num_findings_to_process += 1
66
+ yield finding
67
+
68
+ def process_vulnerabilities(
69
+ self, checklist: Checklist, vuln: Vuln, stig: STIG
70
+ ) -> Generator["IntegrationFinding", None, None]:
71
+ """
72
+ Processes vulnerabilities for each asset in the checklist.
73
+
74
+ Iterates through each asset in the provided checklist, extracts the asset identifier (host_fqdn),
75
+ and yields an IntegrationFinding for each vulnerability associated with the asset.
76
+
77
+ :param Checklist checklist: The checklist containing assets to process.
78
+ :param Vuln vuln: The vulnerability information to be processed.
79
+ :param STIG stig: The STIG information to be processed.
80
+ :return: An iterator of IntegrationFinding objects.
81
+ :rtype: Generator[IntegrationFinding, None, None]
82
+ :yields: An IntegrationFinding object for each asset in the checklist.
83
+ :ytype: IntegrationFinding
84
+ """
85
+ for asset in checklist.assets:
86
+ asset_identifier = getattr(asset, "host_fqdn", None)
87
+ if not asset_identifier:
88
+ self.log_error(f"Failed to extract host_fqdn from Asset: {asset} and vuln from {vuln}")
89
+ continue
90
+
91
+ yield from self.create_integration_finding(asset_identifier, vuln, stig)
92
+
93
+ def create_integration_finding(
94
+ self, asset_identifier: str, vuln: Vuln, stig: STIG
95
+ ) -> Generator["IntegrationFinding", None, None]:
96
+ """
97
+ Creates an IntegrationFinding object from the provided asset identifier and vulnerability information.
98
+
99
+ :param str asset_identifier: The identifier of the asset associated with the finding.
100
+ :param Vuln vuln: The vulnerability information used to populate the finding.
101
+ :param STIG stig: The STIG information used to populate the finding.
102
+ :return: An iterator of IntegrationFinding objects populated with the provided information.
103
+ :rtype: Generator[IntegrationFinding, None, None]
104
+ :yields: An IntegrationFinding object for each asset in the checklist.
105
+ :ytype: IntegrationFinding
106
+ """
107
+ from regscale.integrations.scanner_integration import IntegrationFinding
108
+
109
+ severity = self.get_finding_severity(vuln.severity)
110
+ due_date_map = {
111
+ regscale_models.IssueSeverity.Critical: date_str(days_from_today(30)),
112
+ regscale_models.IssueSeverity.High: date_str(days_from_today(60)),
113
+ regscale_models.IssueSeverity.Moderate: date_str(days_from_today(210)),
114
+ regscale_models.IssueSeverity.Low: date_str(days_from_today(364)),
115
+ }
116
+ if not vuln.cci_ref:
117
+ vuln.cci_ref = ["CCI-000366"]
118
+
119
+ for cci_ref in vuln.cci_ref:
120
+ yield IntegrationFinding(
121
+ asset_identifier=asset_identifier,
122
+ control_labels=[], # Determine how to populate this
123
+ title=f"{vuln.rule_title} {vuln.rule_ver} {stig.stig_info.releaseinfo} {vuln.vuln_num}",
124
+ issue_title=f"{vuln.rule_title} {vuln.rule_ver} {stig.stig_info.releaseinfo} {vuln.vuln_num}",
125
+ category=vuln.group_title,
126
+ severity=severity,
127
+ description=f"{vuln.check_content} {vuln.vuln_discuss} {vuln.fix_text}",
128
+ status=self.get_finding_status(vuln.status),
129
+ checklist_status=self.get_checklist_status(vuln.status),
130
+ external_id=f"{cci_ref}:{vuln.vuln_num}:{asset_identifier}",
131
+ vulnerability_number=vuln.vuln_num,
132
+ cci_ref=cci_ref,
133
+ rule_id=vuln.rule_id,
134
+ rule_version=vuln.rule_ver,
135
+ results=f"Vulnerability Number: {vuln.vuln_num}, Severity: {vuln.severity}, "
136
+ f"Rule Title: {vuln.rule_title}<br><br>Check Content: {vuln.check_content}<br><br>"
137
+ f"Fix Text: {vuln.fix_text}<br><br>STIG Reference: {vuln.stigref}<br><br>"
138
+ f"Vulnerability Discussion: {vuln.vuln_discuss}",
139
+ recommendation_for_mitigation=vuln.fix_text,
140
+ comments=vuln.comments,
141
+ poam_comments=vuln.finding_details,
142
+ date_created=date_str(datetime.datetime.now()),
143
+ due_date=due_date_map.get(severity, date_str(days_from_today(394))),
144
+ baseline=stig.baseline,
145
+ plugin_name=vuln.rule_id,
146
+ observations=vuln.finding_details or "",
147
+ gaps=vuln.check_content or "",
148
+ evidence=vuln.check_content or "",
149
+ impact=vuln.potential_impact or "",
150
+ )
151
+
152
+ def fetch_assets(self, path: Optional[Path] = None) -> Iterator["IntegrationAsset"]:
153
+ """
154
+ Fetches GCP assets using the AssetServiceClient
155
+
156
+ :param Optional[Path] path: The path to the STIG files, defaults to None
157
+ :raises ValueError: If no path is provided
158
+ :yield: An IntegrationAsset object representing an Assest extracted from a STIG file
159
+ :ytype: IntegrationAsset
160
+ :return: An iterator of parsed assets
161
+ :rtype: Iterator[IntegrationAsset]
162
+ """
163
+ from regscale.integrations.scanner_integration import IntegrationAsset
164
+
165
+ if not path:
166
+ raise ValueError("Path to STIG files is required.")
167
+ logger.info("Fetching assets...")
168
+ stig_files = find_stig_files(path)
169
+
170
+ self.num_assets_to_process = len(stig_files)
171
+
172
+ loading_stig_files = self.asset_progress.add_task(
173
+ f"[#f8b737]Loading {len(stig_files)} STIG files.",
174
+ total=len(stig_files),
175
+ )
176
+ for stig_file in stig_files:
177
+ logger.info(f"Processing '{stig_file}'")
178
+ checklist = parse_checklist(stig_file)
179
+ for stig_asset in checklist.assets:
180
+ component_names = []
181
+ for stig in checklist.stigs:
182
+ component_names.append(stig.component_title)
183
+
184
+ if not stig_asset.host_name and not stig_asset.host_fqdn:
185
+ self.log_error(f"Failed to extract asset from {stig_asset}")
186
+ continue
187
+
188
+ yield IntegrationAsset(
189
+ name=stig_asset.host_name or stig_asset.host_fqdn,
190
+ ip_address=stig_asset.host_ip,
191
+ fqdn=stig_asset.host_fqdn or stig_asset.host_name,
192
+ identifier=stig_asset.host_fqdn,
193
+ asset_type=stig_asset.asset_type,
194
+ asset_owner_id=self.assessor_id,
195
+ parent_id=self.plan_id,
196
+ parent_module=regscale_models.SecurityPlan.get_module_slug(),
197
+ asset_category=regscale_models.AssetCategory.Hardware,
198
+ component_names=component_names,
199
+ # TODO: Determine correct component type
200
+ component_type=regscale_models.ComponentType.Hardware,
201
+ )
202
+ self.asset_progress.update(loading_stig_files, advance=1)
File without changes
@@ -0,0 +1,46 @@
1
+ # flake8: noqa E501
2
+ # pylint: disable=line-too-long
3
+
4
+ """Assets connector commands for the RegScale CLI"""
5
+
6
+ import click
7
+ from regscale.models import regscale_ssp_id
8
+
9
+
10
+ @click.group()
11
+ def assets() -> None:
12
+ """Assets connector commands for the RegScale CLI"""
13
+ pass
14
+
15
+
16
+ @assets.command(name="sync_armis_centrix")
17
+ @regscale_ssp_id()
18
+ def sync_armis_centrix(regscale_ssp_id: int) -> None:
19
+ """Sync Assets from Armis Centrix to RegScale."""
20
+ from regscale.models.integration_models.synqly_models.connectors import Assets
21
+
22
+ assets_armis_centrix = Assets("armis_centrix")
23
+ assets_armis_centrix.run_sync(regscale_ssp_id=regscale_ssp_id)
24
+
25
+
26
+ @assets.command(name="sync_nozomi_vantage")
27
+ @regscale_ssp_id()
28
+ def sync_nozomi_vantage(regscale_ssp_id: int) -> None:
29
+ """Sync Assets from Nozomi Vantage to RegScale."""
30
+ from regscale.models.integration_models.synqly_models.connectors import Assets
31
+
32
+ assets_nozomi_vantage = Assets("nozomi_vantage")
33
+ assets_nozomi_vantage.run_sync(regscale_ssp_id=regscale_ssp_id)
34
+
35
+
36
+ @assets.command(name="sync_servicenow")
37
+ @regscale_ssp_id()
38
+ def sync_servicenow(regscale_ssp_id: int) -> None:
39
+ """Sync Assets from Servicenow to RegScale."""
40
+ from regscale.models.integration_models.synqly_models.connectors import Assets
41
+
42
+ assets_servicenow = Assets("servicenow")
43
+ assets_servicenow.run_sync(regscale_ssp_id=regscale_ssp_id)
44
+
45
+
46
+ # pylint: enable=line-too-long
@@ -0,0 +1,132 @@
1
+ # flake8: noqa E501
2
+ # pylint: disable=line-too-long
3
+
4
+ """Ticketing connector commands for the RegScale CLI"""
5
+
6
+ import click
7
+ from regscale.models import regscale_id, regscale_module
8
+
9
+
10
+ @click.group()
11
+ def ticketing() -> None:
12
+ """Ticketing connector commands for the RegScale CLI"""
13
+ pass
14
+
15
+
16
+ @ticketing.command(name="sync_jira")
17
+ @regscale_id()
18
+ @regscale_module()
19
+ @click.option(
20
+ "--issue_type",
21
+ type=click.STRING,
22
+ help="jira issue type",
23
+ required=True,
24
+ prompt="jira issue type",
25
+ )
26
+ @click.option(
27
+ "--project",
28
+ type=click.STRING,
29
+ help="jira project",
30
+ required=True,
31
+ prompt="jira project",
32
+ )
33
+ @click.option(
34
+ "--default_project",
35
+ type=click.STRING,
36
+ help="Default Project for the integration.",
37
+ required=False,
38
+ )
39
+ @click.option(
40
+ "--sync_attachments",
41
+ type=click.BOOL,
42
+ help="Whether to sync attachments between Jira and RegScale",
43
+ required=False,
44
+ default=True,
45
+ )
46
+ def sync_jira(
47
+ regscale_id: int, regscale_module: str, issue_type: str, project: str, default_project: str, sync_attachments: bool
48
+ ) -> None:
49
+ """Sync Ticketing data between Jira and RegScale."""
50
+ from regscale.models.integration_models.synqly_models.connectors import Ticketing
51
+
52
+ ticketing_jira = Ticketing("jira")
53
+ ticketing_jira.run_sync(
54
+ regscale_id=regscale_id,
55
+ regscale_module=regscale_module,
56
+ issue_type=issue_type,
57
+ project=project,
58
+ default_project=default_project,
59
+ sync_attachments=sync_attachments,
60
+ )
61
+
62
+
63
+ @ticketing.command(name="sync_pagerduty")
64
+ @regscale_id()
65
+ @regscale_module()
66
+ @click.option(
67
+ "--project",
68
+ type=click.STRING,
69
+ help="pagerduty project",
70
+ required=True,
71
+ prompt="pagerduty project",
72
+ )
73
+ @click.option(
74
+ "--name",
75
+ type=click.STRING,
76
+ help="pagerduty name",
77
+ required=True,
78
+ prompt="pagerduty name",
79
+ )
80
+ def sync_pagerduty(regscale_id: int, regscale_module: str, project: str, name: str) -> None:
81
+ """Sync Ticketing data between Pagerduty and RegScale."""
82
+ from regscale.models.integration_models.synqly_models.connectors import Ticketing
83
+
84
+ ticketing_pagerduty = Ticketing("pagerduty")
85
+ ticketing_pagerduty.run_sync(regscale_id=regscale_id, regscale_module=regscale_module, project=project, name=name)
86
+
87
+
88
+ @ticketing.command(name="sync_servicenow")
89
+ @regscale_id()
90
+ @regscale_module()
91
+ @click.option(
92
+ "--issue_type",
93
+ type=click.STRING,
94
+ help="servicenow issue type",
95
+ required=True,
96
+ prompt="servicenow issue type",
97
+ )
98
+ @click.option(
99
+ "--default_project",
100
+ type=click.STRING,
101
+ help="Default Project for the integration. This maps to the custom table for tickets. This table should be derived from Incident table. If not provided, defaults to the incident table.",
102
+ required=False,
103
+ )
104
+ def sync_servicenow(regscale_id: int, regscale_module: str, issue_type: str, default_project: str) -> None:
105
+ """Sync Ticketing data between Servicenow and RegScale."""
106
+ from regscale.models.integration_models.synqly_models.connectors import Ticketing
107
+
108
+ ticketing_servicenow = Ticketing("servicenow")
109
+ ticketing_servicenow.run_sync(
110
+ regscale_id=regscale_id, regscale_module=regscale_module, issue_type=issue_type, default_project=default_project
111
+ )
112
+
113
+
114
+ @ticketing.command(name="sync_torq")
115
+ @regscale_id()
116
+ @regscale_module()
117
+ @click.option(
118
+ "--name",
119
+ type=click.STRING,
120
+ help="torq name",
121
+ required=True,
122
+ prompt="torq name",
123
+ )
124
+ def sync_torq(regscale_id: int, regscale_module: str, name: str) -> None:
125
+ """Sync Ticketing data between Torq and RegScale."""
126
+ from regscale.models.integration_models.synqly_models.connectors import Ticketing
127
+
128
+ ticketing_torq = Ticketing("torq")
129
+ ticketing_torq.run_sync(regscale_id=regscale_id, regscale_module=regscale_module, name=name)
130
+
131
+
132
+ # pylint: enable=line-too-long