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,316 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Integrates catalog export, diagnose and compare into RegScale"""
|
|
4
|
+
# standard python imports
|
|
5
|
+
import os
|
|
6
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
import click
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from requests import Response
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
from rich.progress import Progress
|
|
14
|
+
from rich.table import Table
|
|
15
|
+
|
|
16
|
+
from regscale.core.app.application import Application
|
|
17
|
+
from regscale.core.app.utils.app_utils import check_file_path, error_and_exit
|
|
18
|
+
from regscale.core.app.utils.catalog_utils.compare_catalog import display_menu as start_compare
|
|
19
|
+
from regscale.core.app.utils.catalog_utils.diagnostic_catalog import display_menu as start_diagnostic
|
|
20
|
+
from regscale.core.app.utils.catalog_utils.download_catalog import display_menu, select_catalog
|
|
21
|
+
from regscale.core.app.utils.catalog_utils.update_catalog_v3 import display_menu as start_update
|
|
22
|
+
from regscale.core.app.utils.catalog_utils.update_catalog_v3 import import_catalog
|
|
23
|
+
from regscale.core.app.utils.catalog_utils.update_plans import sync_all_plans, sync_plan_controls
|
|
24
|
+
from regscale.models.regscale_models.catalog import Catalog
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@click.group()
|
|
28
|
+
def catalog():
|
|
29
|
+
"""Export, diagnose, and compare catalog from RegScale.com/regulations."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@catalog.command(name="sync_security_plans")
|
|
33
|
+
@click.option("--all", is_flag=True, help="Flag to sync all System Security Plans.")
|
|
34
|
+
@click.option("--plan_id", type=int, help="Sync a specific System Security Plan by ID #.")
|
|
35
|
+
@click.option("--dry_run", is_flag=True, help="Perform a dry run of the sync without making any changes.")
|
|
36
|
+
def sync_security_plans(all: bool, plan_id: int, dry_run: bool = False):
|
|
37
|
+
"""Sync security plans with the catalog."""
|
|
38
|
+
if all:
|
|
39
|
+
sync_all_plans(dry_run=dry_run)
|
|
40
|
+
elif plan_id:
|
|
41
|
+
sync_plan_controls(ssp_id=plan_id, dry_run=dry_run)
|
|
42
|
+
else:
|
|
43
|
+
click.echo(
|
|
44
|
+
"No valid option provided. Use '--all' to sync all plans or '--plan_id <id>' to sync a specific plan."
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@catalog.command(name="import")
|
|
49
|
+
@click.option(
|
|
50
|
+
"--catalog_path",
|
|
51
|
+
prompt="Enter the path of the Catalog file to import",
|
|
52
|
+
help="RegScale will load the Catalog",
|
|
53
|
+
type=click.Path(exists=True),
|
|
54
|
+
required=True,
|
|
55
|
+
)
|
|
56
|
+
def import_(catalog_path: str):
|
|
57
|
+
"""Import a catalog.json file into RegScale."""
|
|
58
|
+
console = Console()
|
|
59
|
+
res = import_catalog(Path(catalog_path))
|
|
60
|
+
dat = res.json()
|
|
61
|
+
if dat.get("success"):
|
|
62
|
+
console.print(
|
|
63
|
+
f"Catalog #{dat['catalogId']} imported successfully with {dat['importedItemCount']} " + "controls.",
|
|
64
|
+
style="bold green",
|
|
65
|
+
)
|
|
66
|
+
else:
|
|
67
|
+
console.print(res.json().get("message"), style="bold red")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@catalog.command(name="download")
|
|
71
|
+
@click.option("--show_menu", type=bool, default=True, help="Show menu of downloadable catalogs")
|
|
72
|
+
@click.option("--select", type=int, help="Select a single catalog to download")
|
|
73
|
+
@click.option("--download_all", is_flag=True, help="Download all catalogs")
|
|
74
|
+
def export(show_menu: bool, download_all: bool, select: int) -> None:
|
|
75
|
+
"""
|
|
76
|
+
Export catalog from RegScale.com/regulations.
|
|
77
|
+
"""
|
|
78
|
+
app = Application()
|
|
79
|
+
if select or download_all:
|
|
80
|
+
show_menu = False
|
|
81
|
+
max_index = display_menu(show_menu)
|
|
82
|
+
if download_all:
|
|
83
|
+
# Download every URL in the catalog
|
|
84
|
+
cat_range = range(1, max_index + 1)
|
|
85
|
+
downloaded_count = 0
|
|
86
|
+
# use threadpool executor to download all catalogs
|
|
87
|
+
with ThreadPoolExecutor(max_workers=20) as executor:
|
|
88
|
+
args = [(index, False) for index in cat_range]
|
|
89
|
+
with Progress() as progress:
|
|
90
|
+
task = progress.add_task(f"[cyan]Downloading {len(args)} catalogs...", total=len(args))
|
|
91
|
+
for cat, registry_item in executor.map(
|
|
92
|
+
lambda x: select_catalog(catalog_index=x[0], logging=x[1]), args
|
|
93
|
+
):
|
|
94
|
+
if isinstance(cat, dict):
|
|
95
|
+
downloaded_count += 1
|
|
96
|
+
else:
|
|
97
|
+
app.logger.debug(registry_item)
|
|
98
|
+
app.logger.error(f"Failed to download catalog: {registry_item['title']}")
|
|
99
|
+
progress.advance(task, 1)
|
|
100
|
+
app.logger.info(f"Successfully Downloaded {downloaded_count} catalogs.")
|
|
101
|
+
return
|
|
102
|
+
if not select:
|
|
103
|
+
select_catalog(catalog_index=0)
|
|
104
|
+
else:
|
|
105
|
+
select_catalog(catalog_index=select)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@catalog.command(name="diagnose", deprecated=True)
|
|
109
|
+
def diagnostic():
|
|
110
|
+
"""Diagnose catalog and output metadata."""
|
|
111
|
+
start_diagnostic()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@catalog.command(name="compare", deprecated=True)
|
|
115
|
+
def compare():
|
|
116
|
+
"""Run diagnostic and compare catalogs while reporting differences."""
|
|
117
|
+
start_compare()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@catalog.command(name="update", deprecated=True)
|
|
121
|
+
@click.option("--include_meta", is_flag=True, help="Include metadata in the import")
|
|
122
|
+
def update(include_meta: bool = False):
|
|
123
|
+
"""Update the catalog from RegScale.com/regulations."""
|
|
124
|
+
start_update(include_meta)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@catalog.command(name="check_for_updates")
|
|
128
|
+
@click.option("--catalog_id", type=int, help="Catalog ID to check for updates", required=False)
|
|
129
|
+
def check_for_updates(catalog_id: Optional[int] = None):
|
|
130
|
+
"""Check for updates to the catalog."""
|
|
131
|
+
gen_updatable_catalogs(catalog_id=catalog_id)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@catalog.command(name="update_via_platform")
|
|
135
|
+
def update_via_platform():
|
|
136
|
+
"""
|
|
137
|
+
[BETA] Update application instance catalog with new platform API(s).
|
|
138
|
+
"""
|
|
139
|
+
selected_id = get_selected_id()
|
|
140
|
+
res = get_update_report(selected_id)
|
|
141
|
+
handle_report(response=res)
|
|
142
|
+
update_catalog(selected_id)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def get_selected_id() -> int:
|
|
146
|
+
"""Get the selected catalog ID.
|
|
147
|
+
|
|
148
|
+
:return: Selected catalog ID
|
|
149
|
+
:rtype: int
|
|
150
|
+
"""
|
|
151
|
+
cats = {cat["id"]: cat for cat in Catalog.get_updatable_catalogs()}
|
|
152
|
+
existing_cats = [cat.id for cat in Catalog.get_list()]
|
|
153
|
+
selected_id = prompt_for_catalog("Please select catalog to update")
|
|
154
|
+
while selected_id not in cats:
|
|
155
|
+
message = "The catalog ID selected is not updatable, please try again."
|
|
156
|
+
# endless loop until a valid catalog is selected
|
|
157
|
+
if selected_id not in existing_cats:
|
|
158
|
+
message = "The catalog ID does not exist on this system."
|
|
159
|
+
selected_id = prompt_for_catalog(message)
|
|
160
|
+
return selected_id
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def get_update_report(selected_id: int) -> Response:
|
|
164
|
+
"""
|
|
165
|
+
Get the update report for the selected catalog.
|
|
166
|
+
|
|
167
|
+
:param int selected_id: Selected catalog ID
|
|
168
|
+
:return: Response object, new_catalog
|
|
169
|
+
:rtype: Response
|
|
170
|
+
"""
|
|
171
|
+
res = Catalog.get_update_report_for_catalog(catalog_id=selected_id)
|
|
172
|
+
return res
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def update_catalog(selected_id: int) -> None:
|
|
176
|
+
"""
|
|
177
|
+
Update the catalog.
|
|
178
|
+
|
|
179
|
+
:param int selected_id: Selected catalog ID
|
|
180
|
+
:return: None
|
|
181
|
+
:rtype: None
|
|
182
|
+
"""
|
|
183
|
+
app = Application()
|
|
184
|
+
val = click.prompt("Would you like to update the catalog? [Y/N]", type=str, default="N")
|
|
185
|
+
if val.lower().startswith("y"):
|
|
186
|
+
safety_prompt = click.prompt(
|
|
187
|
+
"Are you sure? This operation cannot be canceled or reversed! [Y/N]", type=str, default="N"
|
|
188
|
+
)
|
|
189
|
+
if safety_prompt.lower().startswith("y"):
|
|
190
|
+
app.logger.debug("Updating the catalog the easy way!")
|
|
191
|
+
res = Catalog.update_regscale_catalog(catalog_id=selected_id)
|
|
192
|
+
if isinstance(res, dict):
|
|
193
|
+
app.logger.info("Catalog updated successfully!")
|
|
194
|
+
return
|
|
195
|
+
message = res.reason + ", " + res.content.decode("utf-8") if res.content else res.reason
|
|
196
|
+
app.logger.error(f"Failed to update the catalog.\nStatus Code: {res.status_code}\nReason: {message}")
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def handle_report(response: Response) -> None:
|
|
200
|
+
"""Handle the report data.
|
|
201
|
+
|
|
202
|
+
:param Response response: Response object
|
|
203
|
+
:return: None
|
|
204
|
+
:rtype: None
|
|
205
|
+
"""
|
|
206
|
+
console = Console()
|
|
207
|
+
check_file_path("artifacts")
|
|
208
|
+
data_type = get_response_data_type(response)
|
|
209
|
+
|
|
210
|
+
if not response.ok:
|
|
211
|
+
error_and_exit(f"Failed to get the report: {response.text}")
|
|
212
|
+
file_ext = data_type.lower() if data_type in ["JSON", "CSV"] else error_and_exit("Unknown Report Type, exiting.")
|
|
213
|
+
save_path = Path(f"./artifacts/report.{file_ext}")
|
|
214
|
+
with open(save_path, "wb") as f:
|
|
215
|
+
f.write(response.content)
|
|
216
|
+
console.print(f"A Comparison Report saved to {save_path.absolute()}")
|
|
217
|
+
val = click.prompt("Press Y to view the report", type=str, default="N")
|
|
218
|
+
if val.lower().startswith("y"):
|
|
219
|
+
if data_type == "CSV":
|
|
220
|
+
view_csv_report(console, save_path)
|
|
221
|
+
else:
|
|
222
|
+
console.print(response.text)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def view_csv_report(console: Console, file_path: Path) -> None:
|
|
226
|
+
"""View the CSV report.
|
|
227
|
+
|
|
228
|
+
:param Console console: Console object
|
|
229
|
+
:param Path file_path: Path to the CSV file
|
|
230
|
+
:return: None
|
|
231
|
+
:rtype: None
|
|
232
|
+
"""
|
|
233
|
+
import csv
|
|
234
|
+
|
|
235
|
+
from rich.table import Table
|
|
236
|
+
|
|
237
|
+
# Create a table
|
|
238
|
+
table = Table(show_header=True)
|
|
239
|
+
max_rows = os.get_terminal_size().lines
|
|
240
|
+
# Open the CSV file
|
|
241
|
+
with open(file_path.absolute(), "r") as file:
|
|
242
|
+
csv_reader = csv.reader(file)
|
|
243
|
+
if sum(1 for _ in csv_reader) > max_rows:
|
|
244
|
+
console.print(
|
|
245
|
+
"Unable to view report, too many rows to display on console.\nOpen the file in a text editor."
|
|
246
|
+
)
|
|
247
|
+
return
|
|
248
|
+
headers = next(csv_reader) # Get the headers from the first line
|
|
249
|
+
|
|
250
|
+
# Add columns to the table
|
|
251
|
+
for header in headers:
|
|
252
|
+
table.add_column(header)
|
|
253
|
+
|
|
254
|
+
# Add rows to the table
|
|
255
|
+
for row in csv_reader:
|
|
256
|
+
table.add_row(*row)
|
|
257
|
+
|
|
258
|
+
# Print the table
|
|
259
|
+
console.print(table)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def get_response_data_type(response: Response) -> str:
|
|
263
|
+
"""
|
|
264
|
+
Get the data type of the response content
|
|
265
|
+
|
|
266
|
+
:param Response response: Response object
|
|
267
|
+
:return: Data type of the response content
|
|
268
|
+
:rtype: str
|
|
269
|
+
"""
|
|
270
|
+
content_type = response.headers.get("Content-Type")
|
|
271
|
+
|
|
272
|
+
if "application/json" in content_type:
|
|
273
|
+
return "JSON"
|
|
274
|
+
elif "text/csv" in content_type:
|
|
275
|
+
return "CSV"
|
|
276
|
+
else:
|
|
277
|
+
return "Unknown"
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def gen_updatable_catalogs(catalog_id: Optional[int] = None) -> list[dict]:
|
|
281
|
+
"""
|
|
282
|
+
Generate updatable catalogs.
|
|
283
|
+
|
|
284
|
+
:param Optional[int] catalog_id: Catalog ID, defaults to None
|
|
285
|
+
:return: List of updatable catalogs
|
|
286
|
+
:rtype: list[dict]
|
|
287
|
+
"""
|
|
288
|
+
console = Console()
|
|
289
|
+
cats = Catalog.get_updatable_catalogs()
|
|
290
|
+
# format nicely in rich table
|
|
291
|
+
table = Table(title="Updatable Catalogs")
|
|
292
|
+
table.add_column("Catalog ID")
|
|
293
|
+
table.add_column("Catalog Title")
|
|
294
|
+
if catalog_id:
|
|
295
|
+
cats = [cat for cat in cats if cat["id"] == catalog_id]
|
|
296
|
+
for cat in cats:
|
|
297
|
+
cat_id = cat["id"]
|
|
298
|
+
cat_title = cat["title"]
|
|
299
|
+
table.add_row(f"[yellow]{cat_id}", f"[green] {cat_title}")
|
|
300
|
+
if not cats:
|
|
301
|
+
console.print("No catalogs to update", style="yellow")
|
|
302
|
+
else:
|
|
303
|
+
console.print(table)
|
|
304
|
+
return cats
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def prompt_for_catalog(message: str) -> int:
|
|
308
|
+
"""
|
|
309
|
+
Prompt user for catalog ID
|
|
310
|
+
|
|
311
|
+
:param str message: Message to display to user
|
|
312
|
+
:return: Catalog ID
|
|
313
|
+
:rtype: int
|
|
314
|
+
"""
|
|
315
|
+
catalog_id = click.prompt(message, type=int)
|
|
316
|
+
return catalog_id
|