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,567 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """Model for a RegScale Asset"""
4
+ import logging
5
+ import warnings
6
+ from concurrent.futures import ThreadPoolExecutor
7
+ from enum import Enum
8
+ from typing import Any, List, Optional, Union, cast
9
+ from urllib.parse import urljoin
10
+
11
+ from pydantic import ConfigDict, Field
12
+ from requests import Response
13
+ from rich.progress import Progress
14
+
15
+ from regscale.core.app.api import Api
16
+ from regscale.core.app.utils.app_utils import get_current_datetime
17
+ from regscale.models.regscale_models.regscale_model import RegScaleModel, T
18
+ from regscale.models.regscale_models.search import Search
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class AssetStatus(str, Enum):
24
+ """Asset Status Enum"""
25
+
26
+ Active = "Active (On Network)"
27
+ Inactive = "Off-Network"
28
+ Decommissioned = "Decommissioned"
29
+
30
+ def __str__(self):
31
+ return self.value
32
+
33
+
34
+ class AssetCategory(str, Enum):
35
+ """Asset Category Enum"""
36
+
37
+ Hardware = "Hardware"
38
+ Software = "Software"
39
+
40
+ def __str__(self):
41
+ return self.value
42
+
43
+
44
+ class AssetType(str, Enum):
45
+ """Asset Type Enum"""
46
+
47
+ PhysicalServer = "Physical Server"
48
+ VM = "Virtual Machine (VM)"
49
+ Appliance = "Appliance"
50
+ NetworkRouter = "Network Router"
51
+ NetworkSwitch = "Network Switch"
52
+ Firewall = "Firewall"
53
+ Desktop = "Desktop"
54
+ Laptop = "Laptop"
55
+ Tablet = "Tablet"
56
+ Phone = "Phone"
57
+ Other = "Other"
58
+
59
+
60
+ class AssetOperatingSystem(str, Enum):
61
+ """Asset OperatingSystem System Enum"""
62
+
63
+ WindowsDesktop = "Windows Desktop"
64
+ WindowsServer = "Windows Server"
65
+ MacOSX = "Mac OSX"
66
+ Linux = "Linux"
67
+ Unix = "Unix"
68
+ OpenVMS = "Open VMS"
69
+ iOS = "iOS"
70
+ Android = "Android"
71
+ PaloAlto = "Palo Alto"
72
+ Other = "Other"
73
+
74
+
75
+ class Asset(RegScaleModel):
76
+ """Asset Model"""
77
+
78
+ _module_slug = "assets"
79
+ _unique_fields = [
80
+ ["otherTrackingNumber"],
81
+ ["fqdn"], # Try FQDN first as it's most reliable
82
+ ["name", "netBIOS"], # Then try name + NetBIOS
83
+ ["name", "ipAddress"], # Then try name + IP
84
+ ["ipAddress", "macAddress"], # Then IP + MAC
85
+ ["ipAddress"], # Then just IP
86
+ ]
87
+
88
+ _exclude_graphql_fields = ["extra_data", "tenantsId"]
89
+
90
+ id: int = 0 # Required
91
+ name: str # Required
92
+ assetType: Union[AssetType, str] # Required
93
+ status: Union[AssetStatus, str] # Required
94
+ assetCategory: Union[AssetCategory, str] # Required
95
+ otherTrackingNumber: Optional[str] = None
96
+ parentId: int = 0 # Required
97
+ parentModule: str = "" # Required
98
+ isPublic: bool = True # Required as Bool
99
+ assetOwnerId: str = Field(default_factory=RegScaleModel.get_user_id) # Required as string
100
+ dateCreated: str = Field(default_factory=get_current_datetime) # Required as string
101
+ dateLastUpdated: str = Field(default_factory=get_current_datetime) # Required as string
102
+ ram: Optional[int] = None
103
+ location: Optional[str] = None
104
+ diagramLevel: Optional[str] = None
105
+ cpu: Optional[int] = 0
106
+ description: Optional[str] = None
107
+ diskStorage: Optional[int] = 0
108
+ ipAddress: Optional[str] = None
109
+ macAddress: Optional[str] = None
110
+ manufacturer: Optional[str] = None
111
+ model: Optional[str] = None
112
+ osVersion: Optional[str] = None
113
+ operatingSystem: Optional[str] = None
114
+ uuid: Optional[str] = None
115
+ serialNumber: Optional[str] = None
116
+ createdById: Optional[str] = None
117
+ lastUpdatedById: Optional[str] = None
118
+ endOfLifeDate: Optional[str] = None
119
+ purchaseDate: Optional[str] = None
120
+ tenantsId: Optional[int] = None
121
+ facilityId: Optional[int] = None
122
+ orgId: Optional[int] = None
123
+ cmmcAssetType: Optional[str] = None
124
+ wizId: Optional[str] = None
125
+ wizInfo: Optional[str] = None
126
+ assetTagNumber: Optional[str] = None
127
+ baselineConfiguration: Optional[str] = None
128
+ fqdn: Optional[str] = None
129
+ netBIOS: Optional[str] = None
130
+ softwareName: Optional[str] = None
131
+ softwareVendor: Optional[str] = None
132
+ softwareVersion: Optional[str] = None
133
+ softwareAcronym: Optional[str] = None
134
+ vlanId: Optional[str] = None
135
+ bAuthenticatedScan: Optional[bool] = None
136
+ bPublicFacing: Optional[bool] = None
137
+ bVirtual: Optional[bool] = True
138
+ notes: Optional[str] = None
139
+ patchLevel: Optional[str] = None
140
+ softwareFunction: Optional[str] = None
141
+ systemAdministratorId: Optional[str] = None
142
+ bLatestScan: Optional[bool] = None
143
+ managementType: Optional[str] = None
144
+ qualysId: Optional[str] = None
145
+ sicuraId: Optional[Union[str, int]] = None
146
+ tenableId: Optional[str] = None
147
+ firmwareVersion: Optional[str] = None
148
+ purpose: Optional[str] = None
149
+ awsIdentifier: Optional[str] = None
150
+ azureIdentifier: Optional[str] = None
151
+ googleIdentifier: Optional[str] = None
152
+ otherCloudIdentifier: Optional[str] = None
153
+ iPv6Address: Optional[str] = None
154
+ scanningTool: Optional[str] = None
155
+ uri: Optional[str] = None
156
+ bScanDatabase: Optional[bool] = None
157
+ bScanInfrastructure: Optional[bool] = None
158
+ bScanWeb: Optional[bool] = None
159
+ cpe: Optional[str] = None
160
+ dadmsId: Optional[str] = None
161
+ approvalStatus: Optional[str] = None
162
+ processStatus: Optional[str] = None
163
+ networkApproval: Optional[str] = None
164
+ lastDateAllowed: Optional[str] = None
165
+ bFamAccepted: Optional[bool] = None
166
+ bExternallyAuthorized: Optional[bool] = None
167
+
168
+ @staticmethod
169
+ def _get_additional_endpoints() -> dict[str, str]:
170
+ """
171
+ Get additional endpoints for the Assets model.
172
+
173
+ :return: A dictionary of additional endpoints
174
+ :rtype: dict[str, str]
175
+ """
176
+ return {
177
+ "get_by_parent": "/api/{model_slug}/getAllByParent/{intParentID}/{strModule}",
178
+ "get_all_by_search": "/api/{model_slug}/getAllBySearch",
179
+ "drilldown": "/api/{model_slug}/drilldown/{strMonth}/{strCategory}",
180
+ "get_count": "/api/{model_slug}/getCount",
181
+ "graph": "/api/{model_slug}/graph",
182
+ "graph_by_date": "/api/{model_slug}/graphByDate/{strGroupBy}/{year}",
183
+ "filter_dashboard": "/api/{model_slug}/filterDashboard/{dtStart}/{dtEnd}",
184
+ "dashboard": "/api/{model_slug}/dashboard/{strGroupBy}",
185
+ "dashboard_by_parent": "/api/{model_slug}/dashboardByParent/{strGroupBy}/{intId}/{strModule}",
186
+ "schedule": "/api/{model_slug}/schedule/{year}/{dvar}",
187
+ "report": "/api/{model_slug}/report/{strReport}",
188
+ "filter_assets": "/api/{model_slug}/filterAssets",
189
+ "query_by_custom_field": "/api/{model_slug}/queryByCustomField/{strFieldName}/{strValue}",
190
+ "batch_create": "/api/{model_slug}/batchCreate",
191
+ "batch_update": "/api/{model_slug}/batchUpdate",
192
+ }
193
+
194
+ @classmethod
195
+ def get_map(cls, plan_id: int, key_field: str = "otherTrackingNumber") -> dict[str, "Asset"]:
196
+ """
197
+ Get the asset map for the asset and cache it in Redis.
198
+
199
+ :param int plan_id: Security Plan ID
200
+ :param str key_field: Key field to use, defaults to "identifier"
201
+ :return: Asset Map
202
+ :rtype: dict[str, "Asset"]
203
+ """
204
+ search_data = f"""query {{
205
+ assetMappings(skip: 0, take: 50, where: {{component: {{securityPlansId: {{eq: {plan_id}}} }} }}) {{
206
+ items {{
207
+ id
208
+ asset {{
209
+ {cls.build_graphql_fields()}
210
+ }}
211
+ }}
212
+ totalCount
213
+ pageInfo {{
214
+ hasNextPage
215
+ }}
216
+ }}
217
+ }}"""
218
+ response = cls._get_api_handler().graph(query=search_data)
219
+ assets = cast(List["Asset"], cls._handle_graph_response(response, child="asset"))
220
+ return_assets = {}
221
+ for asset in assets:
222
+ identifier = getattr(asset, key_field, None)
223
+ if identifier:
224
+ return_assets[identifier] = asset
225
+
226
+ return return_assets
227
+
228
+ # Legacy code
229
+
230
+ @classmethod
231
+ def find_os(cls, os_string: Optional[str] = None) -> str:
232
+ """
233
+ Determine the RegScale OS from a string.
234
+
235
+ :param Optional[str] os_string: String containing OS information or description, defaults to None
236
+ :return: RegScale compatible OS string
237
+ :rtype: str
238
+ """
239
+ if not os_string:
240
+ return "Other"
241
+ if "windows" in os_string.lower():
242
+ return "Windows Server"
243
+ elif any(sub_string in os_string.lower() for sub_string in ["linux", "ubuntu", "debian", "redhat", "suse"]):
244
+ return "Linux"
245
+ elif "mac" in os_string.lower():
246
+ return "Mac OSX"
247
+ else:
248
+ return "Other"
249
+
250
+ # 'uniqueness': 'ip, macaddress'
251
+ # Enable object to be hashable
252
+ def __hash__(self) -> int:
253
+ """
254
+ Enable object to be hashable
255
+
256
+ :return: Hashed Asset
257
+ :rtype: int
258
+ """
259
+ return hash(
260
+ (
261
+ self.name,
262
+ self.ipAddress,
263
+ self.macAddress.lower() if self.macAddress else None,
264
+ self.assetCategory,
265
+ self.assetType,
266
+ self.fqdn,
267
+ self.parentId,
268
+ self.parentModule,
269
+ self.description,
270
+ self.notes,
271
+ )
272
+ )
273
+
274
+ def __getitem__(self, key: Any) -> Any:
275
+ """
276
+ Get attribute from Pipeline
277
+
278
+ :param Any key: Key to get value of
279
+ :return: value of provided key
280
+ :rtype: Any
281
+ """
282
+ return getattr(self, key)
283
+
284
+ def __setitem__(self, key: Any, value: Any) -> None:
285
+ """
286
+ Set attribute in Pipeline with provided key
287
+
288
+ :param Any key: Key to change to provided value
289
+ :param Any value: New value for provided Key
290
+ :rtype: None
291
+ """
292
+ return setattr(self, key, value)
293
+
294
+ def __eq__(self, other: object) -> bool:
295
+ """
296
+ Compare two Asset objects for equality
297
+
298
+ :param object other: Object to compare with
299
+ :return: Whether the two assets are equal
300
+ :rtype: bool
301
+ """
302
+ if not isinstance(other, Asset):
303
+ return NotImplemented
304
+ return (
305
+ self.name == other.name
306
+ and self.ipAddress == other.ipAddress
307
+ and self.macAddress == other.macAddress
308
+ and self.wizId == other.wizId
309
+ and self.description == other.description
310
+ and self.notes == other.notes
311
+ and self.status == other.status
312
+ and self.parentId == other.parentId
313
+ and self.otherTrackingNumber == other.otherTrackingNumber
314
+ and self.parentModule == other.parentModule
315
+ )
316
+
317
+ @classmethod
318
+ def get_all_by_search(cls, search: Search) -> List[T]:
319
+ """
320
+ Get all assets by search
321
+
322
+ :param Search search: Search object
323
+ :return: List of Assets
324
+ :rtype: List[T]
325
+ """
326
+ return cls.get_all_by_parent(search=search, parent_module=search.module, parent_id=search.parentID)
327
+
328
+ @staticmethod
329
+ def bulk_insert(
330
+ assets: List["Asset"],
331
+ max_workers: int = 30,
332
+ batch_size: int = 100,
333
+ batch: bool = False,
334
+ ) -> List[Response]:
335
+ """
336
+ Bulk insert assets using the RegScale API and ThreadPoolExecutor
337
+
338
+ :param List[Asset] assets: Asset List
339
+ :param int max_workers: Max Workers, defaults to 30
340
+ :param int batch_size: Number of assets to insert per batch, defaults to 100
341
+ :param bool batch: Insert assets in batches, defaults to False
342
+ :return: List of Responses from RegScale
343
+ :rtype: List[Response]
344
+ """
345
+ warnings.warn(
346
+ "bulk_insert is deprecated and will be removed in a future version. Use batch_create instead.",
347
+ DeprecationWarning,
348
+ )
349
+ api = Api()
350
+ url = urljoin(api.config["domain"], "/api/assets/batchcreate")
351
+ results: List[Response] = []
352
+ if batch:
353
+ # Chunk list into batches
354
+ batches = [assets[i : i + batch_size] for i in range(0, len(assets), batch_size)]
355
+
356
+ with Progress() as progress:
357
+ total_task = progress.add_task("[red]Creating Total Assets", total=len(assets))
358
+ for my_batch in batches:
359
+ res = api.post(url=url, json=[asset.dict() for asset in my_batch])
360
+ if not res.ok:
361
+ logger.error(
362
+ "%i: %s\nError creating batch of assets: %s",
363
+ res.status_code,
364
+ res.text,
365
+ my_batch,
366
+ )
367
+ results.append(res)
368
+ progress.update(total_task, advance=len(my_batch))
369
+
370
+ return results
371
+ # Deprecated in favor of batch
372
+ else:
373
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
374
+ workers = [executor.submit(asset.create) for asset in assets]
375
+ return [worker.result() for worker in workers] or []
376
+
377
+ @staticmethod
378
+ def bulk_update(
379
+ assets: List["Asset"],
380
+ max_workers: int = 30,
381
+ batch_size: int = 100,
382
+ batch: bool = False,
383
+ ) -> List[Response]:
384
+ """Bulk insert assets using the RegScale API and ThreadPoolExecutor
385
+
386
+ :param List[Asset] assets: Asset List
387
+ :param int max_workers: Max Workers, defaults to 30
388
+ :param int batch_size: Number of assets to insert per batch, defaults to 100
389
+ :param bool batch: Insert assets in batches, defaults to False
390
+ :return: List of Responses from RegScale
391
+ :rtype: List[Response]
392
+ """
393
+ warnings.warn(
394
+ "bulk_update is deprecated and will be removed in a future version. Use batch_update instead.",
395
+ DeprecationWarning,
396
+ )
397
+ api = Api()
398
+ url = urljoin(api.config["domain"], "/api/assets/batchupdate")
399
+ results: List[Response] = []
400
+ if batch:
401
+ # Chunk list into batches
402
+ batches = [assets[i : i + batch_size] for i in range(0, len(assets), batch_size)]
403
+ with Progress() as progress:
404
+ total_task = progress.add_task("[red]Updating Total Assets", total=len(assets))
405
+ for my_batch in batches:
406
+ res = api.put(url=url, json=[asset.dict() for asset in my_batch])
407
+ if not res.ok:
408
+ logger.error(
409
+ "%i: %s\nError batch updating assets: %s",
410
+ res.status_code,
411
+ res.text,
412
+ my_batch,
413
+ )
414
+ results.append(res)
415
+ progress.update(total_task, advance=len(my_batch))
416
+ return results
417
+ else:
418
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
419
+ workers = [executor.submit(asset.save) for asset in assets]
420
+ return [worker.result() for worker in workers] or []
421
+
422
+ @classmethod
423
+ def get_sort_position_dict(cls) -> dict:
424
+ """
425
+ Overrides the base method.
426
+ :return: dict The sort position in the list of properties
427
+ :rtype: dict
428
+ """
429
+ return {
430
+ "id": 1,
431
+ "name": 2,
432
+ "assetType": 3,
433
+ "status": 4,
434
+ "assetCategory": 5,
435
+ "parentId": 6,
436
+ "parentModule": 7,
437
+ "isPublic": -1,
438
+ "ram": 8,
439
+ "assetOwnerId": 9,
440
+ "dateCreated": -1,
441
+ "dateLastUpdated": -1,
442
+ "location": 10,
443
+ "diagramLevel": 11,
444
+ "cpu": 12,
445
+ "description": 13,
446
+ "diskStorage": 14,
447
+ "ipAddress": 15,
448
+ "macAddress": 16,
449
+ "manufacturer": 17,
450
+ "model": 18,
451
+ "osVersion": 19,
452
+ "operatingSystem": 20,
453
+ "otherTrackingNumber": 21,
454
+ "uuid": -1,
455
+ "serialNumber": 22,
456
+ "createdById": -1,
457
+ "lastUpdatedById": -1,
458
+ "endOfLifeDate": 23,
459
+ "purchaseDate": 24,
460
+ "tenantsId": 25,
461
+ "facilityId": 26,
462
+ "orgId": 27,
463
+ "cmmcAssetType": 28,
464
+ "wizId": 29,
465
+ "wizInfo": 30,
466
+ "assetTagNumber": 31,
467
+ "baselineConfiguration": 32,
468
+ "fqdn": 33,
469
+ "netBIOS": 34,
470
+ "softwareName": 35,
471
+ "softwareVendor": 36,
472
+ "softwareVersion": 37,
473
+ "softwareAcronym": 38,
474
+ "vlanId": 39,
475
+ "bAuthenticatedScan": 40,
476
+ "bPublicFacing": 41,
477
+ "bVirtual": 42,
478
+ "notes": 43,
479
+ "patchLevel": 44,
480
+ "softwareFunction": 45,
481
+ "systemAdministratorId": 46,
482
+ "bLatestScan": 47,
483
+ "managementType": 48,
484
+ "qualysId": 49,
485
+ "sicuraId": 50,
486
+ "tenableId": 51,
487
+ "firmwareVersion": 52,
488
+ "purpose": 53,
489
+ "awsIdentifier": 54,
490
+ "azureIdentifier": 55,
491
+ "googleIdentifier": 56,
492
+ "otherCloudIdentifier": 57,
493
+ "ipv6Address": 58,
494
+ "scanningTool": 59,
495
+ "uri": 60,
496
+ "bScanDatabase": 61,
497
+ "bScanInfrastructure": 62,
498
+ "bScanWeb": 63,
499
+ "cpe": 64,
500
+ "dadmsId": 65,
501
+ "approvalStatus": 66,
502
+ "networkApproval": 67,
503
+ "lastDateAllowed": 68,
504
+ "bFamAccepted": 69,
505
+ "bExternallyAuthorized": 70,
506
+ }
507
+
508
+ @classmethod
509
+ def get_enum_values(cls, field_name: str) -> list:
510
+ """
511
+ Overrides the base method.
512
+ :param str field_name: The property name to provide enum values for
513
+ :return: list of strings
514
+ :rtype: list
515
+ """
516
+ optional_bools = [
517
+ "bLatestScan",
518
+ "bScanDatabase",
519
+ "bScanInfrastructure",
520
+ "bScanWeb",
521
+ "bFamAccepted",
522
+ "bExternallyAuthorized",
523
+ ]
524
+ if field_name == "assetType":
525
+ return [asset_type.value for asset_type in AssetType]
526
+ if field_name == "status":
527
+ return [status.value for status in AssetStatus]
528
+ if field_name == "assetCategory":
529
+ return [category.value for category in AssetCategory]
530
+ if field_name in optional_bools:
531
+ return ["", "TRUE", "FALSE"]
532
+ return cls.get_bool_enums(field_name)
533
+
534
+ @classmethod
535
+ def get_lookup_field(cls, field_name: str) -> str:
536
+ """
537
+ Overrides the base method.
538
+ :param str field_name: The property name to provide enum values for
539
+ :return: str the field name to look up
540
+ :rtype: str
541
+ """
542
+ lookup_fields = {
543
+ "assetOwnerId": "user",
544
+ "tenantsId": "",
545
+ "facilityId": "facilities",
546
+ "orgId": "organizations",
547
+ "wizId": "",
548
+ "vlanId": "",
549
+ "systemAdministratorId": "",
550
+ "qualysId": "",
551
+ "sicuraId": "",
552
+ "tenableId": "",
553
+ "dadmsId": "",
554
+ }
555
+ if field_name in lookup_fields.keys():
556
+ return lookup_fields[field_name]
557
+ return ""
558
+
559
+ @classmethod
560
+ def is_date_field(cls, field_name: str) -> bool:
561
+ """
562
+ Overrides the base method.
563
+ :param str field_name: The property name to provide enum values for
564
+ :return: bool if the field should be formatted as a date
565
+ :rtype: bool
566
+ """
567
+ return field_name in ["endOfLifeDate", "purchaseDate", "lastDateAllowed"]