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.
- regscale/__init__.py +1 -0
- regscale/airflow/__init__.py +9 -0
- regscale/airflow/azure/__init__.py +9 -0
- regscale/airflow/azure/cli.py +89 -0
- regscale/airflow/azure/upload_dags.py +116 -0
- regscale/airflow/click_dags.py +127 -0
- regscale/airflow/click_mixins.py +82 -0
- regscale/airflow/config.py +25 -0
- regscale/airflow/factories/__init__.py +0 -0
- regscale/airflow/factories/connections.py +58 -0
- regscale/airflow/factories/workflows.py +78 -0
- regscale/airflow/hierarchy.py +88 -0
- regscale/airflow/operators/__init__.py +0 -0
- regscale/airflow/operators/click.py +36 -0
- regscale/airflow/sensors/__init__.py +0 -0
- regscale/airflow/sensors/sql.py +107 -0
- regscale/airflow/sessions/__init__.py +0 -0
- regscale/airflow/sessions/sql/__init__.py +3 -0
- regscale/airflow/sessions/sql/queries.py +64 -0
- regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
- regscale/airflow/tasks/__init__.py +0 -0
- regscale/airflow/tasks/branches.py +22 -0
- regscale/airflow/tasks/cli.py +116 -0
- regscale/airflow/tasks/click.py +73 -0
- regscale/airflow/tasks/debugging.py +9 -0
- regscale/airflow/tasks/groups.py +116 -0
- regscale/airflow/tasks/init.py +60 -0
- regscale/airflow/tasks/states.py +47 -0
- regscale/airflow/tasks/workflows.py +36 -0
- regscale/ansible/__init__.py +9 -0
- regscale/core/__init__.py +0 -0
- regscale/core/app/__init__.py +3 -0
- regscale/core/app/api.py +571 -0
- regscale/core/app/application.py +665 -0
- regscale/core/app/internal/__init__.py +136 -0
- regscale/core/app/internal/admin_actions.py +230 -0
- regscale/core/app/internal/assessments_editor.py +873 -0
- regscale/core/app/internal/catalog.py +316 -0
- regscale/core/app/internal/comparison.py +459 -0
- regscale/core/app/internal/control_editor.py +571 -0
- regscale/core/app/internal/encrypt.py +79 -0
- regscale/core/app/internal/evidence.py +1240 -0
- regscale/core/app/internal/file_uploads.py +151 -0
- regscale/core/app/internal/healthcheck.py +66 -0
- regscale/core/app/internal/login.py +305 -0
- regscale/core/app/internal/migrations.py +240 -0
- regscale/core/app/internal/model_editor.py +1701 -0
- regscale/core/app/internal/poam_editor.py +632 -0
- regscale/core/app/internal/workflow.py +105 -0
- regscale/core/app/logz.py +74 -0
- regscale/core/app/utils/XMLIR.py +258 -0
- regscale/core/app/utils/__init__.py +0 -0
- regscale/core/app/utils/api_handler.py +358 -0
- regscale/core/app/utils/app_utils.py +1110 -0
- regscale/core/app/utils/catalog_utils/__init__.py +0 -0
- regscale/core/app/utils/catalog_utils/common.py +91 -0
- regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
- regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
- regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
- regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
- regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
- regscale/core/app/utils/file_utils.py +238 -0
- regscale/core/app/utils/parser_utils.py +81 -0
- regscale/core/app/utils/pickle_file_handler.py +57 -0
- regscale/core/app/utils/regscale_utils.py +319 -0
- regscale/core/app/utils/report_utils.py +119 -0
- regscale/core/app/utils/variables.py +226 -0
- regscale/core/decorators.py +31 -0
- regscale/core/lazy_group.py +65 -0
- regscale/core/login.py +63 -0
- regscale/core/server/__init__.py +0 -0
- regscale/core/server/flask_api.py +473 -0
- regscale/core/server/helpers.py +373 -0
- regscale/core/server/rest.py +64 -0
- regscale/core/server/static/css/bootstrap.css +6030 -0
- regscale/core/server/static/css/bootstrap.min.css +6 -0
- regscale/core/server/static/css/main.css +176 -0
- regscale/core/server/static/images/regscale-cli.svg +49 -0
- regscale/core/server/static/images/regscale.svg +38 -0
- regscale/core/server/templates/base.html +74 -0
- regscale/core/server/templates/index.html +43 -0
- regscale/core/server/templates/login.html +28 -0
- regscale/core/server/templates/make_base64.html +22 -0
- regscale/core/server/templates/upload_STIG.html +109 -0
- regscale/core/server/templates/upload_STIG_result.html +26 -0
- regscale/core/server/templates/upload_ssp.html +144 -0
- regscale/core/server/templates/upload_ssp_result.html +128 -0
- regscale/core/static/__init__.py +0 -0
- regscale/core/static/regex.py +14 -0
- regscale/core/utils/__init__.py +117 -0
- regscale/core/utils/click_utils.py +13 -0
- regscale/core/utils/date.py +238 -0
- regscale/core/utils/graphql.py +254 -0
- regscale/core/utils/urls.py +23 -0
- regscale/dev/__init__.py +6 -0
- regscale/dev/analysis.py +454 -0
- regscale/dev/cli.py +235 -0
- regscale/dev/code_gen.py +492 -0
- regscale/dev/dirs.py +69 -0
- regscale/dev/docs.py +384 -0
- regscale/dev/monitoring.py +26 -0
- regscale/dev/profiling.py +216 -0
- regscale/exceptions/__init__.py +4 -0
- regscale/exceptions/license_exception.py +7 -0
- regscale/exceptions/validation_exception.py +9 -0
- regscale/integrations/__init__.py +1 -0
- regscale/integrations/commercial/__init__.py +486 -0
- regscale/integrations/commercial/ad.py +433 -0
- regscale/integrations/commercial/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/common.py +106 -0
- regscale/integrations/commercial/aqua/__init__.py +0 -0
- regscale/integrations/commercial/aqua/aqua.py +91 -0
- regscale/integrations/commercial/aws/__init__.py +6 -0
- regscale/integrations/commercial/aws/cli.py +322 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
- regscale/integrations/commercial/aws/inventory/base.py +64 -0
- regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
- regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
- regscale/integrations/commercial/aws/scanner.py +823 -0
- regscale/integrations/commercial/azure/__init__.py +0 -0
- regscale/integrations/commercial/azure/common.py +32 -0
- regscale/integrations/commercial/azure/intune.py +488 -0
- regscale/integrations/commercial/azure/scanner.py +49 -0
- regscale/integrations/commercial/burp.py +78 -0
- regscale/integrations/commercial/cpe.py +144 -0
- regscale/integrations/commercial/crowdstrike.py +1117 -0
- regscale/integrations/commercial/defender.py +1511 -0
- regscale/integrations/commercial/dependabot.py +210 -0
- regscale/integrations/commercial/durosuite/__init__.py +0 -0
- regscale/integrations/commercial/durosuite/api.py +1546 -0
- regscale/integrations/commercial/durosuite/process_devices.py +101 -0
- regscale/integrations/commercial/durosuite/scanner.py +637 -0
- regscale/integrations/commercial/durosuite/variables.py +21 -0
- regscale/integrations/commercial/ecr.py +90 -0
- regscale/integrations/commercial/gcp/__init__.py +237 -0
- regscale/integrations/commercial/gcp/auth.py +96 -0
- regscale/integrations/commercial/gcp/control_tests.py +238 -0
- regscale/integrations/commercial/gcp/variables.py +18 -0
- regscale/integrations/commercial/gitlab.py +332 -0
- regscale/integrations/commercial/grype.py +165 -0
- regscale/integrations/commercial/ibm.py +90 -0
- regscale/integrations/commercial/import_all/__init__.py +0 -0
- regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
- regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
- regscale/integrations/commercial/jira.py +1046 -0
- regscale/integrations/commercial/mappings/__init__.py +0 -0
- regscale/integrations/commercial/mappings/csf_controls.json +713 -0
- regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
- regscale/integrations/commercial/nessus/__init__.py +0 -0
- regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
- regscale/integrations/commercial/nessus/scanner.py +416 -0
- regscale/integrations/commercial/nexpose.py +90 -0
- regscale/integrations/commercial/okta.py +798 -0
- regscale/integrations/commercial/opentext/__init__.py +0 -0
- regscale/integrations/commercial/opentext/click.py +99 -0
- regscale/integrations/commercial/opentext/scanner.py +143 -0
- regscale/integrations/commercial/prisma.py +91 -0
- regscale/integrations/commercial/qualys.py +1462 -0
- regscale/integrations/commercial/salesforce.py +980 -0
- regscale/integrations/commercial/sap/__init__.py +0 -0
- regscale/integrations/commercial/sap/click.py +31 -0
- regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
- regscale/integrations/commercial/sap/sysdig/click.py +57 -0
- regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
- regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
- regscale/integrations/commercial/sap/tenable/click.py +49 -0
- regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
- regscale/integrations/commercial/servicenow.py +1756 -0
- regscale/integrations/commercial/sicura/__init__.py +0 -0
- regscale/integrations/commercial/sicura/api.py +855 -0
- regscale/integrations/commercial/sicura/commands.py +73 -0
- regscale/integrations/commercial/sicura/scanner.py +481 -0
- regscale/integrations/commercial/sicura/variables.py +16 -0
- regscale/integrations/commercial/snyk.py +90 -0
- regscale/integrations/commercial/sonarcloud.py +260 -0
- regscale/integrations/commercial/sqlserver.py +369 -0
- regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
- regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
- regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
- regscale/integrations/commercial/stigv2/__init__.py +0 -0
- regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
- regscale/integrations/commercial/stigv2/click_commands.py +95 -0
- regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
- regscale/integrations/commercial/synqly/__init__.py +0 -0
- regscale/integrations/commercial/synqly/assets.py +46 -0
- regscale/integrations/commercial/synqly/ticketing.py +132 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
- regscale/integrations/commercial/synqly_jira.py +840 -0
- regscale/integrations/commercial/tenablev2/__init__.py +0 -0
- regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
- regscale/integrations/commercial/tenablev2/click.py +1584 -0
- regscale/integrations/commercial/tenablev2/scanner.py +504 -0
- regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
- regscale/integrations/commercial/tenablev2/utils.py +78 -0
- regscale/integrations/commercial/tenablev2/variables.py +17 -0
- regscale/integrations/commercial/trivy.py +162 -0
- regscale/integrations/commercial/veracode.py +96 -0
- regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
- regscale/integrations/commercial/wizv2/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/click.py +429 -0
- regscale/integrations/commercial/wizv2/constants.py +1001 -0
- regscale/integrations/commercial/wizv2/issue.py +361 -0
- regscale/integrations/commercial/wizv2/models.py +112 -0
- regscale/integrations/commercial/wizv2/parsers.py +339 -0
- regscale/integrations/commercial/wizv2/sbom.py +115 -0
- regscale/integrations/commercial/wizv2/scanner.py +416 -0
- regscale/integrations/commercial/wizv2/utils.py +796 -0
- regscale/integrations/commercial/wizv2/variables.py +39 -0
- regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
- regscale/integrations/commercial/xray.py +91 -0
- regscale/integrations/integration/__init__.py +2 -0
- regscale/integrations/integration/integration.py +26 -0
- regscale/integrations/integration/inventory.py +17 -0
- regscale/integrations/integration/issue.py +100 -0
- regscale/integrations/integration_override.py +149 -0
- regscale/integrations/public/__init__.py +103 -0
- regscale/integrations/public/cisa.py +641 -0
- regscale/integrations/public/criticality_updater.py +70 -0
- regscale/integrations/public/emass.py +411 -0
- regscale/integrations/public/emass_slcm_import.py +697 -0
- regscale/integrations/public/fedramp/__init__.py +0 -0
- regscale/integrations/public/fedramp/appendix_parser.py +548 -0
- regscale/integrations/public/fedramp/click.py +479 -0
- regscale/integrations/public/fedramp/components.py +714 -0
- regscale/integrations/public/fedramp/docx_parser.py +259 -0
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
- regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
- regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
- regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
- regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
- regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
- regscale/integrations/public/fedramp/import_workbook.py +495 -0
- regscale/integrations/public/fedramp/inventory_items.py +244 -0
- regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
- regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
- regscale/integrations/public/fedramp/mappings/user.py +175 -0
- regscale/integrations/public/fedramp/mappings/values.py +141 -0
- regscale/integrations/public/fedramp/markdown_parser.py +150 -0
- regscale/integrations/public/fedramp/metadata.py +689 -0
- regscale/integrations/public/fedramp/models/__init__.py +59 -0
- regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
- regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
- regscale/integrations/public/fedramp/parts_mapper.py +107 -0
- regscale/integrations/public/fedramp/poam/__init__.py +0 -0
- regscale/integrations/public/fedramp/poam/scanner.py +851 -0
- regscale/integrations/public/fedramp/properties.py +201 -0
- regscale/integrations/public/fedramp/reporting.py +84 -0
- regscale/integrations/public/fedramp/resources.py +496 -0
- regscale/integrations/public/fedramp/rosetta.py +110 -0
- regscale/integrations/public/fedramp/ssp_logger.py +87 -0
- regscale/integrations/public/fedramp/system_characteristics.py +922 -0
- regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
- regscale/integrations/public/fedramp/system_implementation.py +190 -0
- regscale/integrations/public/fedramp/xml_utils.py +87 -0
- regscale/integrations/public/nist_catalog.py +275 -0
- regscale/integrations/public/oscal.py +1946 -0
- regscale/integrations/public/otx.py +169 -0
- regscale/integrations/scanner_integration.py +2692 -0
- regscale/integrations/variables.py +25 -0
- regscale/models/__init__.py +7 -0
- regscale/models/app_models/__init__.py +5 -0
- regscale/models/app_models/catalog_compare.py +213 -0
- regscale/models/app_models/click.py +252 -0
- regscale/models/app_models/datetime_encoder.py +21 -0
- regscale/models/app_models/import_validater.py +321 -0
- regscale/models/app_models/mapping.py +260 -0
- regscale/models/app_models/pipeline.py +37 -0
- regscale/models/click_models.py +413 -0
- regscale/models/config.py +154 -0
- regscale/models/email_style.css +67 -0
- regscale/models/hierarchy.py +8 -0
- regscale/models/inspect_models.py +79 -0
- regscale/models/integration_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/inspector.py +262 -0
- regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
- regscale/models/integration_models/aqua.py +247 -0
- regscale/models/integration_models/azure_alerts.py +255 -0
- regscale/models/integration_models/base64.py +23 -0
- regscale/models/integration_models/burp.py +433 -0
- regscale/models/integration_models/burp_models.py +128 -0
- regscale/models/integration_models/cisa_kev_data.json +19333 -0
- regscale/models/integration_models/defender_data.py +93 -0
- regscale/models/integration_models/defenderimport.py +143 -0
- regscale/models/integration_models/drf.py +443 -0
- regscale/models/integration_models/ecr_models/__init__.py +0 -0
- regscale/models/integration_models/ecr_models/data.py +69 -0
- regscale/models/integration_models/ecr_models/ecr.py +239 -0
- regscale/models/integration_models/flat_file_importer.py +1079 -0
- regscale/models/integration_models/grype_import.py +247 -0
- regscale/models/integration_models/ibm.py +126 -0
- regscale/models/integration_models/implementation_results.py +85 -0
- regscale/models/integration_models/nexpose.py +140 -0
- regscale/models/integration_models/prisma.py +202 -0
- regscale/models/integration_models/qualys.py +720 -0
- regscale/models/integration_models/qualys_scanner.py +160 -0
- regscale/models/integration_models/sbom/__init__.py +0 -0
- regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
- regscale/models/integration_models/send_reminders.py +620 -0
- regscale/models/integration_models/snyk.py +155 -0
- regscale/models/integration_models/synqly_models/__init__.py +0 -0
- regscale/models/integration_models/synqly_models/capabilities.json +1 -0
- regscale/models/integration_models/synqly_models/connector_types.py +22 -0
- regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
- regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
- regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
- regscale/models/integration_models/synqly_models/param.py +72 -0
- regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
- regscale/models/integration_models/synqly_models/tenants.py +39 -0
- regscale/models/integration_models/tenable_models/__init__.py +0 -0
- regscale/models/integration_models/tenable_models/integration.py +187 -0
- regscale/models/integration_models/tenable_models/models.py +513 -0
- regscale/models/integration_models/trivy_import.py +231 -0
- regscale/models/integration_models/veracode.py +217 -0
- regscale/models/integration_models/xray.py +135 -0
- regscale/models/locking.py +100 -0
- regscale/models/platform.py +110 -0
- regscale/models/regscale_models/__init__.py +67 -0
- regscale/models/regscale_models/assessment.py +570 -0
- regscale/models/regscale_models/assessment_plan.py +52 -0
- regscale/models/regscale_models/asset.py +567 -0
- regscale/models/regscale_models/asset_mapping.py +190 -0
- regscale/models/regscale_models/case.py +42 -0
- regscale/models/regscale_models/catalog.py +261 -0
- regscale/models/regscale_models/cci.py +46 -0
- regscale/models/regscale_models/change.py +167 -0
- regscale/models/regscale_models/checklist.py +372 -0
- regscale/models/regscale_models/comment.py +49 -0
- regscale/models/regscale_models/compliance_settings.py +112 -0
- regscale/models/regscale_models/component.py +412 -0
- regscale/models/regscale_models/component_mapping.py +65 -0
- regscale/models/regscale_models/control.py +38 -0
- regscale/models/regscale_models/control_implementation.py +1128 -0
- regscale/models/regscale_models/control_objective.py +261 -0
- regscale/models/regscale_models/control_parameter.py +100 -0
- regscale/models/regscale_models/control_test.py +34 -0
- regscale/models/regscale_models/control_test_plan.py +75 -0
- regscale/models/regscale_models/control_test_result.py +52 -0
- regscale/models/regscale_models/custom_field.py +245 -0
- regscale/models/regscale_models/data.py +109 -0
- regscale/models/regscale_models/data_center.py +40 -0
- regscale/models/regscale_models/deviation.py +203 -0
- regscale/models/regscale_models/email.py +97 -0
- regscale/models/regscale_models/evidence.py +47 -0
- regscale/models/regscale_models/evidence_mapping.py +40 -0
- regscale/models/regscale_models/facility.py +59 -0
- regscale/models/regscale_models/file.py +382 -0
- regscale/models/regscale_models/filetag.py +37 -0
- regscale/models/regscale_models/form_field_value.py +94 -0
- regscale/models/regscale_models/group.py +169 -0
- regscale/models/regscale_models/implementation_objective.py +335 -0
- regscale/models/regscale_models/implementation_option.py +275 -0
- regscale/models/regscale_models/implementation_role.py +33 -0
- regscale/models/regscale_models/incident.py +177 -0
- regscale/models/regscale_models/interconnection.py +43 -0
- regscale/models/regscale_models/issue.py +1176 -0
- regscale/models/regscale_models/leveraged_authorization.py +125 -0
- regscale/models/regscale_models/line_of_inquiry.py +52 -0
- regscale/models/regscale_models/link.py +205 -0
- regscale/models/regscale_models/meta_data.py +64 -0
- regscale/models/regscale_models/mixins/__init__.py +0 -0
- regscale/models/regscale_models/mixins/parent_cache.py +124 -0
- regscale/models/regscale_models/module.py +224 -0
- regscale/models/regscale_models/modules.py +191 -0
- regscale/models/regscale_models/objective.py +14 -0
- regscale/models/regscale_models/parameter.py +87 -0
- regscale/models/regscale_models/ports_protocol.py +81 -0
- regscale/models/regscale_models/privacy.py +89 -0
- regscale/models/regscale_models/profile.py +50 -0
- regscale/models/regscale_models/profile_link.py +68 -0
- regscale/models/regscale_models/profile_mapping.py +124 -0
- regscale/models/regscale_models/project.py +63 -0
- regscale/models/regscale_models/property.py +278 -0
- regscale/models/regscale_models/question.py +85 -0
- regscale/models/regscale_models/questionnaire.py +87 -0
- regscale/models/regscale_models/questionnaire_instance.py +177 -0
- regscale/models/regscale_models/rbac.py +132 -0
- regscale/models/regscale_models/reference.py +86 -0
- regscale/models/regscale_models/regscale_model.py +1643 -0
- regscale/models/regscale_models/requirement.py +29 -0
- regscale/models/regscale_models/risk.py +274 -0
- regscale/models/regscale_models/sbom.py +54 -0
- regscale/models/regscale_models/scan_history.py +436 -0
- regscale/models/regscale_models/search.py +53 -0
- regscale/models/regscale_models/security_control.py +132 -0
- regscale/models/regscale_models/security_plan.py +204 -0
- regscale/models/regscale_models/software_inventory.py +159 -0
- regscale/models/regscale_models/stake_holder.py +64 -0
- regscale/models/regscale_models/stig.py +647 -0
- regscale/models/regscale_models/supply_chain.py +152 -0
- regscale/models/regscale_models/system_role.py +188 -0
- regscale/models/regscale_models/system_role_external_assignment.py +40 -0
- regscale/models/regscale_models/tag.py +37 -0
- regscale/models/regscale_models/tag_mapping.py +19 -0
- regscale/models/regscale_models/task.py +133 -0
- regscale/models/regscale_models/threat.py +196 -0
- regscale/models/regscale_models/user.py +175 -0
- regscale/models/regscale_models/user_group.py +55 -0
- regscale/models/regscale_models/vulnerability.py +242 -0
- regscale/models/regscale_models/vulnerability_mapping.py +162 -0
- regscale/models/regscale_models/workflow.py +55 -0
- regscale/models/regscale_models/workflow_action.py +34 -0
- regscale/models/regscale_models/workflow_instance.py +269 -0
- regscale/models/regscale_models/workflow_instance_step.py +114 -0
- regscale/models/regscale_models/workflow_template.py +58 -0
- regscale/models/regscale_models/workflow_template_step.py +45 -0
- regscale/regscale.py +815 -0
- regscale/utils/__init__.py +7 -0
- regscale/utils/b64conversion.py +14 -0
- regscale/utils/click_utils.py +118 -0
- regscale/utils/decorators.py +48 -0
- regscale/utils/dict_utils.py +59 -0
- regscale/utils/files.py +79 -0
- regscale/utils/fxns.py +30 -0
- regscale/utils/graphql_client.py +113 -0
- regscale/utils/lists.py +16 -0
- regscale/utils/numbers.py +12 -0
- regscale/utils/shell.py +148 -0
- regscale/utils/string.py +121 -0
- regscale/utils/synqly_utils.py +165 -0
- regscale/utils/threading/__init__.py +8 -0
- regscale/utils/threading/threadhandler.py +131 -0
- regscale/utils/threading/threadsafe_counter.py +47 -0
- regscale/utils/threading/threadsafe_dict.py +242 -0
- regscale/utils/threading/threadsafe_list.py +83 -0
- regscale/utils/version.py +104 -0
- regscale/validation/__init__.py +0 -0
- regscale/validation/address.py +37 -0
- regscale/validation/record.py +48 -0
- regscale/visualization/__init__.py +5 -0
- regscale/visualization/click.py +34 -0
- regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
- regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
- regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
- regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
- regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
- regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
- tests/fixtures/__init__.py +2 -0
- tests/fixtures/api.py +87 -0
- tests/fixtures/models.py +91 -0
- tests/fixtures/test_fixture.py +144 -0
- tests/mocks/__init__.py +0 -0
- tests/mocks/objects.py +3 -0
- tests/mocks/response.py +32 -0
- tests/mocks/xml.py +13 -0
- tests/regscale/__init__.py +0 -0
- tests/regscale/core/__init__.py +0 -0
- tests/regscale/core/test_api.py +232 -0
- tests/regscale/core/test_app.py +406 -0
- tests/regscale/core/test_login.py +37 -0
- tests/regscale/core/test_logz.py +66 -0
- tests/regscale/core/test_sbom_generator.py +87 -0
- tests/regscale/core/test_validation_utils.py +163 -0
- tests/regscale/core/test_version.py +78 -0
- tests/regscale/models/__init__.py +0 -0
- tests/regscale/models/test_asset.py +71 -0
- tests/regscale/models/test_config.py +26 -0
- tests/regscale/models/test_control_implementation.py +27 -0
- tests/regscale/models/test_import.py +97 -0
- tests/regscale/models/test_issue.py +36 -0
- tests/regscale/models/test_mapping.py +52 -0
- tests/regscale/models/test_platform.py +31 -0
- tests/regscale/models/test_regscale_model.py +346 -0
- tests/regscale/models/test_report.py +32 -0
- tests/regscale/models/test_tenable_integrations.py +118 -0
- tests/regscale/models/test_user_model.py +121 -0
- tests/regscale/test_about.py +19 -0
- 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
|