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,95 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
RegScale STIG Integration
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from regscale.integrations.commercial.stigv2.stig_integration import StigIntegration
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group(name="stigv2")
|
|
13
|
+
def stigv2():
|
|
14
|
+
"""STIG Integrations"""
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@stigv2.command(name="sync_findings")
|
|
18
|
+
@click.option(
|
|
19
|
+
"-p",
|
|
20
|
+
"--regscale_ssp_id",
|
|
21
|
+
type=click.INT,
|
|
22
|
+
help="The ID number from RegScale of the System Security Plan",
|
|
23
|
+
prompt="Enter RegScale System Security Plan ID",
|
|
24
|
+
required=True,
|
|
25
|
+
)
|
|
26
|
+
@click.option(
|
|
27
|
+
"-d",
|
|
28
|
+
"--stig_directory",
|
|
29
|
+
type=click.Path(),
|
|
30
|
+
help="The directory where STIG files are located",
|
|
31
|
+
prompt="Enter STIG directory",
|
|
32
|
+
required=True,
|
|
33
|
+
)
|
|
34
|
+
def sync_findings(regscale_ssp_id, stig_directory):
|
|
35
|
+
"""Sync GCP Findings to RegScale."""
|
|
36
|
+
StigIntegration.sync_findings(plan_id=regscale_ssp_id, path=stig_directory)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@stigv2.command(name="sync_assets")
|
|
40
|
+
@click.option(
|
|
41
|
+
"-p",
|
|
42
|
+
"--regscale_ssp_id",
|
|
43
|
+
type=click.INT,
|
|
44
|
+
help="The ID number from RegScale of the System Security Plan",
|
|
45
|
+
prompt="Enter RegScale System Security Plan ID",
|
|
46
|
+
required=True,
|
|
47
|
+
)
|
|
48
|
+
@click.option(
|
|
49
|
+
"-d",
|
|
50
|
+
"--stig_directory",
|
|
51
|
+
type=click.Path(),
|
|
52
|
+
help="The directory where STIG files are located",
|
|
53
|
+
prompt="Enter STIG directory",
|
|
54
|
+
required=True,
|
|
55
|
+
)
|
|
56
|
+
def sync_assets(regscale_ssp_id, stig_directory):
|
|
57
|
+
"""Sync GCP Assets to RegScale."""
|
|
58
|
+
StigIntegration.sync_assets(plan_id=regscale_ssp_id, path=stig_directory)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@stigv2.command(name="process_checklist")
|
|
62
|
+
@click.option(
|
|
63
|
+
"-p",
|
|
64
|
+
"--regscale_ssp_id",
|
|
65
|
+
type=click.INT,
|
|
66
|
+
help="The ID number from RegScale of the System Security Plan",
|
|
67
|
+
prompt="Enter RegScale System Security Plan ID",
|
|
68
|
+
required=True,
|
|
69
|
+
)
|
|
70
|
+
@click.option(
|
|
71
|
+
"-d",
|
|
72
|
+
"--stig_directory",
|
|
73
|
+
type=click.Path(),
|
|
74
|
+
help="The directory where STIG files are located",
|
|
75
|
+
prompt="Enter STIG directory",
|
|
76
|
+
required=True,
|
|
77
|
+
)
|
|
78
|
+
def process_checklist(regscale_ssp_id, stig_directory):
|
|
79
|
+
"""Process GCP Checklist."""
|
|
80
|
+
StigIntegration.sync_assets(plan_id=regscale_ssp_id, path=stig_directory)
|
|
81
|
+
StigIntegration.sync_findings(plan_id=regscale_ssp_id, path=stig_directory)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@stigv2.command(name="cci_assessment")
|
|
85
|
+
@click.option(
|
|
86
|
+
"-p",
|
|
87
|
+
"--regscale_ssp_id",
|
|
88
|
+
type=click.INT,
|
|
89
|
+
help="The ID number from RegScale of the System Security Plan",
|
|
90
|
+
prompt="Enter RegScale System Security Plan ID",
|
|
91
|
+
required=True,
|
|
92
|
+
)
|
|
93
|
+
def cci_assessment(regscale_ssp_id):
|
|
94
|
+
"""Run CCI Assessment."""
|
|
95
|
+
StigIntegration.cci_assessment(plan_id=regscale_ssp_id)
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
RegScale STIG Integration
|
|
5
|
+
"""
|
|
6
|
+
import datetime
|
|
7
|
+
from typing import Iterator, Optional, Generator
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from regscale.core.utils.date import date_str, days_from_today
|
|
12
|
+
from regscale.integrations.commercial.stigv2.ckl_parser import (
|
|
13
|
+
parse_checklist,
|
|
14
|
+
find_stig_files,
|
|
15
|
+
Checklist,
|
|
16
|
+
Vuln,
|
|
17
|
+
STIG,
|
|
18
|
+
)
|
|
19
|
+
from regscale.integrations.scanner_integration import (
|
|
20
|
+
logger,
|
|
21
|
+
ScannerIntegration,
|
|
22
|
+
ScannerIntegrationType,
|
|
23
|
+
)
|
|
24
|
+
from regscale.models import regscale_models
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class StigIntegration(ScannerIntegration):
|
|
28
|
+
options_map_assets_to_components = True
|
|
29
|
+
|
|
30
|
+
title = "STIG Integration"
|
|
31
|
+
asset_identifier_field = "fqdn"
|
|
32
|
+
type = ScannerIntegrationType.CHECKLIST
|
|
33
|
+
checklist_status_map = {
|
|
34
|
+
"NotAFinding": regscale_models.ChecklistStatus.PASS,
|
|
35
|
+
"Open": regscale_models.ChecklistStatus.FAIL,
|
|
36
|
+
}
|
|
37
|
+
finding_severity_map = {
|
|
38
|
+
"critical": regscale_models.IssueSeverity.Critical,
|
|
39
|
+
"high": regscale_models.IssueSeverity.High,
|
|
40
|
+
"medium": regscale_models.IssueSeverity.Moderate,
|
|
41
|
+
"low": regscale_models.IssueSeverity.Low,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
def fetch_findings(self, path: Path, **kwargs) -> Generator["IntegrationFinding", None, None]: # type: ignore
|
|
45
|
+
"""
|
|
46
|
+
Fetches GCP findings using the SecurityCenterClient
|
|
47
|
+
|
|
48
|
+
:param Path path: The path to the STIG files, defaults to None
|
|
49
|
+
:yields IntegrationFinding: An IntegrationFinding object for each finding
|
|
50
|
+
:return: A list of parsed findings
|
|
51
|
+
:rtype: Generator[IntegrationFinding, None, None]
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
logger.info("Fetching findings...")
|
|
55
|
+
stig_files = find_stig_files(path)
|
|
56
|
+
|
|
57
|
+
self.num_findings_to_process = 0
|
|
58
|
+
for stig_file in stig_files:
|
|
59
|
+
logger.info(f"Processing '{stig_file}'")
|
|
60
|
+
checklist = parse_checklist(stig_file)
|
|
61
|
+
logger.info(f"Found {len(checklist.stigs[0].vulns)} Vulnerabilities in '{stig_file}'")
|
|
62
|
+
for stig in checklist.stigs:
|
|
63
|
+
for vuln in stig.vulns:
|
|
64
|
+
for finding in self.process_vulnerabilities(checklist, vuln, stig):
|
|
65
|
+
self.num_findings_to_process += 1
|
|
66
|
+
yield finding
|
|
67
|
+
|
|
68
|
+
def process_vulnerabilities(
|
|
69
|
+
self, checklist: Checklist, vuln: Vuln, stig: STIG
|
|
70
|
+
) -> Generator["IntegrationFinding", None, None]:
|
|
71
|
+
"""
|
|
72
|
+
Processes vulnerabilities for each asset in the checklist.
|
|
73
|
+
|
|
74
|
+
Iterates through each asset in the provided checklist, extracts the asset identifier (host_fqdn),
|
|
75
|
+
and yields an IntegrationFinding for each vulnerability associated with the asset.
|
|
76
|
+
|
|
77
|
+
:param Checklist checklist: The checklist containing assets to process.
|
|
78
|
+
:param Vuln vuln: The vulnerability information to be processed.
|
|
79
|
+
:param STIG stig: The STIG information to be processed.
|
|
80
|
+
:return: An iterator of IntegrationFinding objects.
|
|
81
|
+
:rtype: Generator[IntegrationFinding, None, None]
|
|
82
|
+
:yields: An IntegrationFinding object for each asset in the checklist.
|
|
83
|
+
:ytype: IntegrationFinding
|
|
84
|
+
"""
|
|
85
|
+
for asset in checklist.assets:
|
|
86
|
+
asset_identifier = getattr(asset, "host_fqdn", None)
|
|
87
|
+
if not asset_identifier:
|
|
88
|
+
self.log_error(f"Failed to extract host_fqdn from Asset: {asset} and vuln from {vuln}")
|
|
89
|
+
continue
|
|
90
|
+
|
|
91
|
+
yield from self.create_integration_finding(asset_identifier, vuln, stig)
|
|
92
|
+
|
|
93
|
+
def create_integration_finding(
|
|
94
|
+
self, asset_identifier: str, vuln: Vuln, stig: STIG
|
|
95
|
+
) -> Generator["IntegrationFinding", None, None]:
|
|
96
|
+
"""
|
|
97
|
+
Creates an IntegrationFinding object from the provided asset identifier and vulnerability information.
|
|
98
|
+
|
|
99
|
+
:param str asset_identifier: The identifier of the asset associated with the finding.
|
|
100
|
+
:param Vuln vuln: The vulnerability information used to populate the finding.
|
|
101
|
+
:param STIG stig: The STIG information used to populate the finding.
|
|
102
|
+
:return: An iterator of IntegrationFinding objects populated with the provided information.
|
|
103
|
+
:rtype: Generator[IntegrationFinding, None, None]
|
|
104
|
+
:yields: An IntegrationFinding object for each asset in the checklist.
|
|
105
|
+
:ytype: IntegrationFinding
|
|
106
|
+
"""
|
|
107
|
+
from regscale.integrations.scanner_integration import IntegrationFinding
|
|
108
|
+
|
|
109
|
+
severity = self.get_finding_severity(vuln.severity)
|
|
110
|
+
due_date_map = {
|
|
111
|
+
regscale_models.IssueSeverity.Critical: date_str(days_from_today(30)),
|
|
112
|
+
regscale_models.IssueSeverity.High: date_str(days_from_today(60)),
|
|
113
|
+
regscale_models.IssueSeverity.Moderate: date_str(days_from_today(210)),
|
|
114
|
+
regscale_models.IssueSeverity.Low: date_str(days_from_today(364)),
|
|
115
|
+
}
|
|
116
|
+
if not vuln.cci_ref:
|
|
117
|
+
vuln.cci_ref = ["CCI-000366"]
|
|
118
|
+
|
|
119
|
+
for cci_ref in vuln.cci_ref:
|
|
120
|
+
yield IntegrationFinding(
|
|
121
|
+
asset_identifier=asset_identifier,
|
|
122
|
+
control_labels=[], # Determine how to populate this
|
|
123
|
+
title=f"{vuln.rule_title} {vuln.rule_ver} {stig.stig_info.releaseinfo} {vuln.vuln_num}",
|
|
124
|
+
issue_title=f"{vuln.rule_title} {vuln.rule_ver} {stig.stig_info.releaseinfo} {vuln.vuln_num}",
|
|
125
|
+
category=vuln.group_title,
|
|
126
|
+
severity=severity,
|
|
127
|
+
description=f"{vuln.check_content} {vuln.vuln_discuss} {vuln.fix_text}",
|
|
128
|
+
status=self.get_finding_status(vuln.status),
|
|
129
|
+
checklist_status=self.get_checklist_status(vuln.status),
|
|
130
|
+
external_id=f"{cci_ref}:{vuln.vuln_num}:{asset_identifier}",
|
|
131
|
+
vulnerability_number=vuln.vuln_num,
|
|
132
|
+
cci_ref=cci_ref,
|
|
133
|
+
rule_id=vuln.rule_id,
|
|
134
|
+
rule_version=vuln.rule_ver,
|
|
135
|
+
results=f"Vulnerability Number: {vuln.vuln_num}, Severity: {vuln.severity}, "
|
|
136
|
+
f"Rule Title: {vuln.rule_title}<br><br>Check Content: {vuln.check_content}<br><br>"
|
|
137
|
+
f"Fix Text: {vuln.fix_text}<br><br>STIG Reference: {vuln.stigref}<br><br>"
|
|
138
|
+
f"Vulnerability Discussion: {vuln.vuln_discuss}",
|
|
139
|
+
recommendation_for_mitigation=vuln.fix_text,
|
|
140
|
+
comments=vuln.comments,
|
|
141
|
+
poam_comments=vuln.finding_details,
|
|
142
|
+
date_created=date_str(datetime.datetime.now()),
|
|
143
|
+
due_date=due_date_map.get(severity, date_str(days_from_today(394))),
|
|
144
|
+
baseline=stig.baseline,
|
|
145
|
+
plugin_name=vuln.rule_id,
|
|
146
|
+
observations=vuln.finding_details or "",
|
|
147
|
+
gaps=vuln.check_content or "",
|
|
148
|
+
evidence=vuln.check_content or "",
|
|
149
|
+
impact=vuln.potential_impact or "",
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def fetch_assets(self, path: Optional[Path] = None) -> Iterator["IntegrationAsset"]:
|
|
153
|
+
"""
|
|
154
|
+
Fetches GCP assets using the AssetServiceClient
|
|
155
|
+
|
|
156
|
+
:param Optional[Path] path: The path to the STIG files, defaults to None
|
|
157
|
+
:raises ValueError: If no path is provided
|
|
158
|
+
:yield: An IntegrationAsset object representing an Assest extracted from a STIG file
|
|
159
|
+
:ytype: IntegrationAsset
|
|
160
|
+
:return: An iterator of parsed assets
|
|
161
|
+
:rtype: Iterator[IntegrationAsset]
|
|
162
|
+
"""
|
|
163
|
+
from regscale.integrations.scanner_integration import IntegrationAsset
|
|
164
|
+
|
|
165
|
+
if not path:
|
|
166
|
+
raise ValueError("Path to STIG files is required.")
|
|
167
|
+
logger.info("Fetching assets...")
|
|
168
|
+
stig_files = find_stig_files(path)
|
|
169
|
+
|
|
170
|
+
self.num_assets_to_process = len(stig_files)
|
|
171
|
+
|
|
172
|
+
loading_stig_files = self.asset_progress.add_task(
|
|
173
|
+
f"[#f8b737]Loading {len(stig_files)} STIG files.",
|
|
174
|
+
total=len(stig_files),
|
|
175
|
+
)
|
|
176
|
+
for stig_file in stig_files:
|
|
177
|
+
logger.info(f"Processing '{stig_file}'")
|
|
178
|
+
checklist = parse_checklist(stig_file)
|
|
179
|
+
for stig_asset in checklist.assets:
|
|
180
|
+
component_names = []
|
|
181
|
+
for stig in checklist.stigs:
|
|
182
|
+
component_names.append(stig.component_title)
|
|
183
|
+
|
|
184
|
+
if not stig_asset.host_name and not stig_asset.host_fqdn:
|
|
185
|
+
self.log_error(f"Failed to extract asset from {stig_asset}")
|
|
186
|
+
continue
|
|
187
|
+
|
|
188
|
+
yield IntegrationAsset(
|
|
189
|
+
name=stig_asset.host_name or stig_asset.host_fqdn,
|
|
190
|
+
ip_address=stig_asset.host_ip,
|
|
191
|
+
fqdn=stig_asset.host_fqdn or stig_asset.host_name,
|
|
192
|
+
identifier=stig_asset.host_fqdn,
|
|
193
|
+
asset_type=stig_asset.asset_type,
|
|
194
|
+
asset_owner_id=self.assessor_id,
|
|
195
|
+
parent_id=self.plan_id,
|
|
196
|
+
parent_module=regscale_models.SecurityPlan.get_module_slug(),
|
|
197
|
+
asset_category=regscale_models.AssetCategory.Hardware,
|
|
198
|
+
component_names=component_names,
|
|
199
|
+
# TODO: Determine correct component type
|
|
200
|
+
component_type=regscale_models.ComponentType.Hardware,
|
|
201
|
+
)
|
|
202
|
+
self.asset_progress.update(loading_stig_files, advance=1)
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# flake8: noqa E501
|
|
2
|
+
# pylint: disable=line-too-long
|
|
3
|
+
|
|
4
|
+
"""Assets connector commands for the RegScale CLI"""
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
from regscale.models import regscale_ssp_id
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@click.group()
|
|
11
|
+
def assets() -> None:
|
|
12
|
+
"""Assets connector commands for the RegScale CLI"""
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@assets.command(name="sync_armis_centrix")
|
|
17
|
+
@regscale_ssp_id()
|
|
18
|
+
def sync_armis_centrix(regscale_ssp_id: int) -> None:
|
|
19
|
+
"""Sync Assets from Armis Centrix to RegScale."""
|
|
20
|
+
from regscale.models.integration_models.synqly_models.connectors import Assets
|
|
21
|
+
|
|
22
|
+
assets_armis_centrix = Assets("armis_centrix")
|
|
23
|
+
assets_armis_centrix.run_sync(regscale_ssp_id=regscale_ssp_id)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@assets.command(name="sync_nozomi_vantage")
|
|
27
|
+
@regscale_ssp_id()
|
|
28
|
+
def sync_nozomi_vantage(regscale_ssp_id: int) -> None:
|
|
29
|
+
"""Sync Assets from Nozomi Vantage to RegScale."""
|
|
30
|
+
from regscale.models.integration_models.synqly_models.connectors import Assets
|
|
31
|
+
|
|
32
|
+
assets_nozomi_vantage = Assets("nozomi_vantage")
|
|
33
|
+
assets_nozomi_vantage.run_sync(regscale_ssp_id=regscale_ssp_id)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@assets.command(name="sync_servicenow")
|
|
37
|
+
@regscale_ssp_id()
|
|
38
|
+
def sync_servicenow(regscale_ssp_id: int) -> None:
|
|
39
|
+
"""Sync Assets from Servicenow to RegScale."""
|
|
40
|
+
from regscale.models.integration_models.synqly_models.connectors import Assets
|
|
41
|
+
|
|
42
|
+
assets_servicenow = Assets("servicenow")
|
|
43
|
+
assets_servicenow.run_sync(regscale_ssp_id=regscale_ssp_id)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# pylint: enable=line-too-long
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# flake8: noqa E501
|
|
2
|
+
# pylint: disable=line-too-long
|
|
3
|
+
|
|
4
|
+
"""Ticketing connector commands for the RegScale CLI"""
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
from regscale.models import regscale_id, regscale_module
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@click.group()
|
|
11
|
+
def ticketing() -> None:
|
|
12
|
+
"""Ticketing connector commands for the RegScale CLI"""
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@ticketing.command(name="sync_jira")
|
|
17
|
+
@regscale_id()
|
|
18
|
+
@regscale_module()
|
|
19
|
+
@click.option(
|
|
20
|
+
"--issue_type",
|
|
21
|
+
type=click.STRING,
|
|
22
|
+
help="jira issue type",
|
|
23
|
+
required=True,
|
|
24
|
+
prompt="jira issue type",
|
|
25
|
+
)
|
|
26
|
+
@click.option(
|
|
27
|
+
"--project",
|
|
28
|
+
type=click.STRING,
|
|
29
|
+
help="jira project",
|
|
30
|
+
required=True,
|
|
31
|
+
prompt="jira project",
|
|
32
|
+
)
|
|
33
|
+
@click.option(
|
|
34
|
+
"--default_project",
|
|
35
|
+
type=click.STRING,
|
|
36
|
+
help="Default Project for the integration.",
|
|
37
|
+
required=False,
|
|
38
|
+
)
|
|
39
|
+
@click.option(
|
|
40
|
+
"--sync_attachments",
|
|
41
|
+
type=click.BOOL,
|
|
42
|
+
help="Whether to sync attachments between Jira and RegScale",
|
|
43
|
+
required=False,
|
|
44
|
+
default=True,
|
|
45
|
+
)
|
|
46
|
+
def sync_jira(
|
|
47
|
+
regscale_id: int, regscale_module: str, issue_type: str, project: str, default_project: str, sync_attachments: bool
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Sync Ticketing data between Jira and RegScale."""
|
|
50
|
+
from regscale.models.integration_models.synqly_models.connectors import Ticketing
|
|
51
|
+
|
|
52
|
+
ticketing_jira = Ticketing("jira")
|
|
53
|
+
ticketing_jira.run_sync(
|
|
54
|
+
regscale_id=regscale_id,
|
|
55
|
+
regscale_module=regscale_module,
|
|
56
|
+
issue_type=issue_type,
|
|
57
|
+
project=project,
|
|
58
|
+
default_project=default_project,
|
|
59
|
+
sync_attachments=sync_attachments,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@ticketing.command(name="sync_pagerduty")
|
|
64
|
+
@regscale_id()
|
|
65
|
+
@regscale_module()
|
|
66
|
+
@click.option(
|
|
67
|
+
"--project",
|
|
68
|
+
type=click.STRING,
|
|
69
|
+
help="pagerduty project",
|
|
70
|
+
required=True,
|
|
71
|
+
prompt="pagerduty project",
|
|
72
|
+
)
|
|
73
|
+
@click.option(
|
|
74
|
+
"--name",
|
|
75
|
+
type=click.STRING,
|
|
76
|
+
help="pagerduty name",
|
|
77
|
+
required=True,
|
|
78
|
+
prompt="pagerduty name",
|
|
79
|
+
)
|
|
80
|
+
def sync_pagerduty(regscale_id: int, regscale_module: str, project: str, name: str) -> None:
|
|
81
|
+
"""Sync Ticketing data between Pagerduty and RegScale."""
|
|
82
|
+
from regscale.models.integration_models.synqly_models.connectors import Ticketing
|
|
83
|
+
|
|
84
|
+
ticketing_pagerduty = Ticketing("pagerduty")
|
|
85
|
+
ticketing_pagerduty.run_sync(regscale_id=regscale_id, regscale_module=regscale_module, project=project, name=name)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@ticketing.command(name="sync_servicenow")
|
|
89
|
+
@regscale_id()
|
|
90
|
+
@regscale_module()
|
|
91
|
+
@click.option(
|
|
92
|
+
"--issue_type",
|
|
93
|
+
type=click.STRING,
|
|
94
|
+
help="servicenow issue type",
|
|
95
|
+
required=True,
|
|
96
|
+
prompt="servicenow issue type",
|
|
97
|
+
)
|
|
98
|
+
@click.option(
|
|
99
|
+
"--default_project",
|
|
100
|
+
type=click.STRING,
|
|
101
|
+
help="Default Project for the integration. This maps to the custom table for tickets. This table should be derived from Incident table. If not provided, defaults to the incident table.",
|
|
102
|
+
required=False,
|
|
103
|
+
)
|
|
104
|
+
def sync_servicenow(regscale_id: int, regscale_module: str, issue_type: str, default_project: str) -> None:
|
|
105
|
+
"""Sync Ticketing data between Servicenow and RegScale."""
|
|
106
|
+
from regscale.models.integration_models.synqly_models.connectors import Ticketing
|
|
107
|
+
|
|
108
|
+
ticketing_servicenow = Ticketing("servicenow")
|
|
109
|
+
ticketing_servicenow.run_sync(
|
|
110
|
+
regscale_id=regscale_id, regscale_module=regscale_module, issue_type=issue_type, default_project=default_project
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@ticketing.command(name="sync_torq")
|
|
115
|
+
@regscale_id()
|
|
116
|
+
@regscale_module()
|
|
117
|
+
@click.option(
|
|
118
|
+
"--name",
|
|
119
|
+
type=click.STRING,
|
|
120
|
+
help="torq name",
|
|
121
|
+
required=True,
|
|
122
|
+
prompt="torq name",
|
|
123
|
+
)
|
|
124
|
+
def sync_torq(regscale_id: int, regscale_module: str, name: str) -> None:
|
|
125
|
+
"""Sync Ticketing data between Torq and RegScale."""
|
|
126
|
+
from regscale.models.integration_models.synqly_models.connectors import Ticketing
|
|
127
|
+
|
|
128
|
+
ticketing_torq = Ticketing("torq")
|
|
129
|
+
ticketing_torq.run_sync(regscale_id=regscale_id, regscale_module=regscale_module, name=name)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# pylint: enable=line-too-long
|