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,513 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Dataclasses for a Tenable integration"""
4
+
5
+ import re
6
+
7
+ # standard python imports
8
+ from datetime import datetime
9
+ from enum import Enum
10
+ from typing import Any, List, Optional, Tuple, Union
11
+
12
+ from pydantic import BaseModel
13
+
14
+ from regscale.core.app.application import Application
15
+ from regscale.core.app.utils.app_utils import format_data_to_html
16
+ from regscale.integrations.scanner_integration import IntegrationAsset
17
+ from regscale.models.regscale_models.asset import Asset
18
+
19
+
20
+ class Family(BaseModel):
21
+ """Family Model
22
+
23
+ :param BaseModel: Base Model
24
+ """
25
+
26
+ id: str
27
+ name: str
28
+ type: str
29
+
30
+ @classmethod
31
+ def from_dict(cls, obj: Any) -> "Family":
32
+ """Dict to Family
33
+
34
+ :param Any obj: Family object to convert
35
+ :return: Family object
36
+ :rtype: Family
37
+ """
38
+ return cls(**obj)
39
+
40
+
41
+ class Repository(BaseModel):
42
+ """Repository Model
43
+
44
+ :param BaseModel: Base Model
45
+ """
46
+
47
+ id: str
48
+ name: str
49
+ description: str
50
+ dataFormat: str
51
+
52
+ @classmethod
53
+ def from_dict(cls, obj: Any) -> "Repository":
54
+ """Dict to Repository
55
+
56
+ :param Any obj: Repository object as a dictionary
57
+ :return: Repository object
58
+ :rtype: Repository
59
+ """
60
+ return cls(**obj)
61
+
62
+
63
+ class Severity(BaseModel):
64
+ """Severity Model
65
+
66
+ :param BaseModel: Base Model
67
+ """
68
+
69
+ id: str
70
+ name: str
71
+ description: str
72
+
73
+ @classmethod
74
+ def from_dict(cls, obj: Any) -> "Severity":
75
+ """Dict to Severity
76
+
77
+ :param Any obj: Severity object as a dictionary
78
+ :return: Severity object
79
+ :rtype: Severity
80
+ """
81
+ return cls(**obj)
82
+
83
+
84
+ class TenableIOAsset(BaseModel):
85
+ """Tenable Asset Model from Tenable IO API
86
+
87
+ :param BaseModel: Pydantic BaseModel
88
+ """
89
+
90
+ id: str
91
+ has_agent: bool = False
92
+ last_seen: str
93
+ last_scan_target: Optional[str] = None
94
+ sources: Optional[List[dict]] = []
95
+ acr_score: Optional[int] = None
96
+ acr_drivers: Optional[List[dict]] = None
97
+ exposure_score: Optional[int] = None
98
+ scan_frequency: Optional[List[dict]] = None
99
+ ipv4s: Optional[List[str]] = None
100
+ ipv6s: Optional[List[str]] = None
101
+ fqdns: Optional[List[str]] = None
102
+ installed_software: Optional[List[str]] = None
103
+ mac_addresses: Optional[List[str]] = None
104
+ netbios_names: Optional[List[str]] = None
105
+ operating_systems: Optional[List[str]] = None
106
+ hostnames: Optional[List[str]] = None
107
+ agent_names: Optional[List[str]] = None
108
+ aws_ec2_name: Optional[List[str]] = None
109
+ security_protection_level: Optional[int] = None
110
+ security_protections: Optional[Union[List[str], List[dict]]] = None
111
+ exposure_confidence_value: Optional[Union[str, int]] = None
112
+ terminated_at: Optional[str] = None
113
+ updated_at: Optional[str] = None
114
+ deleted_at: Optional[str] = None
115
+
116
+ @staticmethod
117
+ def get_asset_name(asset: "TenableIOAsset") -> str:
118
+ """Returns the name of an asset
119
+
120
+ :param TenableIOAsset asset: Tenable IO Asset Object
121
+ :return: Asset Name
122
+ :rtype: str
123
+ """
124
+ if asset.netbios_names:
125
+ return asset.netbios_names.pop()
126
+ if asset.hostnames:
127
+ return asset.hostnames.pop()
128
+ if asset.ipv4s:
129
+ return asset.ipv4s.pop()
130
+ if asset.last_scan_target:
131
+ return asset.last_scan_target
132
+ return asset.id
133
+
134
+ @staticmethod
135
+ def get_asset_ip(asset: "TenableIOAsset") -> Optional[str]:
136
+ """Returns the IP address of an asset
137
+
138
+ :param TenableIOAsset asset: Tenable IO Asset Object
139
+ :return: Asset IP
140
+ :rtype: Optional[str]
141
+ """
142
+ if asset.ipv4s:
143
+ return asset.ipv4s.pop()
144
+ if asset.last_scan_target:
145
+ return asset.last_scan_target
146
+ return None
147
+
148
+ @staticmethod
149
+ def get_os_type(os_list: List[str]) -> Optional[str]:
150
+ """Returns the operating system type of an asset.
151
+
152
+ :param List[str] os_list: A list of operating systems associated with the asset.
153
+ :return: The operating system type of the asset, or None if os_list is empty.
154
+ :rtype: Optional[str]
155
+ """
156
+ if os_list:
157
+ for os_name in os_list:
158
+ if "windows" in os_name.lower():
159
+ return "Windows Server"
160
+ if "linux" in os_name.lower():
161
+ return "Linux"
162
+ if "android" in os_name.lower():
163
+ return "Android"
164
+ return "Other"
165
+ return None
166
+
167
+ @staticmethod
168
+ def create_asset_from_tenable(asset: "TenableIOAsset", ssp_id: int, app: Application) -> Asset:
169
+ """Creates an Asset object from a TenableIOAsset object.
170
+
171
+ :param TenableIOAsset asset: The TenableIOAsset object to create an Asset from.
172
+ :param int ssp_id: The ID of the SSP associated with the Asset.
173
+ :param Application app: The Application object to use for database operations.
174
+ :return: The created Asset object.
175
+ :rtype: Asset
176
+ """
177
+ keys = ["last_seen", "last_scan_target", "acr_score", "exposure_score"]
178
+ meta = {key: asset.dict()[key] for key in keys}
179
+
180
+ return Asset(
181
+ otherTrackingNumber=asset.id,
182
+ tenableId=asset.id,
183
+ name=TenableIOAsset.get_asset_name(asset),
184
+ ipAddress=TenableIOAsset.get_asset_ip(asset),
185
+ awsIdentifier=asset.aws_ec2_name if asset.aws_ec2_name else None,
186
+ macAddress=asset.mac_addresses.pop() if asset.mac_addresses else None,
187
+ fqdn=asset.fqdns.pop() if asset.fqdns else None,
188
+ status="Active (On Network)" if asset.terminated_at is None else "Decommissioned",
189
+ assetCategory="Hardware",
190
+ assetOwnerId=app.config["userId"],
191
+ assetType="Other",
192
+ operatingSystem=TenableIOAsset.get_os_type(asset.operating_systems),
193
+ operatingSystemVersion=(asset.operating_systems.pop() if asset.operating_systems else None),
194
+ scanningTool=asset.sources.pop()["name"] if asset.sources else None,
195
+ notes=format_data_to_html(meta),
196
+ parentId=ssp_id,
197
+ parentModule="securityplans",
198
+ createdById=app.config["userId"],
199
+ )
200
+
201
+ @staticmethod
202
+ def update_existing_asset(asset: Asset, existing_assets: List[Asset]) -> Optional[Asset]:
203
+ """Updates an existing Asset object if it exists and if it has changed,
204
+ otherwise returns None
205
+
206
+ :param Asset asset: The Asset object to update.
207
+ :param List[Asset] existing_assets: A list of existing Asset objects to compare against.
208
+ :return: The updated Asset object if it has changed, otherwise None.
209
+ :rtype: Optional[Asset]
210
+ """
211
+ for existing in existing_assets:
212
+ if existing.tenableId == asset.otherTrackingNumber:
213
+ asset.id = existing.id
214
+ if asset != existing:
215
+ return asset
216
+ return None
217
+ return asset
218
+
219
+ @staticmethod
220
+ def prepare_assets_for_sync(
221
+ assets: List["TenableIOAsset"], ssp_id: int, existing_assets: List[Asset]
222
+ ) -> Tuple[List[Asset], List[Asset]]:
223
+ """Prepares Tenable assets for synchronization
224
+
225
+ :param List[TenableIOAsset] assets: A list of TenableIOAsset objects to prepare for synchronization.
226
+ :param int ssp_id: The ID of the SSP associated with the assets.
227
+ :param List[Asset] existing_assets: A list of existing Asset objects to compare against.
228
+ :return: A tuple containing two lists of Asset objects: new assets and updated assets.
229
+ :rtype: Tuple[List[Asset], List[Asset]]
230
+ """
231
+ app = Application()
232
+ insert_assets = []
233
+ update_assets = []
234
+
235
+ for asset in assets:
236
+ reg = TenableIOAsset.create_asset_from_tenable(asset, ssp_id, app)
237
+ updated_asset = TenableIOAsset.update_existing_asset(reg, existing_assets)
238
+ if reg.tenableId not in {ten.tenableId for ten in existing_assets}:
239
+ insert_assets.append(reg)
240
+ if updated_asset and reg.tenableId in {ten.tenableId for ten in existing_assets}:
241
+ update_assets.append(updated_asset)
242
+
243
+ return insert_assets, update_assets
244
+
245
+ @staticmethod
246
+ def sync_assets_to_regscale(insert_assets: List[Asset], update_assets: List[Asset]) -> None:
247
+ """Synchronizes assets to RegScale.
248
+
249
+ :param List[Asset] insert_assets: A list of Asset objects to insert.
250
+ :param List[Asset] update_assets: A list of Asset objects to update.
251
+ :rtype: None
252
+ """
253
+ if insert_assets:
254
+ Asset.batch_create(insert_assets)
255
+
256
+ if update_assets:
257
+ Asset.batch_update(update_assets)
258
+
259
+ @staticmethod
260
+ def sync_to_regscale(assets: List["TenableIOAsset"], ssp_id: int, existing_assets: List[Asset]) -> None:
261
+ """Synchronizes Tenable assets to RegScale
262
+
263
+ :param List[TenableIOAsset] assets: A list of TenableIOAsset objects to synchronize.
264
+ :param int ssp_id: The ID of the SSP associated with the assets.
265
+ :param List[Asset] existing_assets: A list of existing Asset objects to compare against.
266
+ :rtype: None
267
+ """
268
+ # Exports API will determine if the asset is off network, if so, it will be decommissioned in regscale
269
+ insert_assets, update_assets = TenableIOAsset.prepare_assets_for_sync(assets, ssp_id, existing_assets)
270
+ TenableIOAsset.sync_assets_to_regscale(insert_assets, update_assets)
271
+
272
+
273
+ class TenableBasicAsset(BaseModel):
274
+ """Basic Asset Class for Tenable
275
+
276
+ :param BaseModel: Pydantic Base Class
277
+ """
278
+
279
+ device_type: Optional[str] = None
280
+ hostname: Optional[str] = None
281
+ uuid: Optional[str] = None
282
+ ipv4: Optional[str] = None
283
+ mac_address: Optional[str] = None
284
+ netbios_name: Optional[str] = None
285
+ fqdn: Optional[str] = None
286
+ last_unauthenticated_results: Optional[datetime] = None
287
+ operating_system: Optional[List[str]] = None
288
+ network_id: Optional[str] = None
289
+ tracked: Optional[bool] = None
290
+
291
+
292
+ class TenableAsset(BaseModel):
293
+ """TenableAsset Model
294
+
295
+ :param BaseModel: Base Model
296
+ """
297
+
298
+ pluginID: str
299
+ severity: Severity
300
+ hasBeenMitigated: str
301
+ acceptRisk: str
302
+ recastRisk: str
303
+ ip: str
304
+ uuid: str
305
+ port: str
306
+ protocol: str
307
+ pluginName: str
308
+ firstSeen: str
309
+ lastSeen: str
310
+ exploitAvailable: str
311
+ exploitEase: str
312
+ exploitFrameworks: str
313
+ synopsis: str
314
+ description: str
315
+ solution: str
316
+ seeAlso: str
317
+ riskFactor: str
318
+ stigSeverity: str
319
+ vprScore: str
320
+ vprContext: str
321
+ baseScore: str
322
+ temporalScore: str
323
+ cvssVector: str
324
+ cvssV3BaseScore: str
325
+ cvssV3TemporalScore: str
326
+ cvssV3Vector: str
327
+ cpe: str
328
+ vulnPubDate: str
329
+ patchPubDate: str
330
+ pluginPubDate: str
331
+ pluginModDate: str
332
+ checkType: str
333
+ version: str
334
+ cve: str
335
+ bid: str
336
+ xref: str
337
+ pluginText: str
338
+ dnsName: str
339
+ macAddress: str
340
+ netbiosName: str
341
+ operatingSystem: str
342
+ ips: str
343
+ recastRiskRuleComment: str
344
+ acceptRiskRuleComment: str
345
+ hostUniqueness: str
346
+ acrScore: str
347
+ keyDrivers: str
348
+ uniqueness: str
349
+ family: Family
350
+ repository: Repository
351
+ pluginInfo: str
352
+ count: int = 0
353
+ dns: str = ""
354
+
355
+ @classmethod
356
+ def from_dict(cls, obj: Any) -> "TenableAsset":
357
+ """Dict to TenableAsset
358
+
359
+ :param Any obj: TenableAsset object as a dictionary
360
+ :return: TenableAsset object
361
+ :rtype: TenableAsset
362
+ """
363
+ obj["severity"] = Severity.from_dict(obj.get("severity"))
364
+ obj["family"] = Family.from_dict(obj.get("family"))
365
+ obj["repository"] = Repository.from_dict(obj.get("repository"))
366
+ return cls(**obj)
367
+
368
+ @staticmethod
369
+ def determine_os(os_string: str) -> str:
370
+ """
371
+ Determine RegScale friendly OS name
372
+
373
+ :param str os_string: String of the asset's OS
374
+ :return: RegScale acceptable OS
375
+ :rtype: str
376
+ """
377
+ linux_words = ["linux", "ubuntu", "hat", "centos", "rocky", "alma", "alpine"]
378
+ if re.compile("|".join(linux_words), re.IGNORECASE).search(os_string):
379
+ return "Linux"
380
+ elif (os_string.lower()).startswith("windows"):
381
+ return "Windows Server" if "server" in os_string else "Windows Desktop"
382
+ else:
383
+ return "Other"
384
+
385
+ # 'uniqueness': 'repositoryID,ip,dnsName'
386
+ def __hash__(self) -> hash:
387
+ """
388
+ Enable object to be hashable
389
+ :return: Hashed TenableAsset
390
+ :rtype: hash
391
+ """
392
+ return hash(str(self))
393
+
394
+ def __eq__(self, other: "TenableAsset") -> bool:
395
+ """
396
+ Update items in TenableAsset class
397
+ :param TenableAsset other: TenableAsset to compare
398
+ :return: Updated TenableAsset
399
+ :rtype: bool
400
+ """
401
+ return (
402
+ self.dnsName == other.dnsName
403
+ and self.macAddress == other.macAddress
404
+ and self.ip == other.ip
405
+ and self.repository.name == other.respository.name
406
+ )
407
+
408
+
409
+ class Reference(BaseModel):
410
+ """Reference Model
411
+
412
+ :param BaseModel: Base Model
413
+ """
414
+
415
+ framework: str
416
+ control: str
417
+
418
+
419
+ class AssetCheck(BaseModel):
420
+ """AssetCheck Model
421
+
422
+ :param BaseModel: Base Model
423
+ """
424
+
425
+ asset_uuid: str
426
+ first_seen: str
427
+ last_seen: str
428
+ audit_file: str
429
+ check_id: str
430
+ check_name: str
431
+ check_info: Optional[str] = None
432
+ expected_value: Optional[str] = None
433
+ actual_value: Optional[str] = None
434
+ status: str
435
+ reference: Optional[List[Reference]] = []
436
+ see_also: str
437
+ solution: Optional[str] = None
438
+ plugin_id: Optional[int] = None
439
+ state: str
440
+ description: str
441
+
442
+
443
+ class ExportStatus(Enum):
444
+ """ExportStatus Enum
445
+
446
+ :param Enum: Enum base class
447
+ """
448
+
449
+ PROCESSING = "PROCESSING"
450
+ FINISHED = "FINISHED"
451
+ READY = "READY"
452
+ CANCELLED = "CANCELLED"
453
+ ERROR = "ERROR"
454
+
455
+
456
+ class Plugin(BaseModel):
457
+ """Plugin Class for Tenable
458
+
459
+ :param BaseModel: Pydantic Base Class
460
+ """
461
+
462
+ checks_for_default_account: Optional[bool] = None
463
+ checks_for_malware: Optional[bool] = None
464
+ cvss3_base_score: Optional[float] = None
465
+ cvss3_temporal_score: Optional[float] = None
466
+ cvss_base_score: Optional[float] = None
467
+ cvss_temporal_score: Optional[float] = None
468
+ description: Optional[str] = None
469
+ exploit_available: Optional[bool] = None
470
+ exploit_framework_canvas: Optional[bool] = None
471
+ exploit_framework_core: Optional[bool] = None
472
+ exploit_framework_d2_elliot: Optional[bool] = None
473
+ exploit_framework_exploithub: Optional[bool] = None
474
+ exploit_framework_metasploit: Optional[bool] = None
475
+ exploited_by_malware: Optional[bool] = None
476
+ exploited_by_nessus: Optional[bool] = None
477
+ family: Optional[str] = None
478
+ family_id: Optional[int] = None
479
+ has_patch: Optional[bool] = None
480
+ id: Optional[int] = None
481
+ in_the_news: Optional[bool] = None
482
+ name: Optional[str] = None
483
+ modification_date: Optional[datetime] = None
484
+ publication_date: Optional[datetime] = None
485
+ risk_factor: Optional[str] = None
486
+ see_also: Optional[List[str]] = None
487
+ solution: Optional[str] = None
488
+ synopsis: Optional[str] = None
489
+ type: Optional[str] = None
490
+ unsupported_by_vendor: Optional[bool] = None
491
+ version: Optional[str] = None
492
+
493
+
494
+ class TenablePort(BaseModel):
495
+ """Tenable Port and Protocol
496
+
497
+ :param BaseModel: Pydantic Base Class
498
+ """
499
+
500
+ port: Optional[int]
501
+ protocol: Optional[str]
502
+
503
+
504
+ class TenableScan(BaseModel):
505
+ """Tenable Basic Scan class
506
+
507
+ :param BaseModel: Pydantic Base Class
508
+ """
509
+
510
+ completed_at: Optional[datetime] = None
511
+ schedule_uuid: Optional[str] = None
512
+ started_at: Optional[datetime] = None
513
+ uuid: Optional[str] = None