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
|
File without changes
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# pylint: disable=I1101, W0212
|
|
4
|
+
"""Functions used to interact with RegScale API"""
|
|
5
|
+
|
|
6
|
+
# standard imports
|
|
7
|
+
import io
|
|
8
|
+
import json
|
|
9
|
+
import pickle
|
|
10
|
+
import re
|
|
11
|
+
import tempfile
|
|
12
|
+
import time
|
|
13
|
+
import zipfile
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, List, Optional, Set, Tuple, Union
|
|
17
|
+
from xml.etree.ElementTree import Element
|
|
18
|
+
|
|
19
|
+
import psutil
|
|
20
|
+
import requests
|
|
21
|
+
from lxml import etree
|
|
22
|
+
|
|
23
|
+
from regscale.core.app.application import Application
|
|
24
|
+
from regscale.core.app.logz import create_logger
|
|
25
|
+
from regscale.core.app.utils.app_utils import convert_datetime_to_regscale_string, error_and_exit
|
|
26
|
+
from regscale.models.regscale_models.asset import Asset
|
|
27
|
+
from regscale.models.regscale_models.vulnerability import Vulnerability
|
|
28
|
+
|
|
29
|
+
logger = create_logger()
|
|
30
|
+
ARTIFACTS_PATH = Path.cwd() / "artifacts"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class IteratorConsumptionError(Exception):
|
|
34
|
+
"""
|
|
35
|
+
Exception raised when an error occurs while consuming an iterator
|
|
36
|
+
|
|
37
|
+
:param str message: Error message, defaults to "Error while consuming iterator"
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, message: str = "Error while consuming iterator"):
|
|
41
|
+
self.message = message
|
|
42
|
+
super().__init__(self.message)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def extract_version(cpe: str) -> Optional[Any]:
|
|
46
|
+
"""
|
|
47
|
+
Function returns version from CPE string
|
|
48
|
+
|
|
49
|
+
:param str cpe: CPE string
|
|
50
|
+
:return: version
|
|
51
|
+
:rtype: Optional[Any]
|
|
52
|
+
"""
|
|
53
|
+
match = re.search(r"\d+(\.\d+)*", cpe)
|
|
54
|
+
if match and len(match.group()) > 1:
|
|
55
|
+
return match.group()
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def determine_identifier(asset: Asset) -> str:
|
|
60
|
+
"""
|
|
61
|
+
Function returns asset identifier
|
|
62
|
+
|
|
63
|
+
:param Asset asset: RegScale Asset
|
|
64
|
+
:return: asset identifier
|
|
65
|
+
:rtype: str
|
|
66
|
+
"""
|
|
67
|
+
# Determine the identifier based on the following priority order.
|
|
68
|
+
# If the first attribute is not set, then the next attribute is checked, etc.
|
|
69
|
+
attributes_to_check = [
|
|
70
|
+
asset.name,
|
|
71
|
+
asset.fqdn,
|
|
72
|
+
asset.ipAddress,
|
|
73
|
+
asset.macAddress,
|
|
74
|
+
asset.awsIdentifier,
|
|
75
|
+
]
|
|
76
|
+
return next((attr for attr in attributes_to_check if attr), "")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def get_cpe_file(download: bool = False) -> Path:
|
|
80
|
+
"""
|
|
81
|
+
Function updates CPE file
|
|
82
|
+
|
|
83
|
+
:param bool download: Whether to download the file, defaults to False
|
|
84
|
+
:return: Path to CPE file
|
|
85
|
+
:rtype: Path
|
|
86
|
+
"""
|
|
87
|
+
url = "https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.2.xml.zip"
|
|
88
|
+
save_path = ARTIFACTS_PATH / "official-cpe-dictionary_v2.2.xml"
|
|
89
|
+
if not ARTIFACTS_PATH.exists():
|
|
90
|
+
ARTIFACTS_PATH.mkdir()
|
|
91
|
+
download = True
|
|
92
|
+
if not save_path.exists():
|
|
93
|
+
download = True
|
|
94
|
+
# Download file
|
|
95
|
+
if download:
|
|
96
|
+
# rm file if already exists
|
|
97
|
+
if save_path.exists():
|
|
98
|
+
save_path.unlink()
|
|
99
|
+
logger.info("Downloading CPE file from %s", url)
|
|
100
|
+
response = requests.get(url=url, timeout=60)
|
|
101
|
+
if response.status_code == 200:
|
|
102
|
+
with zipfile.ZipFile(io.BytesIO(response.content), "r") as zip_ref:
|
|
103
|
+
zip_ref.extractall(ARTIFACTS_PATH)
|
|
104
|
+
logger.info("File downloaded and extracted successfully to %s", ARTIFACTS_PATH)
|
|
105
|
+
else:
|
|
106
|
+
logger.error("Failed to download the file. Status code: %i", response.status_code)
|
|
107
|
+
return save_path
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def filter_severity(list_of_vulns: List[Vulnerability], minimum_severity: str) -> List[Vulnerability]:
|
|
111
|
+
"""
|
|
112
|
+
Filter out vulnerabilities based on a minimum severity level
|
|
113
|
+
|
|
114
|
+
:param List[Vulnerability] list_of_vulns: list of vulnerabilities
|
|
115
|
+
:param str minimum_severity: minimum severity level
|
|
116
|
+
:return: list of vulnerabilities
|
|
117
|
+
:rtype: List[Vulnerability]
|
|
118
|
+
"""
|
|
119
|
+
result_vulns = []
|
|
120
|
+
severities = {0: "low", 1: "moderate", 2: "high", 3: "critical"}
|
|
121
|
+
# select severity from severities by value
|
|
122
|
+
try:
|
|
123
|
+
val = next(severity for severity, value in severities.items() if value == minimum_severity)
|
|
124
|
+
except StopIteration:
|
|
125
|
+
logger.warning(
|
|
126
|
+
"Unable to get minimum_severity value from config value: %s, defaulting to low",
|
|
127
|
+
minimum_severity,
|
|
128
|
+
)
|
|
129
|
+
val = 0
|
|
130
|
+
for vuln in list_of_vulns:
|
|
131
|
+
vuln.severity = "moderate" if vuln.severity == "medium" else vuln.severity
|
|
132
|
+
try:
|
|
133
|
+
vuln_val = next(severity for severity, value in severities.items() if value == vuln.severity.lower())
|
|
134
|
+
except StopIteration:
|
|
135
|
+
logger.warning(
|
|
136
|
+
"Unable to get severity value from vulnerability: %s, defaulting to low",
|
|
137
|
+
vuln.severity,
|
|
138
|
+
)
|
|
139
|
+
if vuln_val >= val:
|
|
140
|
+
result_vulns.append(vuln)
|
|
141
|
+
return result_vulns
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def get_cpe_data() -> Tuple[etree._ElementTree, List[dict[Any, Any]]]:
|
|
145
|
+
"""
|
|
146
|
+
Get the CPE data
|
|
147
|
+
|
|
148
|
+
:return: CPE Root and CPE data
|
|
149
|
+
:rtype: Tuple[etree._ElementTree, List[dict[Any, Any]]]
|
|
150
|
+
"""
|
|
151
|
+
cpe_list = []
|
|
152
|
+
cpe_root = etree._ElementTree()
|
|
153
|
+
try:
|
|
154
|
+
cpe_root = etree.parse(get_cpe_file())
|
|
155
|
+
cpe_list = cpe_xml_to_dict(cpe_root)
|
|
156
|
+
except OSError:
|
|
157
|
+
error_and_exit("Error parsing CPE file, unable to access file.")
|
|
158
|
+
return cpe_root, cpe_list
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def get_min_cvss_score(severity: str) -> float:
|
|
162
|
+
"""
|
|
163
|
+
Get the minimum CVSS score for a given severity level
|
|
164
|
+
|
|
165
|
+
:param str severity: The severity level
|
|
166
|
+
:return: The minimum CVSS score
|
|
167
|
+
:rtype: float
|
|
168
|
+
"""
|
|
169
|
+
severity_levels = {
|
|
170
|
+
"critical": 9.9,
|
|
171
|
+
"high": 7.0,
|
|
172
|
+
"medium": 4.0,
|
|
173
|
+
"moderate": 4.0,
|
|
174
|
+
"low": 0.1,
|
|
175
|
+
"info": 0.0, # Assuming Info has a minimum value of 0
|
|
176
|
+
# You can add more severity levels if needed
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return severity_levels.get(severity, None)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def get_due_delta(app: Application, severity: str) -> int:
|
|
183
|
+
"""
|
|
184
|
+
Find the due delta from the config file
|
|
185
|
+
|
|
186
|
+
:param Application app: The app object
|
|
187
|
+
:param str severity: The severity level
|
|
188
|
+
:return: Due date delta
|
|
189
|
+
:rtype: int
|
|
190
|
+
"""
|
|
191
|
+
due_delta = app.config["issues"]["tenable"]["low"]
|
|
192
|
+
if severity.lower() in ["medium", "moderate"]:
|
|
193
|
+
due_delta = app.config["issues"]["tenable"]["moderate"]
|
|
194
|
+
elif severity.lower() == "high":
|
|
195
|
+
due_delta = app.config["issues"]["tenable"]["high"]
|
|
196
|
+
elif severity.lower() == "critical":
|
|
197
|
+
due_delta = app.config["issues"]["tenable"]["critical"]
|
|
198
|
+
return due_delta
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def determine_available_space() -> float:
|
|
202
|
+
"""
|
|
203
|
+
Determine if there is enough space to store the reports
|
|
204
|
+
|
|
205
|
+
:return: Available space in bytes for the temp directory
|
|
206
|
+
:rtype: float
|
|
207
|
+
"""
|
|
208
|
+
tmp_dir = tempfile.gettempdir()
|
|
209
|
+
available_space = psutil.disk_usage(tmp_dir).free
|
|
210
|
+
return available_space
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def determine_needed_space(vuln_list: List[dict], total_chunks: int) -> int:
|
|
214
|
+
"""
|
|
215
|
+
Determine the approximate size required to store Tenable IO data temporarily on temp disk.
|
|
216
|
+
|
|
217
|
+
:param List[dict] vuln_list: List of vulnerabilities
|
|
218
|
+
:param int total_chunks: Total number of chunks
|
|
219
|
+
:return: Rough size of all chunks in bytes
|
|
220
|
+
:rtype: int
|
|
221
|
+
"""
|
|
222
|
+
if not vuln_list:
|
|
223
|
+
# No list, you have an empty query
|
|
224
|
+
return 0
|
|
225
|
+
with tempfile.TemporaryFile() as temp_file:
|
|
226
|
+
# determine the size of the first chunk as a pickle
|
|
227
|
+
pickle.dump(vuln_list, temp_file)
|
|
228
|
+
# Get the size of the file in bytes
|
|
229
|
+
temp_file.seek(0, 2) # Seek to the end of the file
|
|
230
|
+
file_size = temp_file.tell()
|
|
231
|
+
logger.debug("1st Chunk File size: %s", file_size)
|
|
232
|
+
# file deletes on close
|
|
233
|
+
return total_chunks * file_size
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def get_minimum_severity(app: Application) -> str:
|
|
237
|
+
"""
|
|
238
|
+
Find the minimum severity level from the config file
|
|
239
|
+
|
|
240
|
+
:param Application app: The app object
|
|
241
|
+
:return: Minimum severity level
|
|
242
|
+
:rtype: str
|
|
243
|
+
"""
|
|
244
|
+
config = app.config
|
|
245
|
+
minimum_severity = "low"
|
|
246
|
+
if "tenableMinimumSeverityFilter" in config:
|
|
247
|
+
minimum_severity = app.config["tenableMinimumSeverityFilter"]
|
|
248
|
+
else:
|
|
249
|
+
# update config
|
|
250
|
+
config["tenableMinimumSeverityFilter"] = minimum_severity
|
|
251
|
+
app.save_config(config)
|
|
252
|
+
return minimum_severity
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def lookup_kev(cve: Optional[str], data: Optional[list[dict]] = None) -> Tuple[Any, Any]:
|
|
256
|
+
"""
|
|
257
|
+
Determine if the cve is part of the published CISA KEV list
|
|
258
|
+
|
|
259
|
+
:param Optional[str] cve: The CVE to lookup.
|
|
260
|
+
:param Optional[list[dict]] data: The KEV data, defaults to None
|
|
261
|
+
:return: A tuple containing the KEV data and the date.
|
|
262
|
+
:rtype: Tuple[Any, Any]
|
|
263
|
+
"""
|
|
264
|
+
kev_data = None
|
|
265
|
+
kev_date = None
|
|
266
|
+
if not cve:
|
|
267
|
+
return kev_data, kev_date
|
|
268
|
+
if data:
|
|
269
|
+
try:
|
|
270
|
+
# Update kev and date
|
|
271
|
+
kev_data = next(
|
|
272
|
+
dat
|
|
273
|
+
for dat in data["vulnerabilities"]
|
|
274
|
+
if "vulnerabilities" in data and cve and dat["cveID"].lower() == cve.lower()
|
|
275
|
+
)
|
|
276
|
+
except (StopIteration, ConnectionRefusedError):
|
|
277
|
+
kev_data = None
|
|
278
|
+
if kev_data:
|
|
279
|
+
# Convert YYYY-MM-DD to datetime
|
|
280
|
+
kev_date = convert_datetime_to_regscale_string(datetime.strptime(kev_data["dueDate"], "%Y-%m-%d"))
|
|
281
|
+
return kev_data, kev_date
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def cpe_xml_to_dict(cpe_root: etree._ElementTree) -> List[dict]:
|
|
285
|
+
"""
|
|
286
|
+
Function returns a dict of CPEs by name
|
|
287
|
+
|
|
288
|
+
:param etree._ElementTree cpe_root: cpe root element
|
|
289
|
+
:return: cpe_items
|
|
290
|
+
:rtype: List[dict]
|
|
291
|
+
"""
|
|
292
|
+
mitre_reference_ns = (
|
|
293
|
+
"{http://cpe.mitre.org/dictionary/2.0}references/{http://cpe.mitre.org/dictionary/2.0}reference"
|
|
294
|
+
)
|
|
295
|
+
cpe_items = []
|
|
296
|
+
# Create folder with Path
|
|
297
|
+
artifacts_path = Path.cwd() / "artifacts"
|
|
298
|
+
artifacts_path.mkdir(parents=True, exist_ok=True)
|
|
299
|
+
cpe_json = artifacts_path / "cpe_items.json"
|
|
300
|
+
if not cpe_json.exists():
|
|
301
|
+
logger.info("Creating cpe_items.json on initial run.")
|
|
302
|
+
for cpe_item in cpe_root.iterfind("{http://cpe.mitre.org/dictionary/2.0}cpe-item"):
|
|
303
|
+
name = cpe_item.get("name")
|
|
304
|
+
title = cpe_item.find("{http://cpe.mitre.org/dictionary/2.0}title").text
|
|
305
|
+
references = [ref.get("href") for ref in cpe_item.iterfind(mitre_reference_ns)]
|
|
306
|
+
cpe_items.append({"name": name, "title": title, "references": references})
|
|
307
|
+
with open(cpe_json, "w", encoding="utf-8") as file:
|
|
308
|
+
json.dump(cpe_items, file)
|
|
309
|
+
else:
|
|
310
|
+
logger.debug("Loading cpe_items.json")
|
|
311
|
+
with open(cpe_json, "r", encoding="utf-8") as file:
|
|
312
|
+
cpe_items = json.load(file)
|
|
313
|
+
return cpe_items
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def lookup_cpes_by_name(cpes: Set[dict], cpe_items: List[dict]) -> List[dict]:
|
|
317
|
+
"""
|
|
318
|
+
Function returns CPE items by name
|
|
319
|
+
|
|
320
|
+
:param Set[dict] cpes: set of CPE names
|
|
321
|
+
:param List[dict] cpe_items: list of cpe-item dicts
|
|
322
|
+
:return: CPE items
|
|
323
|
+
:rtype: List[dict]
|
|
324
|
+
"""
|
|
325
|
+
|
|
326
|
+
def gen_items():
|
|
327
|
+
"""
|
|
328
|
+
Generator function returns CPE items by name
|
|
329
|
+
|
|
330
|
+
"""
|
|
331
|
+
result = []
|
|
332
|
+
for cpe_item in cpe_items:
|
|
333
|
+
if cpe_item["name"] in cpes:
|
|
334
|
+
cpe_item["version"] = extract_version(cpe_item["name"])
|
|
335
|
+
result.append(cpe_item)
|
|
336
|
+
yield result
|
|
337
|
+
|
|
338
|
+
start = time.time()
|
|
339
|
+
gen = gen_items()
|
|
340
|
+
try:
|
|
341
|
+
results = next(gen)
|
|
342
|
+
except StopIteration:
|
|
343
|
+
results = None
|
|
344
|
+
if results:
|
|
345
|
+
end = time.time()
|
|
346
|
+
logger.debug("lookup_cpes_by_name() took %s seconds", end - start)
|
|
347
|
+
return results
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def lookup_cpe_item_by_name(name: str, cpe_items: List[dict]) -> Optional[dict]:
|
|
351
|
+
"""
|
|
352
|
+
Function returns CPE item by name
|
|
353
|
+
|
|
354
|
+
:param str name: CPE name
|
|
355
|
+
:param List[dict] cpe_items: list of cpe-item dicts
|
|
356
|
+
:return: CPE item
|
|
357
|
+
:rtype: Optional[dict]
|
|
358
|
+
"""
|
|
359
|
+
|
|
360
|
+
def gen_item():
|
|
361
|
+
"""
|
|
362
|
+
Generator function returns CPE item by name
|
|
363
|
+
|
|
364
|
+
"""
|
|
365
|
+
for cpe_item in cpe_items:
|
|
366
|
+
if name == cpe_item["name"]:
|
|
367
|
+
yield cpe_item
|
|
368
|
+
|
|
369
|
+
start = time.time()
|
|
370
|
+
# Generator
|
|
371
|
+
gen = gen_item()
|
|
372
|
+
try:
|
|
373
|
+
item = next(gen)
|
|
374
|
+
except StopIteration:
|
|
375
|
+
item = None
|
|
376
|
+
if item:
|
|
377
|
+
name = item["name"]
|
|
378
|
+
title = item["title"]
|
|
379
|
+
references = item["references"]
|
|
380
|
+
end = time.time()
|
|
381
|
+
logger.debug("lookup_cpe_item_by_name() took %s seconds", end - start)
|
|
382
|
+
return {
|
|
383
|
+
"Name": name,
|
|
384
|
+
"Title": title,
|
|
385
|
+
"References": references,
|
|
386
|
+
}
|
|
387
|
+
return item
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def software(cpe_items: List[dict], report_host: Element) -> List[dict]:
|
|
391
|
+
"""
|
|
392
|
+
Function returns software inventory from Nessus host
|
|
393
|
+
|
|
394
|
+
:param List[dict] cpe_items: the list of cpes
|
|
395
|
+
:param Element report_host: report host element
|
|
396
|
+
:return: inventory
|
|
397
|
+
:rtype: List[dict]
|
|
398
|
+
"""
|
|
399
|
+
start = time.time()
|
|
400
|
+
cpes = set()
|
|
401
|
+
for tag in report_host[0].iterfind("tag"):
|
|
402
|
+
tag_name = tag.get("name")
|
|
403
|
+
if re.findall("cpe", tag_name) and tag_name is not None:
|
|
404
|
+
cpe = (tag.text).split("->")[0].strip()
|
|
405
|
+
cpes.add(cpe)
|
|
406
|
+
inventory = lookup_cpes_by_name(cpes, cpe_items)
|
|
407
|
+
end = time.time()
|
|
408
|
+
logger.debug("software() took %s seconds", end - start)
|
|
409
|
+
|
|
410
|
+
return inventory
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def validate_nessus_severity(severity: str) -> str:
|
|
414
|
+
"""
|
|
415
|
+
Validate a Nessus severity
|
|
416
|
+
|
|
417
|
+
:param str severity: The nessus severity
|
|
418
|
+
:raises ValueError: If the tenableMinimumSeverityFilter severity is not valid
|
|
419
|
+
:return: The validated severity
|
|
420
|
+
:rtype: str
|
|
421
|
+
"""
|
|
422
|
+
if severity.lower() in ["info", "low", "medium", "high", "critical"]:
|
|
423
|
+
return severity
|
|
424
|
+
if severity.lower == "moderate":
|
|
425
|
+
return "medium"
|
|
426
|
+
raise ValueError(
|
|
427
|
+
"Invalid tenableMinimumSeverityFilter setting in the configuration. "
|
|
428
|
+
+ "Must be one of: low, medium, high, or critical"
|
|
429
|
+
)
|